chiark / gitweb /
Merge pull request #94 from jschueller/config
[nlopt.git] / CMakeLists.txt
1 #==============================================================================\r
2 # NLOPT CMake file\r
3\r
4 # NLopt is a free/open-source library for nonlinear optimization, providing \r
5 # a common interface for a number of different free optimization routines \r
6 # available online as well as original implementations of various other \r
7 # algorithms\r
8 # WEBSITE: http://ab-initio.mit.edu/wiki/index.php/NLopt \r
9 # AUTHOR: Steven G. Johnson\r
10 #\r
11 # This CMakeLists.txt file was created to compile NLOPT with the CMAKE utility.\r
12 # Benoit Scherrer, 2010 CRL, Harvard Medical School\r
13 # Copyright (c) 2008-2009 Children's Hospital Boston \r
14 #==============================================================================\r
15 cmake_minimum_required (VERSION 2.8.5)\r
16 \r
17 if (NOT DEFINED CMAKE_BUILD_TYPE)\r
18   set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type")\r
19 endif ()\r
20 \r
21 project (nlopt C)\r
22 \r
23 list (APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)\r
24 \r
25 option (WITH_CXX "enable cxx routines" OFF)\r
26 option (BUILD_SHARED_LIBS "Build NLOPT as a shared library" ON)\r
27 option (BUILD_PYTHON "build python bindings" ON)\r
28 option (BUILD_OCTAVE "build octave bindings" ON)\r
29 option (BUILD_MATLAB "build matlab bindings" ON)\r
30 option (BUILD_GUILE "build guile bindings" ON)\r
31 option (USE_SWIG "use SWIG to build bindings" ON)\r
32 \r
33 set (NLOPT_SUFFIX)\r
34 if (WITH_CXX)\r
35   set (NLOPT_SUFFIX _cxx)\r
36 endif ()\r
37 \r
38 if (WITH_CXX OR BUILD_PYTHON)\r
39   enable_language (CXX)\r
40 endif ()\r
41 \r
42 include (GNUInstallDirs)\r
43 \r
44 # Offer the user the choice of overriding the installation directories\r
45 set (INSTALL_LIB_DIR     ${CMAKE_INSTALL_LIBDIR}        CACHE PATH "Installation directory for libraries")\r
46 set (INSTALL_BIN_DIR     ${CMAKE_INSTALL_BINDIR}        CACHE PATH "Installation directory for executables")\r
47 set (INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}    CACHE PATH "Installation directory for header files")\r
48 set (INSTALL_DATA_DIR    ${CMAKE_INSTALL_DATADIR}/nlopt CACHE PATH "Installation directory for data files")\r
49 set (INSTALL_MAN_DIR     ${CMAKE_INSTALL_MANDIR}        CACHE PATH "Installation directory for man documentation")\r
50 set (INSTALL_CMAKE_DIR   ${INSTALL_LIB_DIR}/cmake/nlopt CACHE PATH "Installation directory for cmake config files")\r
51 \r
52 # Make relative paths absolute (needed later on)\r
53 foreach (p LIB BIN INCLUDE DATA CMAKE)\r
54   set (var INSTALL_${p}_DIR)\r
55   set (RELATIVE_INSTALL_${p}_DIR ${INSTALL_${p}_DIR})\r
56   if (NOT IS_ABSOLUTE "${${var}}")\r
57     set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")\r
58   endif ()\r
59 endforeach ()\r
60 \r
61 \r
62 set (CMAKE_INSTALL_RPATH ${INSTALL_LIB_DIR})\r
63 set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)\r
64 if(POLICY CMP0042)\r
65   # Set MACOSX_RPATH to ON\r
66   cmake_policy(SET CMP0042 NEW)\r
67 endif()\r
68 \r
69 include (CheckIncludeFiles)\r
70 include (CheckFunctionExists)\r
71 include (CheckTypeSize)\r
72 include (CheckCCompilerFlag)\r
73 \r
74 #==============================================================================\r
75 # COMPILATION CHECKINGS and CONFIGURATION GENERATION\r
76 #==============================================================================\r
77 check_include_file (dlfcn.h HAVE_DLFCN_H)\r
78 check_include_file (getopt.h HAVE_GETOPT_H)\r
79 check_include_file (unistd.h HAVE_UNISTD_H)\r
80 check_include_file (string.h HAVE_STRING_H)\r
81 check_include_file (strings.h HAVE_STRINGS_H)\r
82 check_include_file (inttypes.h HAVE_INTTYPES_H)\r
83 check_include_file (memory.h HAVE_MEMORY_H)\r
84 check_include_file (stdlib.h HAVE_STDLIB_H)\r
85 check_include_file (stdint.h HAVE_STDINT_H)\r
86 check_include_file (time.h HAVE_TIME_H)\r
87 check_include_file (sys/types.h HAVE_SYS_TYPES_H)\r
88 check_include_file (sys/stat.h HAVE_SYS_STAT_H)\r
89 check_include_file (sys/time.h HAVE_SYS_TIME_H)\r
90 if (HAVE_TIME_H AND HAVE_SYS_TIME_H)\r
91   set (TIME_WITH_SYS_TIME TRUE)\r
92 endif ()\r
93 check_function_exists (getpid HAVE_GETPID)\r
94 check_function_exists (syscall HAVE_GETTID_SYSCALL)\r
95 check_function_exists (isinf HAVE_ISINF)\r
96 check_function_exists (isnan HAVE_ISNAN)\r
97 check_function_exists (gettimeofday HAVE_GETTIMEOFDAY)\r
98 check_function_exists (qsort_r HAVE_QSORT_R)\r
99 check_function_exists (time HAVE_TIME)\r
100 check_function_exists (copysign HAVE_COPYSIGN)\r
101 check_type_size ("uint32_t" SIZEOF_UINT32_T)\r
102 set (HAVE_UINT32_T ${SIZEOF_UINT32_T})\r
103 check_type_size ("unsigned int" SIZEOF_UNSIGNED_INT)\r
104 check_type_size ("unsigned long" SIZEOF_UNSIGNED_LONG)\r
105 \r
106 if (NOT DEFINED HAVE_FPCLASSIFY)\r
107   message(STATUS "Looking for fpclassify")\r
108   file (WRITE ${CMAKE_BINARY_DIR}/fpclassify.c "#include <math.h>\n")\r
109   file (APPEND ${CMAKE_BINARY_DIR}/fpclassify.c "int main(void) {\n")\r
110   file (APPEND ${CMAKE_BINARY_DIR}/fpclassify.c "if (!fpclassify(3.14159)) fpclassify(2.7183);\n")\r
111   file (APPEND ${CMAKE_BINARY_DIR}/fpclassify.c "  return 0; }\n")\r
112   try_compile (HAVE_FPCLASSIFY\r
113   ${CMAKE_BINARY_DIR}/build_fpclassify\r
114   ${CMAKE_BINARY_DIR}/fpclassify.c\r
115   CMAKE_FLAGS -DLINK_LIBRARIES=m)\r
116   message(STATUS "Looking for fpclassify - ${HAVE_FPCLASSIFY}")\r
117 endif ()\r
118 \r
119 option (WITH_THREADLOCAL "check thread local keyword" ON)\r
120 if (WITH_THREADLOCAL AND NOT DEFINED HAVE_THREAD_LOCAL_STORAGE)\r
121   foreach (_THREADLOCAL_KEY "__thread" "__declspec(thread)")\r
122     unset (HAVE_THREAD_LOCAL_STORAGE CACHE)\r
123     check_c_source_compiles("\r
124     ${_THREADLOCAL_KEY} int tls;\r
125 \r
126     int main(void) {\r
127         return 0;\r
128     }" HAVE_THREAD_LOCAL_STORAGE)\r
129     if (${HAVE_THREAD_LOCAL_STORAGE})\r
130       set (THREADLOCAL ${_THREADLOCAL_KEY})\r
131     endif ()\r
132   endforeach()\r
133 endif ()\r
134 \r
135 #==============================================================================\r
136 # version\r
137 #==============================================================================\r
138 set (NLOPT_MAJOR_VERSION "2")\r
139 set (NLOPT_MINOR_VERSION "5")\r
140 set (NLOPT_BUGFIX_VERSION "0")\r
141 set (NLOPT_VERSION_STRING ${NLOPT_MAJOR_VERSION}.${NLOPT_MINOR_VERSION}.${NLOPT_BUGFIX_VERSION})\r
142 message (STATUS "NLopt version ${NLOPT_VERSION_STRING}")\r
143 \r
144 #==============================================================================\r
145 # CREATE nlopt_config.h\r
146 #==============================================================================\r
147 \r
148 configure_file (${CMAKE_CURRENT_SOURCE_DIR}/nlopt_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/nlopt_config.h IMMEDIATE)\r
149 \r
150 # pkgconfig file\r
151 if (UNIX OR MINGW)\r
152   configure_file (${CMAKE_CURRENT_SOURCE_DIR}/nlopt.pc.in ${CMAKE_CURRENT_BINARY_DIR}/nlopt.pc @ONLY)\r
153   install (FILES ${CMAKE_CURRENT_BINARY_DIR}/nlopt.pc DESTINATION ${RELATIVE_INSTALL_LIB_DIR}/pkgconfig)\r
154 endif ()\r
155 \r
156 #==============================================================================\r
157 # INCLUDE DIRECTORIES\r
158 #==============================================================================\r
159 set (${INCLUDE_DIRECTORIES} "")\r
160 include_directories (\r
161   ${CMAKE_BINARY_DIR}/api\r
162   ${CMAKE_BINARY_DIR}\r
163   stogo\r
164   util\r
165   direct\r
166   cdirect\r
167   praxis\r
168   luksan\r
169   crs\r
170   mlsl\r
171   mma\r
172   cobyla\r
173   newuoa\r
174   neldermead\r
175   auglag\r
176   bobyqa\r
177   isres\r
178   slsqp\r
179   esch\r
180   api)\r
181 \r
182 \r
183 #==============================================================================\r
184 # nlopt LIBRARY TARGET (SHARED OR STATIC)\r
185 #==============================================================================\r
186 \r
187 set (NLOPT_HEADERS \r
188   api/nlopt.h ${CMAKE_BINARY_DIR}/api/nlopt.hpp ${CMAKE_BINARY_DIR}/api/nlopt.f\r
189 )\r
190 \r
191 set (NLOPT_SOURCES   \r
192   direct/DIRect.c direct/direct_wrap.c direct/DIRserial.c direct/DIRsubrout.c direct/direct-internal.h direct/direct.h\r
193   cdirect/cdirect.c cdirect/hybrid.c cdirect/cdirect.h\r
194   praxis/praxis.c praxis/praxis.h\r
195   luksan/plis.c luksan/plip.c luksan/pnet.c luksan/mssubs.c luksan/pssubs.c luksan/luksan.h\r
196   crs/crs.c crs/crs.h\r
197   mlsl/mlsl.c mlsl/mlsl.h\r
198   mma/mma.c mma/mma.h mma/ccsa_quadratic.c\r
199   cobyla/cobyla.c cobyla/cobyla.h\r
200   newuoa/newuoa.c newuoa/newuoa.h\r
201   neldermead/nldrmd.c neldermead/neldermead.h neldermead/sbplx.c \r
202   auglag/auglag.c auglag/auglag.h\r
203   bobyqa/bobyqa.c bobyqa/bobyqa.h\r
204   isres/isres.c isres/isres.h\r
205   slsqp/slsqp.c slsqp/slsqp.h\r
206   esch/esch.c esch/esch.h\r
207   api/general.c api/options.c api/optimize.c api/deprecated.c api/nlopt-internal.h api/nlopt.h api/f77api.c api/f77funcs.h api/f77funcs_.h api/nlopt.hpp api/nlopt-in.hpp\r
208   util/mt19937ar.c util/sobolseq.c util/soboldata.h util/timer.c util/stop.c util/nlopt-util.h util/redblack.c util/redblack.h util/qsort_r.c util/rescale.c\r
209 )\r
210 \r
211 if (WITH_CXX)\r
212   list (APPEND NLOPT_SOURCES stogo/global.cc stogo/linalg.cc stogo/local.cc stogo/stogo.cc stogo/tools.cc stogo/global.h stogo/linalg.h stogo/local.h stogo/stogo_config.h stogo/stogo.h stogo/tools.h)\r
213 endif ()\r
214 \r
215 \r
216 if (BUILD_SHARED_LIBS)\r
217   add_definitions (-DNLOPT_DLL)\r
218   add_definitions (-DNLOPT_DLL_EXPORT)\r
219 endif ()\r
220 \r
221 install (FILES ${NLOPT_HEADERS} DESTINATION ${INSTALL_INCLUDE_DIR})\r
222 \r
223 set (nlopt_lib nlopt${NLOPT_SUFFIX})\r
224 add_library (${nlopt_lib} ${NLOPT_SOURCES})\r
225 set_target_properties (${nlopt_lib} PROPERTIES SOVERSION 0)\r
226 set_target_properties (${nlopt_lib} PROPERTIES VERSION 0.9.0)\r
227 \r
228 # pass -fPIC in case swig module is built with static library\r
229 if (NOT BUILD_SHARED_LIBS)\r
230   check_c_compiler_flag (-fPIC HAS_FPIC)\r
231   if (HAS_FPIC)\r
232     set (CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}")\r
233     set (CMAKE_CXX_FLAGS "-fPIC ${CMAKE_CXX_FLAGS}")\r
234   endif ()\r
235 endif ()\r
236 \r
237 install ( TARGETS ${nlopt_lib}\r
238           EXPORT  NLoptLibraryDepends\r
239           RUNTIME DESTINATION ${RELATIVE_INSTALL_BIN_DIR}\r
240           LIBRARY DESTINATION ${RELATIVE_INSTALL_LIB_DIR}\r
241           ARCHIVE DESTINATION ${RELATIVE_INSTALL_LIB_DIR}\r
242         )\r
243 \r
244 add_subdirectory (api)\r
245 \r
246 if (BUILD_PYTHON)\r
247   find_package (PythonInterp)\r
248   find_package (PythonLibs)\r
249   find_package (NumPy)\r
250 endif ()\r
251 \r
252 if (PYTHONINTERP_FOUND)\r
253   execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "from distutils import sysconfig; print(sysconfig.get_python_lib(plat_specific=True, prefix='${CMAKE_INSTALL_PREFIX}'))"\r
254                     OUTPUT_VARIABLE _ABS_PYTHON_MODULE_PATH\r
255                     OUTPUT_STRIP_TRAILING_WHITESPACE )\r
256 \r
257   get_filename_component (_ABS_PYTHON_MODULE_PATH ${_ABS_PYTHON_MODULE_PATH} ABSOLUTE)\r
258   file (RELATIVE_PATH _REL_PYTHON_MODULE_PATH ${CMAKE_INSTALL_PREFIX} ${_ABS_PYTHON_MODULE_PATH})\r
259 \r
260   set (PYTHON_MODULE_PATH ${_REL_PYTHON_MODULE_PATH})\r
261 \r
262 endif ()\r
263 \r
264 if (BUILD_GUILE)\r
265   find_package (Guile)\r
266 endif ()\r
267 \r
268 if (USE_SWIG)\r
269   find_package (SWIG)\r
270 endif ()\r
271 \r
272 add_subdirectory (swig)\r
273 \r
274 if (BUILD_OCTAVE)\r
275   find_package (Octave)\r
276 endif ()\r
277 \r
278 if (BUILD_MATLAB)\r
279   find_package (Matlab)\r
280 endif ()\r
281 \r
282 if (OCTAVE_FOUND OR Matlab_FOUND)\r
283   add_subdirectory (octave)\r
284 endif ()\r
285 \r
286 enable_testing ()\r
287 add_subdirectory (test)\r
288 \r
289 set (CPACK_PACKAGE_NAME          "${CMAKE_PROJECT_NAME}")\r
290 set (CPACK_PACKAGE_VERSION_MAJOR "${NLOPT_MAJOR_VERSION}")\r
291 set (CPACK_PACKAGE_VERSION_MINOR "${NLOPT_MINOR_VERSION}")\r
292 set (CPACK_PACKAGE_VERSION_PATCH "${NLOPT_BUGFIX_VERSION}")\r
293 set (CPACK_SOURCE_GENERATOR      "TBZ2;TGZ"    )\r
294 set (CPACK_BINARY_STGZ           "OFF"        )\r
295 set (CPACK_BINARY_TBZ2           "ON"         )\r
296 set (CPACK_BINARY_TGZ            "ON"         )\r
297 set (CPACK_BINARY_TZ             "OFF"        )\r
298 set (CPACK_SOURCE_IGNORE_FILES ".git;/build;.*~;${CPACK_SOURCE_IGNORE_FILES}")\r
299 \r
300 set (CPACK_SOURCE_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${NLOPT_VERSION_STRING})\r
301 \r
302 include (CPack)\r
303 \r
304 # configuration files\r
305 export (TARGETS ${nlopt_lib} FILE ${PROJECT_BINARY_DIR}/NLoptLibraryDepends.cmake)\r
306 \r
307 # Install the export set for use with the install-tree\r
308 install(EXPORT NLoptLibraryDepends\r
309         DESTINATION ${RELATIVE_INSTALL_CMAKE_DIR}\r
310         COMPONENT Development)\r
311 \r
312 # Create a NLOPTConfig.cmake file for the use from the install tree\r
313 # and install it\r
314 set (NLOPT_LIBRARIES ${nlopt_lib})\r
315 \r
316 set (NLOPT_CMAKE_DIR "${INSTALL_CMAKE_DIR}")\r
317 file (RELATIVE_PATH rel_include_dir "${NLOPT_CMAKE_DIR}" "${INSTALL_INCLUDE_DIR}")\r
318 list (APPEND RELATIVE_NLOPT_INCLUDE_DIRS ${rel_include_dir})\r
319 \r
320 file (RELATIVE_PATH rel_lib_dir "${NLOPT_CMAKE_DIR}" "${INSTALL_LIB_DIR}")\r
321 list (APPEND RELATIVE_NLOPT_LIB_DIR ${rel_lib_dir})\r
322 \r
323 configure_file (cmake/NLoptConfig.cmake.in NLoptConfig.cmake @ONLY)\r
324 configure_file (cmake/NLoptConfigVersion.cmake.in NLoptConfigVersion.cmake @ONLY)\r
325 install (FILES\r
326           ${CMAKE_CURRENT_BINARY_DIR}/NLoptConfig.cmake\r
327           ${CMAKE_CURRENT_BINARY_DIR}/NLoptConfigVersion.cmake\r
328          DESTINATION ${RELATIVE_INSTALL_CMAKE_DIR}\r
329          COMPONENT Development)\r
330 \r