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