Эх сурвалжийг харах

Mexes are now shared library targets

Clemens-Alexander Brust 11 жил өмнө
parent
commit
7b2e01e409
2 өөрчлөгдсөн 55 нэмэгдсэн , 4 устгасан
  1. 27 4
      CMakeLists.txt
  2. 28 0
      cmake/NiceModules.cmake

+ 27 - 4
CMakeLists.txt

@@ -1,11 +1,13 @@
-#cmake_minimum_required(VERSION 2.8.6) #version 2.8.6 at least required because of command set(CMAKE_AUTOMOC TRUE) for qt moc-ing (see below)
-cmake_minimum_required(VERSION 2.8.6)
+#version 2.8.9 required for position independent code
+cmake_minimum_required(VERSION 2.8.9)
 project (NICELibrary)
 
 include(CheckSymbolExists)
 include(CheckIncludeFiles)
 
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
+set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+set(CMAKE_POSITION_INDEPENDENT_CODE ON)
 
 include(cmake/NiceModules.cmake REQUIRED)
 
@@ -33,13 +35,34 @@ set(NICE_SOURCEFILES_FIND_GLOBALLYRECURSIVE ON CACHE STRING "Scan a sublibraries
 
 NICE_OPTION(WITH_MEX "Build with MEX support" ON)
 if(WITH_MEX)
-  INCLUDE_DIRECTORIES($ENV{MATLAB}/extern/include)
+  # Look for MATLAB environment variable
+  if(NOT EXISTS "$ENV{MATLAB}")
+    message(FATAL_ERROR "Cannot find MATLAB! Have you set \$MATLAB?")
+  else()
+    message(STATUS "Using MATLAB from: $ENV{MATLAB}")
+  endif()
+
+  # Look for Arch environment variable
+  if(NOT "$ENV{Arch}" MATCHES ".*((32)|(64))$")
+    message(FATAL_ERROR "\$Arch not set but required for MEX support")
+  else()
+    message(STATUS "Using MATLAB architecture: " $ENV{Arch})
+  endif()
+
+  # Look for headers
+  if(EXISTS "$ENV{MATLAB}/extern/include/mex.h")
+    INCLUDE_DIRECTORIES($ENV{MATLAB}/extern/include)
+  else()
+    message(FATAL_ERROR "Cannot find mex.h! Have you set \$MATLAB correctly?")
+  endif()
+
   FIND_LIBRARY(MEX_LIBMX mx PATHS $ENV{MATLAB}/bin/$ENV{Arch})
   FIND_LIBRARY(MEX_LIBMEX mex PATHS $ENV{MATLAB}/bin/$ENV{Arch})
   FIND_LIBRARY(MEX_LIBMAT mat PATHS $ENV{MATLAB}/bin/$ENV{Arch})
 
   SET(MEX_LIBRARIES ${MEX_LIBMX} ${MEX_LIBMEX} ${MEX_LIBMAT})
-
+  SET(MEX_ENDING ".mexa64")
+  ADD_DEFINITIONS("-DNICE_MEX_FOUND")
   MESSAGE(STATUS "Found mex libraries at ${MEX_LIBRARIES}")
 endif()
 

+ 28 - 0
cmake/NiceModules.cmake

@@ -72,6 +72,7 @@ macro(nice_get_source_files)
     ### Get all unit test cpp files recursively
     set(nice_${the_library}_TESTFILES_SRC "")
     set(nice_${the_library}_PROGFILES_SRC "")
+    set(nice_${the_library}_MEXFILES_SRC "")
     set(nice_${the_library}_SRC"")
     
 
@@ -86,6 +87,9 @@ macro(nice_get_source_files)
         elseif( t_SrcFile MATCHES "progs/" )
           #message(STATUS "prog: ${t_SrcFile}")
           LIST(APPEND nice_${the_library}_PROGFILES_SRC ${t_SrcFile})
+	elseif( t_SrcFile MATCHES "Mex[.]" )
+	  message(STATUS "mex: ${t_SrcFile}")
+          LIST(APPEND nice_${the_library}_MEXFILES_SRC ${t_SrcFile})
         else()
           LIST(APPEND nice_${the_library}_SRC ${t_SrcFile})
         endif()
@@ -174,6 +178,30 @@ macro(nice_add_progs)
 
 endmacro()
 
+# Add mex output
+macro(nice_add_mexes)
+  if(WITH_MEX)
+    message(STATUS "building mexes:")
+    
+    foreach(__mexcpp ${nice_${the_library}_MEXFILES_SRC})
+      get_filename_component(__mexname ${__mexcpp} NAME_WE )
+      message(STATUS "mexname: ${__mexname} ${__mexcpp}")
+    
+      set(mex_target_name "${the_library}_${__mexname}")
+      ADD_LIBRARY("${mex_target_name}" SHARED ${__mexcpp})
+      TARGET_LINK_LIBRARIES(${mex_target_name} "nice_${the_library}")
+      SET_TARGET_PROPERTIES(${mex_target_name} PROPERTIES OUTPUT_NAME "${__mexname}")
+      SET_TARGET_PROPERTIES(${mex_target_name} PROPERTIES SUFFIX "${MEX_ENDING}")
+      SET_TARGET_PROPERTIES(${mex_target_name} PROPERTIES PREFIX "")
+      
+      INSTALL(TARGETS ${mex_target_name} DESTINATION "bin/${the_library}")
+      
+      SET_PROPERTY(TARGET ${mex_target_name} PROPERTY FOLDER "programs/${the_library}")
+    
+    endforeach()
+  endif()
+endmacro()
+
 # Create unit test (using library CppUnitTest) for all cpp files in the subvariable ${nice_${the_library}_TESTFILES_SRC}
 # and build them into "bin/${the_library}"
 #