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