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