Do a slightly better job with 'make clean'
[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 RPDF = Rd2pdf
7 BUILDPRE = 999.0.0
8 BUILDNO = $(shell ./inst/tools/findBuildNum.sh)
9 TARGET = OpenMx_$(BUILDPRE)-$(BUILDNO).tar.gz 
10 PDFFILE = build/OpenMx.pdf
11 DOCTESTGEN = inst/tools/docTestGenerator.sh
12 DOCTESTFILE = inst/tools/testDocs.R
13 ifdef CPUS
14    # snowfall
15    TESTFILE = inst/tools/parallelTestModels.R
16 else
17    TESTFILE = inst/tools/testModels.R
18 endif
19 RPROFTESTFILE = inst/tools/rprofTestModels.R
20 FAILTESTFILE = inst/tools/failTestModels.R
21 MEMORYTESTFILE = inst/tools/memoryTestModels.sh
22 GDBWRAP = $(shell if which gdb >/dev/null; then echo '-d gdb --debugger-args="--nx --batch --return-child-result --command util/gdb-where"'; fi)
23
24 INSTALLMAKEFLAGS=""
25 #INSTALLMAKEFLAGS="--debug=b"   #debug dependencies
26 #INSTALLMAKEFLAGS="-j 8"   #much faster compiles
27
28 # subdirectories
29 RSOURCE = R
30 RDOCUMENTS = man
31 RDATA = data
32
33 # file types
34 RFILES = $(wildcard R/*.R)
35
36 help:
37         @echo "Please use \`make <target>' where <target> is one of"
38         @echo ""        
39         @echo "BUILDS"
40         @echo ""
41         @echo "  build         create an OpenMx binary for unix systems (no cross-compilation)"
42         @echo "  build-simple  create an OpenMx binary for unix systems without OpenMP"
43         @echo "  build32       create an OpenMx binary for i386 systems"
44         @echo "  build64       create an OpenMx binary for x86_64 systems"
45         @echo "  buildppc      create an OpenMx binary for ppc systems"
46         @echo "  srcbuild      create an OpenMx source release (alias for 'internal-build')"
47         @echo "  winbuild      create an OpenMx binary on windows systems (no cross-compilation)"
48         @echo "  winbuild-biarch  create an OpenMx binary for [32|64] bit windows systems"
49         @echo "  cran-check    build OpenMx without NPSOL and run CRAN check"
50         @echo "  cran-build    build OpenMx without NPSOL"
51         @echo "  cran-winbuild build OpenMx without NPSOL and build a binary package"
52         @echo ""                
53         @echo "INSTALL"
54         @echo ""        
55         @echo "  install       install OpenMx with NPSOL"
56         @echo "  cran-install  install OpenMx without NPSOL"
57         @echo ""
58         @echo "DOCUMENTATION"
59         @echo ""        
60         @echo "  pdf           create a pdf file (in build) of the OpenMx R documentation"
61         @echo "  html          create Sphinx documentation (in docs/build/html) in html format"
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/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:
133         rm -rf $(PDFFILE); $(REXEC) CMD $(RPDF) --title="OpenMx Reference Manual" --output=$(PDFFILE) .
134         cd docs; make latex; cd build/latex; make all-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: internal-build
143         cd build; $(REXEC) CMD INSTALL --html --build $(TARGET)
144         rm -f build/$(TARGET)
145         cd build; tar -zxf *gz
146         mv build/OpenMx/html build/html
147         mv build/OpenMx/demo build/demo
148         cp build/html/* docs/source/static/Rdoc
149         cp build/demo/* docs/source/static/demo
150         cd docs; make clean; make html
151
152 build: clean npsol-prep build-prep
153         cd build; $(REXEC) CMD INSTALL $(BUILDARGS) --build ..
154
155 build-simple: clean npsol-prep build-prep
156         cd build; OPENMP=no $(REXEC) CMD INSTALL $(BUILDARGS) --build ..
157
158 common-build32: clean internal-build
159         cd build; $(REXEC) --arch i386 CMD INSTALL $(BUILDARGS) --build $(TARGET)
160
161 common-build64: clean internal-build
162         cd build; $(REXEC) --arch x86_64 CMD INSTALL $(BUILDARGS) --build $(TARGET)
163
164 common-buildppc: clean internal-build
165         cd build; $(REXEC) --arch ppc CMD INSTALL $(BUILDARGS) --build $(TARGET)
166
167 post-build:
168         rm -f build/$(TARGET)
169         cd build; gunzip *;\
170         tar --delete --file=`ls` OpenMx/npsol;\
171         gzip *.tar
172
173 build32: common-build32 post-build
174
175 build64: common-build64 post-build
176
177 buildppc: common-buildppc post-build
178
179 srcbuild: clean internal-build
180
181 winbuild: common-build
182
183 winbuild-biarch: build-prep
184         cd build; $(REXEC) CMD INSTALL --force-biarch --build $(TARGET)
185
186 install: npsol-prep
187         MAKEFLAGS=$(INSTALLMAKEFLAGS) $(REXEC) CMD INSTALL $(BUILDARGS) .
188
189 cran-install: no-npsol-prep
190         MAKEFLAGS=$(INSTALLMAKEFLAGS) $(REXEC) CMD INSTALL $(BUILDARGS) .
191
192 check: internal-build
193         cd build; $(REXEC) CMD check $(TARGET)
194
195 rproftest:
196         $(REXEC) --vanilla --slave < $(RPROFTESTFILE)
197
198 testdocs:
199         $(DOCTESTGEN)
200         $(REXEC) --vanilla --slave < $(DOCTESTFILE)
201
202 test:
203         $(REXEC) $(GDBWRAP) --vanilla --slave -f $(TESTFILE)
204
205 test-lisrel:
206         $(REXEC) $(GDBWRAP) --vanilla --slave -f $(TESTFILE) --args lisrel
207
208 test-csolnp:
209         IMX_OPT_ENGINE=CSOLNP $(REXEC) $(GDBWRAP) --vanilla --slave -f $(TESTFILE) --args csolnp
210
211 torture:
212         $(REXEC) $(GDBWRAP) --vanilla --slave -f $(TESTFILE) --args gctorture
213
214 nightly:
215         $(REXEC) $(GDBWRAP)  --vanilla --slave -f $(TESTFILE) --args nightly
216
217 failtest:
218         $(REXEC) --vanilla --slave < $(FAILTESTFILE)
219
220 memorytest:
221         $(MEMORYTESTFILE)
222
223 autodep:
224         @echo "WARNING: These dependencies are not exact because they don't consider #defined CPP macros."
225         cd src && gcc -MM *.cpp | perl -pe 's,\b(unsupported/)?Eigen[^\s]+, ,g' | perl -pe 's,^\s*\\\n,,' | perl -pe 's,:,: Makevars.in,' > autodep
226
227 clean:
228         -rm build/OpenMx_*.tar.gz
229         -rm src/*.o
230         -rm src/*.so
231         -rm DESCRIPTION
232         -rm runtimes.csv
233
234 veryclean: clean
235         find . -name "*~" -exec rm -rf '{}' \;
236         -rm src/omxSymbolTable.*
237         -rm src/libnpsol.a
238         grep -l 'Generated by roxygen2' man/*.Rd | xargs rm -f