From: Julien Schueller Date: Tue, 28 Nov 2017 16:45:57 +0000 (+0100) Subject: Simplify swig cmake logic (#162) X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=feaba7ad16aaa4669ea278c2271d747287be9365;p=nlopt.git Simplify swig cmake logic (#162) --- diff --git a/CMakeLists.txt b/CMakeLists.txt index c4a0096..636a461 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ option (NLOPT_OCTAVE "build octave bindings" ON) option (NLOPT_MATLAB "build matlab bindings" ON) option (NLOPT_GUILE "build guile bindings" ON) option (NLOPT_SWIG "use SWIG to build bindings" ON) +option (NLOPT_LINK_PYTHON "link Python libs" ON) set (NLOPT_SUFFIX) if (NLOPT_CXX) @@ -290,10 +291,11 @@ endif () if (NLOPT_SWIG) find_package (SWIG) + if (SWIG_FOUND) + add_subdirectory (src/swig) + endif () endif () -add_subdirectory (src/swig) - if (NLOPT_OCTAVE) find_package (Octave) endif () diff --git a/src/swig/CMakeLists.txt b/src/swig/CMakeLists.txt index dedaa03..d10142c 100644 --- a/src/swig/CMakeLists.txt +++ b/src/swig/CMakeLists.txt @@ -1,4 +1,6 @@ +include (UseSWIG) + if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/nlopt-enum-renames.i) file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/nlopt-enum-renames.i "// AUTOMATICALLY GENERATED -- DO NOT EDIT\n") file (STRINGS ${PROJECT_SOURCE_DIR}/src/api/nlopt.h NLOPT_H_LINES REGEX " NLOPT_[A-Z0-9_]+") @@ -8,67 +10,50 @@ if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/nlopt-enum-renames.i) endforeach () endif () +include_directories (${NLOPT_PRIVATE_INCLUDE_DIRS}) +set_source_files_properties (nlopt.i PROPERTIES CPLUSPLUS ON) -if (NUMPY_FOUND AND PYTHONLIBS_FOUND AND (SWIG_FOUND OR (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/nlopt-python.cpp))) +if (NUMPY_FOUND AND PYTHONLIBS_FOUND) - include_directories (${PYTHON_INCLUDE_DIRS}) - include_directories (${NUMPY_INCLUDE_DIRS}) + set (SWIG_MODULE_nlopt_EXTRA_DEPS nlopt-python.i numpy.i) - if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/nlopt-python.cpp) - set (SWIG_MODULE_nlopt_REAL_NAME _nlopt) - add_library (${SWIG_MODULE_nlopt_REAL_NAME} MODULE nlopt-python.cpp) - target_link_libraries(${SWIG_MODULE_nlopt_REAL_NAME} ${nlopt_lib}) - target_link_libraries(${SWIG_MODULE_nlopt_REAL_NAME} ${PYTHON_LIBRARIES}) - set_target_properties (${SWIG_MODULE_nlopt_REAL_NAME} PROPERTIES PREFIX "") - if (NOT PROJECT_SOURCE_DIR MATCHES PROJECT_BINARY_DIR) - execute_process (COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/nlopt.py ${CMAKE_CURRENT_BINARY_DIR}/nlopt.py) - endif () + if (CMAKE_VERSION VERSION_LESS 3.8) + swig_add_module (nlopt python nlopt.i) else () - include (UseSWIG) - set_source_files_properties (nlopt.i PROPERTIES CPLUSPLUS ON) - set (SWIG_MODULE_nlopt_EXTRA_DEPS nlopt-python.i numpy.i) - - include_directories (${NLOPT_PRIVATE_INCLUDE_DIRS}) - if (CMAKE_VERSION VERSION_LESS 3.8) - swig_add_module (nlopt python nlopt.i) - else () - swig_add_library (nlopt LANGUAGE python SOURCES nlopt.i) - endif () - - swig_link_libraries (nlopt ${nlopt_lib}) + swig_add_library (nlopt LANGUAGE python SOURCES nlopt.i) + endif () + + target_include_directories (${SWIG_MODULE_nlopt_REAL_NAME} PUBLIC ${PYTHON_INCLUDE_DIRS}) + target_include_directories (${SWIG_MODULE_nlopt_REAL_NAME} PUBLIC ${NUMPY_INCLUDE_DIRS}) + + swig_link_libraries (nlopt ${nlopt_lib}) + if (NLOPT_LINK_PYTHON) swig_link_libraries (nlopt ${PYTHON_LIBRARIES}) - target_include_directories (${SWIG_MODULE_nlopt_REAL_NAME} PRIVATE ${NLOPT_PRIVATE_INCLUDE_DIRS}) endif () + set_target_properties (${SWIG_MODULE_nlopt_REAL_NAME} PROPERTIES OUTPUT_NAME _nlopt) + install (FILES ${CMAKE_CURRENT_BINARY_DIR}/nlopt.py DESTINATION ${INSTALL_PYTHON_DIR}) install (TARGETS ${SWIG_MODULE_nlopt_REAL_NAME} LIBRARY DESTINATION ${INSTALL_PYTHON_DIR}) endif () # guile bindings with gcc only ok with swig >= 2.0.10 -if (GUILE_FOUND AND ((SWIG_FOUND AND SWIG_VERSION VERSION_GREATER 2.0.9) OR (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/nlopt-guile.cpp))) - include_directories (${GUILE_INCLUDE_DIRS}) +if (GUILE_FOUND AND (SWIG_VERSION VERSION_GREATER 2.0.9)) - if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/nlopt-guile.cpp) - set (guile_cpp_source ${CMAKE_CURRENT_SOURCE_DIR}/nlopt-guile.cpp) - else () - file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/GenericConfigureFile.cmake "configure_file (\${INFILE} \${OUTFILE} @ONLY)") + set_source_files_properties (nlopt.i PROPERTIES SWIG_FLAGS "-scmstub") + set (SWIG_MODULE_nlopt_guile_EXTRA_DEPS nlopt-guile.i) - set (guile_cpp_source ${CMAKE_CURRENT_BINARY_DIR}/nlopt-guile.cpp) - add_custom_command (OUTPUT ${guile_cpp_source} nlopt.scm.in - COMMAND ${SWIG_EXECUTABLE} -I${PROJECT_BINARY_DIR}/src/api -outdir ${CMAKE_CURRENT_BINARY_DIR} -c++ -guile -scmstub -o ${guile_cpp_source} ${CMAKE_CURRENT_SOURCE_DIR}/nlopt.i - COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/nlopt.scm ${CMAKE_CURRENT_BINARY_DIR}/nlopt.scm.in - COMMAND ${CMAKE_COMMAND} -DINFILE=${CMAKE_CURRENT_BINARY_DIR}/nlopt.scm.in -DOUTFILE=${CMAKE_CURRENT_BINARY_DIR}/nlopt.scm -DNLOPT_SUFFIX=${NLOPT_SUFFIX} -P ${CMAKE_CURRENT_BINARY_DIR}/GenericConfigureFile.cmake) + if (CMAKE_VERSION VERSION_LESS 3.8) + swig_add_module (nlopt_guile guile nlopt.i) + else () + swig_add_library (nlopt_guile LANGUAGE guile SOURCES nlopt.i) endif () - if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/nlopt.scm.in) - configure_file (${CMAKE_CURRENT_SOURCE_DIR}/nlopt.scm.in ${CMAKE_CURRENT_BINARY_DIR}/nlopt.scm @ONLY) - endif () + target_include_directories (${SWIG_MODULE_nlopt_guile_REAL_NAME} PUBLIC ${GUILE_INCLUDE_DIRS}) - set (SWIG_MODULE_nlopt_guile_REAL_NAME nlopt${NLOPT_SUFFIX}_guile) - add_library (${SWIG_MODULE_nlopt_guile_REAL_NAME} MODULE ${guile_cpp_source}) - target_link_libraries(${SWIG_MODULE_nlopt_guile_REAL_NAME} ${nlopt_lib}) - target_link_libraries(${SWIG_MODULE_nlopt_guile_REAL_NAME} ${GUILE_LIBRARIES}) + swig_link_libraries (nlopt_guile ${nlopt_lib}) + swig_link_libraries (nlopt_guile ${GUILE_LIBRARIES}) file (RELATIVE_PATH _REL_GUILE_SITE_PATH ${GUILE_ROOT_DIR} ${GUILE_SITE_DIR}) set (GUILE_SITE_PATH ${_REL_GUILE_SITE_PATH}) diff --git a/src/swig/nlopt-guile.i b/src/swig/nlopt-guile.i index 257a848..2b8a23c 100644 --- a/src/swig/nlopt-guile.i +++ b/src/swig/nlopt-guile.i @@ -78,5 +78,5 @@ static double func_guile(unsigned n, const double *x, double *grad, void *f) { %feature("constasvar", "1"); %scheme %{ -(load-extension "libnlopt@NLOPT_SUFFIX@_guile.so" "SWIG_init") +(load-extension "libnlopt_guile.so" "SWIG_init") %}