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