Add dependencies to the C/C++ compile
[openmx:openmx.git] / Makefile
1 REXEC = R
2 RCOMMAND = CMD
3 RBUILD = build
4 RINSTALL = INSTALL
5 BUILDARGS = --dsym  # need for MacOS debug symbols
6 RCHECK = check
7 RPDF = Rd2pdf
8 BUILDPRE = 999.0.0
9 BUILDNO = $(shell ./inst/tools/findBuildNum.sh)
10 TARGET = OpenMx_$(BUILDPRE)-$(BUILDNO).tar.gz 
11 PDFFILE = $(RBUILD)/OpenMx.pdf
12 DOCTESTGEN = inst/tools/docTestGenerator.sh
13 DOCTESTFILE = inst/tools/testDocs.R
14 ifdef CPUS
15    # snowfall
16    TESTFILE = inst/tools/parallelTestModels.R
17 else
18    TESTFILE = inst/tools/testModels.R
19 endif
20 NIGHTLYPPMLFILE = inst/tools/testNightlyPPML.R
21 RPROFTESTFILE = inst/tools/rprofTestModels.R
22 FAILTESTFILE = inst/tools/failTestModels.R
23 MEMORYTESTFILE = inst/tools/memoryTestModels.sh
24
25 INSTALLMAKEFLAGS=""
26 #INSTALLMAKEFLAGS="-j 8"   #much faster compiles
27
28 # subdirectories
29 RSOURCE = R
30 RDOCUMENTS = man
31 RDATA = data
32 ROXDOC = man/genericFitDependencies.Rd man/imxAddDependency.Rd man/MxAlgebraFunction.Rd \
33         man/omxCheckCloseEnough.Rd \
34         man/mxExpectationBA81.Rd man/imxPPML.Rd man/imxPPML.Test.Battery.Rd \
35         man/imxCheckVariables.Rd \
36         man/imxCheckMatrices.Rd \
37         man/imxCheckVariables.Rd \
38         man/imxConstraintRelations.Rd \
39         man/imxConvertIdentifier.Rd \
40         man/imxConvertLabel.Rd \
41         man/imxConvertSubstitution.Rd \
42         man/imxExtractNames.Rd \
43         man/imxExtractReferences.Rd \
44         man/imxGenerateNamespace.Rd \
45         man/imxIdentifier.Rd \
46         man/imxIsDefinitionVariable.Rd \
47         man/imxLocateIndex.Rd \
48         man/imxLocateLabel.Rd \
49         man/imxPreprocessModel.Rd \
50         man/imxReverseIdentifier.Rd \
51         man/imxSeparatorChar.Rd \
52         man/imxVerifyName.Rd \
53         man/imxVerifyReference.Rd \
54         man/imxCheckMatrices.Rd \
55         man/imxCheckVariables.Rd \
56         man/imxConstraintRelations.Rd \
57         man/imxConvertIdentifier.Rd \
58         man/imxConvertLabel.Rd \
59         man/imxConvertSubstitution.Rd \
60         man/imxCreateMatrix.Rd \
61         man/imxDataTypes.Rd \
62         man/imxDeparse.Rd \
63         man/imxDependentModels.Rd \
64         man/imxDiff.Rd \
65         man/imxDmvnorm.Rd \
66         man/imxEvalByName.Rd \
67         man/imxExtractMethod.Rd \
68         man/imxExtractNames.Rd \
69         man/imxExtractReferences.Rd \
70         man/imxFilterDefinitionVariables.Rd \
71         man/imxFlattenModel.Rd \
72         man/imxFreezeModel.Rd \
73         man/imxGenSwift.Rd \
74         man/imxGenerateLabels.Rd \
75         man/imxGenerateNamespace.Rd \
76         man/imxGenericModelBuilder.Rd \
77         man/imxHasNPSOL.Rd \
78         man/imxIdentifier.Rd \
79         man/imxIndependentModels.Rd \
80         man/imxInitModel.Rd \
81         man/imxIsDefinitionVariable.Rd \
82         man/imxIsPath.Rd \
83         man/imxLocateFunction.Rd \
84         man/imxLocateIndex.Rd \
85         man/imxLocateLabel.Rd \
86         man/imxLookupSymbolTable.Rd \
87         man/imxModelBuilder.Rd \
88         man/imxModelTypes.Rd \
89         man/imxMpiWrap.Rd \
90         man/imxOriginalMx.Rd \
91         man/imxPPML.Rd \
92         man/imxPPML.Test.Battery.Rd \
93         man/imxPreprocessModel.Rd \
94         man/imxReplaceMethod.Rd \
95         man/imxReplaceModels.Rd \
96         man/imxReservedNames.Rd \
97         man/imxReverseIdentifier.Rd \
98         man/imxSameType.Rd \
99         man/imxSeparatorChar.Rd \
100         man/imxSfClient.Rd \
101         man/imxSimpleRAMPredicate.Rd \
102         man/imxSquareMatrix.Rd \
103         man/imxSymmetricMatrix.Rd \
104         man/imxTypeName.Rd \
105         man/imxVerifyMatrix.Rd \
106         man/imxVerifyModel.Rd \
107         man/imxVerifyName.Rd \
108         man/imxVerifyReference.Rd \
109         man/MxFlatModel.Rd \
110         man/MxLISRELModel.Rd \
111         man/MxRAMModel.Rd \
112         man/MxCharOrList-class.Rd \
113         man/MxCharOrNumber-class.Rd \
114         man/MxListOrNull-class.Rd \
115         man/MxOptionalChar-class.Rd \
116         man/MxOptionalCharOrNumber-class.Rd \
117         man/MxOptionalLogical-class.Rd \
118         man/MxOptionalMatrix-class.Rd \
119         man/MxOptionalNumeric-class.Rd \
120         man/mxComputeOnce.Rd \
121         man/mxComputeIterate.Rd \
122         man/mxComputeSequence.Rd \
123         man/MxLISRELModel-class.Rd \
124         man/MxRAMModel-class.Rd \
125         man/mxComputeHessianQuality.Rd \
126         man/mxComputeStandardError.Rd \
127         man/mxComputeGradientDescent.Rd \
128         man/mxComputeNewtonRaphson.Rd \
129         man/mxComputeNumericDeriv.Rd \
130         man/mxFitFunctionMultigroup.Rd \
131         man/mxComputeNothing.Rd \
132         man/mxComputeReportDeriv.Rd
133
134 # file types
135 RFILES = $(wildcard R/*.R)
136
137 help:
138         @echo "Please use \`make <target>' where <target> is one of"
139         @echo ""        
140         @echo "BUILDS"
141         @echo ""
142         @echo "  build         create an OpenMx binary for unix systems (no cross-compilation)"
143         @echo "  build32       create an OpenMx binary for i386 systems"
144         @echo "  build64       create an OpenMx binary for x86_64 systems"
145         @echo "  buildppc      create an OpenMx binary for ppc systems"
146         @echo "  srcbuild      create an OpenMx source release (alias for 'internal-build')"
147         @echo "  winbuild      create an OpenMx binary on windows systems (no cross-compilation)"
148         @echo "  winbuild-biarch  create an OpenMx binary for [32|64] bit windows systems"
149         @echo "  cran-check    build OpenMx without NPSOL and run CRAN check"
150         @echo "  cran-build    build OpenMx without NPSOL"
151         @echo "  cran-winbuild build OpenMx without NPSOL and build a binary package"
152         @echo ""                
153         @echo "INSTALL"
154         @echo ""        
155         @echo "  install       build and install OpenMx with NPSOL"
156         @echo "  cran-install  build and install OpenMx without NPSOL"
157         @echo ""
158         @echo "DOCUMENTATION"
159         @echo ""        
160         @echo "  pdf           create a pdf file (in build) of the OpenMx R documentation"
161         @echo "  html          create Sphinx documentation (in docs/build/html) in html format"
162         @echo ""
163         @echo "TESTING"
164         @echo ""        
165         @echo "  test          run the test suite"
166         @echo "  torture       run the test suite with gctorture(TRUE)"
167         @echo "  check         run the R package checking system on the OpenMx package"         
168         @echo "  nightly       run the nightly test suite"                      
169         @echo "  nightlyPPML   run the nightly test suite with PPML"                    
170         @echo "  testdocs      test the examples in the Sphinx documentation"   
171         @echo "  failtest      run the failing test suite"
172         @echo "  memorytest    run the test suite under the Valgrind memory debugger"
173         @echo "  rproftest     run the test suite under the Rprof R profiler"
174         @echo ""
175         @echo "CLEANING"
176         @echo ""        
177         @echo "  clean      remove all files from the build directory"
178         @echo "  veryclean  remove all files from the build directory and all *~ files"
179         @echo "  autodep    regenerate src/autodep"
180
181 r-libs-user-dir:
182         ./inst/tools/mk-r-libs-user-dir
183
184 internal-build: build/$(TARGET)
185
186 dev-doc:
187         ./util/rox
188
189 code-style:
190         @echo "Checking code style"
191         @if grep Rprintf src/*.cpp; then echo "*** Rprintf is not thread-safe. Use mxLog or mxLogBig."; exit 1; fi
192         @if [ `grep setFinalReturns src/*.cpp | wc -l` -gt 3 ]; then echo "*** setFinalReturns is deprecated. Use populateAttrFun or addOutput."; exit 1; fi
193
194 build/$(TARGET): $(RFILES) src/omxSymbolTable.h src/omxSymbolTable.cpp code-style
195         rm -f inst/no-npsol
196         cp DESCRIPTION DESCRIPTION.bak
197         sed '/Version:/d' DESCRIPTION.bak > DESCRIPTION
198         echo "Version: "$(BUILDPRE)"-"$(BUILDNO) >> DESCRIPTION 
199         echo 'NPSOL_DIR= "..\inst"' > src/Makevars.win
200         echo 'NPSOL=-lnpsol$$(WIN) -L$$(NPSOL_DIR)' >> src/Makevars.win
201         echo 'NPSOL_LIBS=$$(NPSOL)' >> src/Makevars.win
202         cat src/Makevars.win.in >> src/Makevars.win
203         echo '#define HAS_NPSOL 1' > src/npsolswitch.h
204         cp .Rbuildignore-npsol .Rbuildignore
205         mkdir -p build
206         cd $(RBUILD); $(REXEC) $(RCOMMAND) build ..
207         mv DESCRIPTION.bak DESCRIPTION
208         rm -f $(ROXDOC)
209
210 cran: $(RFILES) src/omxSymbolTable.h src/omxSymbolTable.cpp code-style
211         touch inst/no-npsol
212         cp DESCRIPTION DESCRIPTION.bak
213         sed '/Version:/d' DESCRIPTION.bak > DESCRIPTION
214         echo "Version: "$(BUILDPRE)"-"$(BUILDNO) >> DESCRIPTION 
215         echo '#define HAS_NPSOL 0' > src/npsolswitch.h
216         echo 'NPSOL_LIBS=' > src/Makevars.win
217         cat src/Makevars.win.in >> src/Makevars.win
218         cp .Rbuildignore-cran .Rbuildignore
219         ./util/rox
220
221 cran-build: cran
222         $(REXEC) $(RCOMMAND) build .
223         rm -f $(ROXDOC)
224
225 cran-winbuild: cran
226         rm -f $(ROXDOC)
227         cd $(RBUILD) && R CMD INSTALL --build OpenMx_*.tar.gz
228
229 cran-check: cran-build
230         cd .. && R CMD check OpenMx_*.tar.gz
231         rm -f $(ROXDOC)
232
233 pdf:
234         rm -rf $(PDFFILE); $(REXEC) $(RCOMMAND) $(RPDF) --title="OpenMx Reference Manual" --output=$(PDFFILE) .
235         cd docs; make latex; cd build/latex; make all-pdf
236
237 src/omxSymbolTable.h: data/omxSymbolTable.tab inst/tools/genSymbolTableHeader.R
238         $(REXEC) --slave --vanilla -f inst/tools/genSymbolTableHeader.R  > src/omxSymbolTable.h
239
240 src/omxSymbolTable.cpp: data/omxSymbolTable.tab inst/tools/genSymbolTableSource.R
241         $(REXEC) --slave --vanilla -f inst/tools/genSymbolTableSource.R  > src/omxSymbolTable.cpp
242
243 html: internal-build
244         cd $(RBUILD); $(REXEC) $(RCOMMAND) $(RINSTALL) --html --build $(TARGET)
245         rm -f build/$(TARGET)
246         cd $(RBUILD); tar -zxf *gz
247         mv build/OpenMx/html build/html
248         mv build/OpenMx/demo build/demo
249         cp build/html/* docs/source/static/Rdoc
250         cp build/demo/* docs/source/static/demo
251         cd docs; make clean; make html
252
253 common-build: clean internal-build
254         cd $(RBUILD); $(REXEC) $(RCOMMAND) $(RINSTALL) $(BUILDARGS) --build $(TARGET)
255
256 common-build32: clean internal-build
257         cd $(RBUILD); $(REXEC) --arch i386 $(RCOMMAND) $(RINSTALL) $(BUILDARGS) --build $(TARGET)
258
259 common-build64: clean internal-build
260         cd $(RBUILD); $(REXEC) --arch x86_64 $(RCOMMAND) $(RINSTALL) $(BUILDARGS) --build $(TARGET)
261
262 common-buildppc: clean internal-build
263         cd $(RBUILD); $(REXEC) --arch ppc $(RCOMMAND) $(RINSTALL) $(BUILDARGS) --build $(TARGET)
264
265 post-build:
266         rm -f $(RBUILD)/$(TARGET)
267         cd $(RBUILD); gunzip *;\
268         tar --delete --file=`ls` OpenMx/npsol;\
269         gzip *.tar
270
271
272 build32: common-build32 post-build
273
274 build64: common-build64 post-build
275
276 buildppc: common-buildppc post-build
277
278 build: common-build post-build
279
280 srcbuild: clean internal-build
281
282 winbuild: common-build
283
284 winbuild-biarch:
285         cd $(RBUILD); $(REXEC) $(RCOMMAND) $(RINSTALL) --force-biarch --build $(TARGET)
286
287 install: clean internal-build
288         cd $(RBUILD); MAKEFLAGS=$(INSTALLMAKEFLAGS) $(REXEC) $(RCOMMAND) $(RINSTALL) $(BUILDARGS) $(TARGET) 
289
290 cran-install: cran
291         MAKEFLAGS=$(INSTALLMAKEFLAGS) $(REXEC) $(RCOMMAND) $(RINSTALL) $(BUILDARGS) .
292
293 check: internal-build
294         cd $(RBUILD); $(REXEC) $(RCOMMAND) $(RCHECK) $(TARGET)
295
296 rproftest:
297         $(REXEC) --vanilla --slave < $(RPROFTESTFILE)
298
299 testdocs:
300         $(DOCTESTGEN)
301         $(REXEC) --vanilla --slave < $(DOCTESTFILE)
302
303 test:
304         $(REXEC) --vanilla --slave -f $(TESTFILE)
305
306 test-lisrel:
307         $(REXEC) --vanilla --slave -f $(TESTFILE) --args lisrel
308
309 test-csolnp:
310         IMX_OPT_ENGINE=CSOLNP $(REXEC) --vanilla --slave -f $(TESTFILE) --args csolnp
311
312 torture:
313         $(REXEC) -d "gdb --nx --batch --command util/gdb-where" --vanilla --slave -f $(TESTFILE) --args gctorture
314
315 nightly:
316         $(REXEC) --vanilla --slave -f $(TESTFILE) --args nightly
317
318 nightlyPPML:
319         $(REXEC) --vanilla --slave < $(NIGHTLYPPMLFILE) 
320
321 failtest:
322         $(REXEC) --vanilla --slave < $(FAILTESTFILE)
323
324 memorytest:
325         $(MEMORYTESTFILE)
326
327 autodep:
328         @echo "WARNING: These dependencies are not exact because they don't consider #defined CPP macros."
329         cd src && gcc -MM *.cpp *.c | perl -pe 's,\bEigen[^\s]*\s, ,g' | perl -pe 's,^\s*\\\n,,' > autodep
330
331 clean:
332         -rm $(RBUILD)/OpenMx_*.tar.gz
333         -rm src/*.o
334         -rm src/*.so
335
336 veryclean: clean
337         find . -name "*~" -exec rm -rf '{}' \;
338         -rm -f $(ROXDOC)
339         -rm src/omxSymbolTable.*