Add rule to extract DESCRIPTION
[openmx:openmx.git] / Makefile
1 OPENMP = yes\r
2 export OPENMP\r
3 REXEC = R\r
4 export REXEC\r
5 \r
6 # --dsym is need for MacOS debug symbols\r
7 # --force-biarch is for Windows 64/32 fat binary packages\r
8 BUILDARGS = --force-biarch --dsym\r
9 \r
10 BUILDPRE = 2.0.1\r
11 BUILDNO = $(shell ./inst/tools/findBuildNum.sh)\r
12 TARGET = OpenMx_$(BUILDPRE)-$(BUILDNO).tar.gz \r
13 PDFFILE = build/OpenMx.pdf\r
14 DOCTESTGEN = inst/tools/docTestGenerator.sh\r
15 DOCTESTFILE = inst/tools/testDocs.R\r
16 ifdef CPUS\r
17    # snowfall\r
18    TESTFILE = inst/tools/parallelTestModels.R\r
19 else\r
20    TESTFILE = inst/tools/testModels.R\r
21 endif\r
22 RPROFTESTFILE = inst/tools/rprofTestModels.R\r
23 FAILTESTFILE = inst/tools/failTestModels.R\r
24 MEMORYTESTFILE = inst/tools/memoryTestModels.sh\r
25 GDBWRAP = $(shell if which gdb >/dev/null; then echo '-d gdb --debugger-args="--nx --batch --return-child-result --command util/gdb-where"'; fi)\r
26 \r
27 #INSTALLMAKEFLAGS="--debug=b"   #debug dependencies\r
28 #INSTALLMAKEFLAGS="-j 8"   #much faster compiles\r
29 \r
30 # subdirectories\r
31 RSOURCE = R\r
32 RDOCUMENTS = man\r
33 RDATA = data\r
34 \r
35 # file types\r
36 RFILES = $(wildcard R/*.R)\r
37 \r
38 help:\r
39         @echo "Please use \`make <target>' where <target> is one of"\r
40         @echo ""        \r
41         @echo "BUILDS"\r
42         @echo ""\r
43         @echo "  build         create an OpenMx binary for unix systems (no cross-compilation)"\r
44         @echo "  build-simple  create an OpenMx binary for unix systems without OpenMP"\r
45         @echo "  build32       create an OpenMx binary for i386 systems"\r
46         @echo "  build64       create an OpenMx binary for x86_64 systems"\r
47         @echo "  buildppc      create an OpenMx binary for ppc systems"\r
48         @echo "  srcbuild      create an OpenMx source release (alias for 'internal-build')"\r
49         @echo "  cran-check    build OpenMx without NPSOL and run CRAN check"\r
50         @echo "  cran-build    build OpenMx without NPSOL"\r
51         @echo ""                \r
52         @echo "INSTALL"\r
53         @echo ""        \r
54         @echo "  install       install OpenMx with NPSOL"\r
55         @echo "  cran-install  install OpenMx without NPSOL"\r
56         @echo ""\r
57         @echo "DOCUMENTATION"\r
58         @echo ""        \r
59         @echo "  pdf           create a pdf file (in build) of the OpenMx R documentation"\r
60         @echo "  html          create Sphinx documentation (in docs/build/html) in html format"\r
61         @echo "  doc.tar.bz2   create doc tarball suitable for our website"\r
62         @echo ""\r
63         @echo "TESTING"\r
64         @echo ""        \r
65         @echo "  test          run the test suite"\r
66         @echo "  test-failing  run the failing test collection"\r
67         @echo "  torture       run the test suite with gctorture(TRUE)"\r
68         @echo "  check         run the R package checking system on the OpenMx package"         \r
69         @echo "  nightly       run the nightly test suite"                      \r
70         @echo "  testdocs      test the examples in the Sphinx documentation"   \r
71         @echo "  failtest      run the failing test suite"\r
72         @echo "  memorytest    run the test suite under the Valgrind memory debugger"\r
73         @echo "  rproftest     run the test suite under the Rprof R profiler"\r
74         @echo ""\r
75         @echo "CLEANING"\r
76         @echo ""        \r
77         @echo "  clean      remove all files from the build directory"\r
78         @echo "  veryclean  remove all files from the build directory and all *~ files"\r
79         @echo "  autodep    regenerate src/autodep"\r
80 \r
81 r-libs-user-dir:\r
82         ./inst/tools/mk-r-libs-user-dir\r
83 \r
84 internal-build: build/$(TARGET)\r
85 \r
86 DESCRIPTION: DESCRIPTION.in\r
87         cat DESCRIPTION.in | sed -e "s/VERSION/$(BUILDPRE)/" | sed -e "s/SVN/$(BUILDNO)/" > DESCRIPTION\r
88 \r
89 dev-doc: DESCRIPTION\r
90         -./util/rox\r
91 \r
92 maybe-dev-doc:\r
93         -if ! grep -q 'Generated by roxygen2' man/*.Rd; then ./util/rox; fi\r
94 \r
95 build-prep: dev-doc\r
96         mkdir -p build\r
97 \r
98 code-style: $(RFILES) src/omxSymbolTable.h src/omxSymbolTable.cpp DESCRIPTION\r
99         @echo "Checking code style"\r
100         @if grep Rf_unprotect src/*.cpp; then echo "*** Rf_unprotect is error prone. Use ScopedProtect instead."; exit 1; fi\r
101         @if grep UNPROTECT src/*.cpp; then echo "*** UNPROTECT is error prone. Use ScopedProtect instead."; exit 1; fi\r
102         @if grep Rprintf src/*.cpp; then echo "*** Rprintf is not thread-safe. Use mxLog or mxLogBig."; exit 1; fi\r
103         @if [ `grep strncmp src/*.cpp | wc -l` -gt 0 ]; then echo "*** Use strEQ instead of strncmp."; exit 1; fi\r
104         @if [ `grep setFinalReturns src/*.cpp | wc -l` -gt 2 ]; then echo "*** setFinalReturns is deprecated. Use populateAttrFun or addOutput."; exit 1; fi\r
105         @if grep --color=always --exclude '*.rda' --exclude '.R*' -r "@" demo models; then echo '*** Access of @ slots must be done using $$'; fi\r
106 \r
107 npsol-prep: code-style maybe-dev-doc\r
108         rm -f inst/no-npsol\r
109         echo 'NPSOL_DIR= "..\inst"' > src/Makevars.win\r
110         echo 'NPSOL=-lnpsol$$(WIN) -L$$(NPSOL_DIR)' >> src/Makevars.win\r
111         echo 'NPSOL_LIBS=$$(NPSOL)' >> src/Makevars.win\r
112         cat src/Makevars.win.in >> src/Makevars.win\r
113         if ! grep -q 1 src/npsolswitch.h; then echo '#define HAS_NPSOL 1' > src/npsolswitch.h; fi\r
114         cp .Rbuildignore-npsol .Rbuildignore\r
115 \r
116 no-npsol-prep: code-style maybe-dev-doc\r
117         touch inst/no-npsol\r
118         if ! grep -q 0 src/npsolswitch.h; then echo '#define HAS_NPSOL 0' > src/npsolswitch.h; fi\r
119         echo 'NPSOL_LIBS=' > src/Makevars.win\r
120         cat src/Makevars.win.in >> src/Makevars.win\r
121         cp .Rbuildignore-cran .Rbuildignore\r
122 \r
123 build/$(TARGET): npsol-prep build-prep\r
124         cd build; $(REXEC) CMD build ..\r
125 \r
126 cran-build: no-npsol-prep build-prep\r
127         cd build && $(REXEC) CMD build ..\r
128 \r
129 cran-check: cran-build\r
130         tar ztf build/OpenMx_*.tar.gz\r
131         $(REXEC) CMD check build/OpenMx_*.tar.gz\r
132 \r
133 pdf: dev-doc\r
134         rm -rf $(PDFFILE); $(REXEC) CMD Rd2pdf --title="OpenMx Reference Manual" --output=$(PDFFILE) .\r
135         cd docs; make pdf\r
136 \r
137 src/omxSymbolTable.h: data/omxSymbolTable.tab inst/tools/genSymbolTableHeader.R\r
138         $(REXEC) --slave --vanilla -f inst/tools/genSymbolTableHeader.R  > src/omxSymbolTable.h\r
139 \r
140 src/omxSymbolTable.cpp: data/omxSymbolTable.tab inst/tools/genSymbolTableSource.R\r
141         $(REXEC) --slave --vanilla -f inst/tools/genSymbolTableSource.R  > src/omxSymbolTable.cpp\r
142 \r
143 html: npsol-prep build-prep dev-doc\r
144         cd build && R CMD INSTALL --html --no-libs --no-test-load --build ..\r
145         cd build && tar -zxf *gz\r
146         mv build/OpenMx/html/* docs/source/static/Rdoc\r
147         mv build/OpenMx/demo/* docs/source/static/demo\r
148         cd docs && make html\r
149         cd docs/build/html && perl -pi -e 's,http://openmx\.psyc\.virginia.edu/svn/trunk/demo/,_static/demo/,g' *.html\r
150         cd docs/build/html && perl -pi -e 's,\.R">_static/demo/,.R">,g' *.html\r
151 \r
152 doc.tar.bz2: html pdf\r
153         -rm -r build/$(BUILDPRE)-$(BUILDNO)\r
154         mkdir -p build/$(BUILDPRE)-$(BUILDNO)\r
155         mv docs/build/html/* build/$(BUILDPRE)-$(BUILDNO)\r
156         mv docs/build/latex/OpenMx.pdf build/$(BUILDPRE)-$(BUILDNO)/OpenMxUserGuide.pdf\r
157         mv build/OpenMx.pdf build/$(BUILDPRE)-$(BUILDNO)\r
158         cd build && tar jcf ../doc.tar.bz2 $(BUILDPRE)-$(BUILDNO)\r
159 \r
160 build: npsol-prep build-prep\r
161         cd build; $(REXEC) CMD INSTALL $(BUILDARGS) --build ..\r
162 \r
163 build-simple: npsol-prep build-prep\r
164         cd build; OPENMP=no $(REXEC) CMD INSTALL $(BUILDARGS) --build ..\r
165 \r
166 common-build32: internal-build\r
167         cd build; $(REXEC) --arch i386 CMD INSTALL $(BUILDARGS) --build $(TARGET)\r
168 \r
169 common-build64: internal-build\r
170         cd build; $(REXEC) --arch x86_64 CMD INSTALL $(BUILDARGS) --build $(TARGET)\r
171 \r
172 common-buildppc: internal-build\r
173         cd build; $(REXEC) --arch ppc CMD INSTALL $(BUILDARGS) --build $(TARGET)\r
174 \r
175 post-build:\r
176         rm -f build/$(TARGET)\r
177         cd build; gunzip *;\\r
178         tar --delete --file=`ls` OpenMx/npsol;\\r
179         gzip *.tar\r
180 \r
181 build32: common-build32 post-build\r
182 \r
183 build64: common-build64 post-build\r
184 \r
185 buildppc: common-buildppc post-build\r
186 \r
187 srcbuild: internal-build\r
188 \r
189 install: npsol-prep\r
190         MAKEFLAGS="$(INSTALLMAKEFLAGS)" $(REXEC) CMD INSTALL $(BUILDARGS) .\r
191 \r
192 cran-install: no-npsol-prep\r
193         MAKEFLAGS="$(INSTALLMAKEFLAGS)" $(REXEC) CMD INSTALL $(BUILDARGS) .\r
194 \r
195 check: internal-build\r
196         cd build; $(REXEC) CMD check $(TARGET)\r
197 \r
198 rproftest:\r
199         $(REXEC) --vanilla --slave < $(RPROFTESTFILE)\r
200 \r
201 testdocs:\r
202         $(DOCTESTGEN)\r
203         $(REXEC) --vanilla --slave < $(DOCTESTFILE)\r
204 \r
205 test:\r
206         $(REXEC) $(GDBWRAP) --vanilla --slave -f $(TESTFILE)\r
207 \r
208 test-failing:\r
209         $(REXEC) $(GDBWRAP) --vanilla --slave -f $(TESTFILE) --args failing\r
210 \r
211 test-lisrel:\r
212         $(REXEC) $(GDBWRAP) --vanilla --slave -f $(TESTFILE) --args lisrel\r
213 \r
214 test-csolnp:\r
215         IMX_OPT_ENGINE=CSOLNP $(REXEC) $(GDBWRAP) --vanilla --slave -f $(TESTFILE) --args csolnp\r
216 \r
217 torture:\r
218         $(REXEC) $(GDBWRAP) --vanilla --slave -f $(TESTFILE) --args gctorture\r
219 \r
220 nightly:\r
221         $(REXEC) $(GDBWRAP)  --vanilla --slave -f $(TESTFILE) --args nightly\r
222 \r
223 failtest:\r
224         $(REXEC) --vanilla --slave < $(FAILTESTFILE)\r
225 \r
226 memorytest:\r
227         $(MEMORYTESTFILE)\r
228 \r
229 autodep:\r
230         @echo "WARNING: These dependencies are not exact because they don't consider #defined CPP macros."\r
231         cd src && gcc -MM *.cpp | perl -pe 's,[^\s]+/RcppEigen/[^\s]+, ,g' | perl -pe 's,^\s*\\\n,,' | perl -pe 's,:,: Makevars.in,' > autodep\r
232 \r
233 clean:\r
234         mkdir -p build\r
235         -rm build/OpenMx_*.tar.gz\r
236         -rm src/*.o\r
237         -rm src/*.so\r
238         -rm src/*.dll\r
239         -rm DESCRIPTION\r
240         -rm runtimes.csv\r
241 \r
242 veryclean: clean\r
243         find . -name "*~" -exec rm -rf '{}' \;\r
244         -rm src/omxSymbolTable.*\r
245         -rm src/libnpsol.a\r
246         grep -l 'Generated by roxygen2' man/*.Rd | xargs rm -f\r