Fix build without NPSOL
[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
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 "  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 ""                
49         @echo "INSTALL"
50         @echo ""        
51         @echo "  install       build and install OpenMx on this machine"
52         @echo "                (On unix, CFLAGS can be overridden in /etc/R/Makeconf)"
53         @echo ""
54         @echo "DOCUMENTATION"
55         @echo ""        
56         @echo "  pdf           create a pdf file (in build) of the OpenMx R documentation"
57         @echo "  html          create Sphinx documentation (in docs/build/html) in html format"
58         @echo ""
59         @echo "TESTING"
60         @echo ""        
61         @echo "  test          run the test suite"
62         @echo "  torture       run the test suite with gctorture(TRUE)"
63         @echo "  check         run the R package checking system on the OpenMx package"         
64         @echo "  nightly       run the nightly test suite"                      
65         @echo "  nightlyPPML   run the nightly test suite with PPML"                    
66         @echo "  testdocs      test the examples in the Sphinx documentation"   
67         @echo "  failtest      run the failing test suite"
68         @echo "  memorytest    run the test suite under the Valgrind memory debugger"
69         @echo "  rproftest     run the test suite under the Rprof R profiler"
70         @echo ""
71         @echo "CLEANING"
72         @echo ""        
73         @echo "  clean      remove all files from the build directory"
74         @echo "  veryclean  remove all files from the build directory and all *~ files"
75
76 r-libs-user-dir:
77         ./inst/tools/mk-r-libs-user-dir
78
79 internal-build: build/$(TARGET)
80
81 dev-doc:
82         ./util/rox
83
84 build/$(TARGET): $(RFILES) src/omxSymbolTable.h src/omxSymbolTable.cpp
85         @if grep Rprintf src/*.cpp; then echo "*** Rprintf is not thread-safe. Use mxLog or mxLogBig."; exit 1; fi
86         @if [ `grep setFinalReturns src/*.cpp | wc -l` -gt 3 ]; then echo "*** setFinalReturns is deprecated. Use populateAttrFun or addOutput."; exit 1; fi
87         mkdir -p build
88         rm -f inst/no-npsol
89         cp DESCRIPTION DESCRIPTION.bak
90         sed '/Version:/d' DESCRIPTION.bak > DESCRIPTION
91         echo "Version: "$(BUILDPRE)"-"$(BUILDNO) >> DESCRIPTION 
92         echo '#define HAS_NPSOL 1' > src/npsolswitch.h
93         cp .Rbuildignore-npsol .Rbuildignore
94         cd $(RBUILD); $(REXEC) $(RCOMMAND) build ..
95         mv DESCRIPTION.bak DESCRIPTION
96         rm -f man/genericFitDependencies.Rd man/imxAddDependency.Rd man/MxAlgebraFunction.Rd \
97                 man/omxCheckCloseEnough.Rd \
98                 man/mxExpectationBA81.Rd
99
100 # Developers only. This rule is for testing builds without NPSOL. 
101 cran: $(RFILES) src/omxSymbolTable.h src/omxSymbolTable.cpp clean
102         touch inst/no-npsol
103         cp DESCRIPTION DESCRIPTION.bak
104         sed '/Version:/d' DESCRIPTION.bak > DESCRIPTION
105         echo "Version: "$(BUILDPRE)"-"$(BUILDNO) >> DESCRIPTION 
106         echo '#define HAS_NPSOL 0' > src/npsolswitch.h
107         cp .Rbuildignore-cran .Rbuildignore
108         mkdir -p build
109         cd $(RBUILD); $(REXEC) $(RCOMMAND) build ..
110         mv DESCRIPTION.bak DESCRIPTION
111         cd $(RBUILD); MAKEFLAGS=$(INSTALLMAKEFLAGS) $(REXEC) $(RCOMMAND) $(RINSTALL) $(BUILDARGS) $(TARGET)
112
113 pdf:
114         rm -rf $(PDFFILE); $(REXEC) $(RCOMMAND) $(RPDF) --title="OpenMx Reference Manual" --output=$(PDFFILE) .
115         cd docs; make latex; cd build/latex; make all-pdf
116
117 src/omxSymbolTable.h: data/omxSymbolTable.tab inst/tools/genSymbolTableHeader.R
118         $(REXEC) --slave --vanilla -f inst/tools/genSymbolTableHeader.R  > src/omxSymbolTable.h
119
120 src/omxSymbolTable.cpp: data/omxSymbolTable.tab inst/tools/genSymbolTableSource.R
121         $(REXEC) --slave --vanilla -f inst/tools/genSymbolTableSource.R  > src/omxSymbolTable.cpp
122
123 html: internal-build
124         cd $(RBUILD); $(REXEC) $(RCOMMAND) $(RINSTALL) --html --build $(TARGET)
125         rm -f build/$(TARGET)
126         cd $(RBUILD); tar -zxf *gz
127         mv build/OpenMx/html build/html
128         mv build/OpenMx/demo build/demo
129         cp build/html/* docs/source/static/Rdoc
130         cp build/demo/* docs/source/static/demo
131         cd docs; make clean; make html
132
133 common-build: clean internal-build
134         cd $(RBUILD); $(REXEC) $(RCOMMAND) $(RINSTALL) $(BUILDARGS) --build $(TARGET)
135
136 common-build32: clean internal-build
137         cd $(RBUILD); $(REXEC) --arch i386 $(RCOMMAND) $(RINSTALL) $(BUILDARGS) --build $(TARGET)
138
139 common-build64: clean internal-build
140         cd $(RBUILD); $(REXEC) --arch x86_64 $(RCOMMAND) $(RINSTALL) $(BUILDARGS) --build $(TARGET)
141
142 common-buildppc: clean internal-build
143         cd $(RBUILD); $(REXEC) --arch ppc $(RCOMMAND) $(RINSTALL) $(BUILDARGS) --build $(TARGET)
144
145 post-build:
146         rm -f $(RBUILD)/$(TARGET)
147         cd $(RBUILD); gunzip *;\
148         tar --delete --file=`ls` OpenMx/npsol;\
149         gzip *.tar
150
151
152 build32: common-build32 post-build
153
154 build64: common-build64 post-build
155
156 buildppc: common-buildppc post-build
157
158 build: common-build post-build
159
160 srcbuild: clean internal-build
161
162 winbuild: common-build
163
164 winbuild-biarch:
165         cd $(RBUILD); $(REXEC) $(RCOMMAND) $(RINSTALL) --force-biarch --build $(TARGET)
166
167 install: clean internal-build
168         cd $(RBUILD); MAKEFLAGS=$(INSTALLMAKEFLAGS) $(REXEC) $(RCOMMAND) $(RINSTALL) $(BUILDARGS) $(TARGET) 
169
170 check: internal-build
171         cd $(RBUILD); $(REXEC) $(RCOMMAND) $(RCHECK) $(TARGET)
172
173 rproftest:
174         $(REXEC) --vanilla --slave < $(RPROFTESTFILE)
175
176 testdocs:
177         $(DOCTESTGEN)
178         $(REXEC) --vanilla --slave < $(DOCTESTFILE)
179
180 test:
181         $(REXEC) --vanilla --slave -f $(TESTFILE)
182
183 test-lisrel:
184         $(REXEC) --vanilla --slave -f $(TESTFILE) --args lisrel
185
186 test-csolnp:
187         IMX_OPT_ENGINE=CSOLNP $(REXEC) --vanilla --slave -f $(TESTFILE) --args csolnp
188
189 torture:
190         $(REXEC) -d "gdb --batch --command util/gdb-where" --vanilla --slave -f $(TESTFILE) --args gctorture
191
192 nightly:
193         $(REXEC) --vanilla --slave -f $(TESTFILE) --args nightly
194
195 nightlyPPML:
196         $(REXEC) --vanilla --slave < $(NIGHTLYPPMLFILE) 
197
198 failtest:
199         $(REXEC) --vanilla --slave < $(FAILTESTFILE)
200
201 memorytest:
202         $(MEMORYTESTFILE)
203
204 clean:
205         rm -rf $(RBUILD)/*
206
207 veryclean: clean
208         find . -name "*~" -exec rm -rf '{}' \;