chiark / gitweb /
Simplify swig cmake logic (#162)
authorJulien Schueller <schueller@phimeca.com>
Tue, 28 Nov 2017 16:45:57 +0000 (17:45 +0100)
committerSteven G. Johnson <stevenj@mit.edu>
Tue, 28 Nov 2017 16:45:57 +0000 (11:45 -0500)
CMakeLists.txt
src/swig/CMakeLists.txt
src/swig/nlopt-guile.i

index c4a0096703146489cd642a9a25283bd725656381..636a4611263f0dfefd5269c84ff5dfd4a652c28e 100644 (file)
@@ -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 ()
index dedaa03c2dc1622c44b3d89438263677a182ee62..d10142c96c191c3e70d8cacccbbfd762a93057e6 100644 (file)
@@ -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})
index 257a848be468fa9bfaf36c169cb3e7494b926746..2b8a23ccf9f3201b2320ba50be58db506c3b1648 100644 (file)
@@ -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")
 %}