diff options
author | Silvio <silvio@traversaro.it> | 2022-04-03 15:25:12 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2022-04-05 12:27:09 (GMT) |
commit | 178cf34bdc5234e07442d0007c39e2d184b4261f (patch) | |
tree | 19c93e758675df831ef5abafa9099da368258f7d | |
parent | fff8f3bee92d9f139c48cdc194ca826447fc402a (diff) | |
download | CMake-178cf34bdc5234e07442d0007c39e2d184b4261f.zip CMake-178cf34bdc5234e07442d0007c39e2d184b4261f.tar.gz CMake-178cf34bdc5234e07442d0007c39e2d184b4261f.tar.bz2 |
FindMatlab: Add NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES option to matlab_add_mex
-rw-r--r-- | Help/release/dev/FindMatlab-no-implicit-link.txt | 6 | ||||
-rw-r--r-- | Modules/FindMatlab.cmake | 31 | ||||
-rw-r--r-- | Tests/CMakeLists.txt | 3 | ||||
-rw-r--r-- | Tests/FindMatlab/no_implicit_link_checks/CMakeLists.txt | 70 |
4 files changed, 100 insertions, 10 deletions
diff --git a/Help/release/dev/FindMatlab-no-implicit-link.txt b/Help/release/dev/FindMatlab-no-implicit-link.txt new file mode 100644 index 0000000..7ecc17f --- /dev/null +++ b/Help/release/dev/FindMatlab-no-implicit-link.txt @@ -0,0 +1,6 @@ +FindMatlab-no-implicit-link +--------------------------- + +* The :module:`FindMatlab` module :command:`matlab_add_mex` function + gained a ``NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES`` option to disable + automatic linking of MATLAB libraries. diff --git a/Modules/FindMatlab.cmake b/Modules/FindMatlab.cmake index 81bc473..48ef5eb 100644 --- a/Modules/FindMatlab.cmake +++ b/Modules/FindMatlab.cmake @@ -1020,6 +1020,7 @@ endfunction() [LINK_TO target1 target2 ...] [R2017b | R2018a] [EXCLUDE_FROM_ALL] + [NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES] [...] ) @@ -1029,7 +1030,8 @@ endfunction() list of source files. ``LINK_TO`` a list of additional link dependencies. The target links to ``libmex`` - and ``libmx`` by default. + and ``libmx`` by default, unless the + ``NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES`` option is passed. ``OUTPUT_NAME`` if given, overrides the default name. The default name is the name of the target without any prefix and @@ -1065,6 +1067,12 @@ endfunction() This option has the same meaning as for :prop_tgt:`EXCLUDE_FROM_ALL` and is forwarded to :command:`add_library` or :command:`add_executable` commands. + ``NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES`` + .. versionadded:: 3.24 + + This option permits to disable the automatic linking of MATLAB + libraries, so that only the libraries that are actually required can be + linked via the ``LINK_TO`` option. The documentation file is not processed and should be in the following format: @@ -1091,7 +1099,7 @@ function(matlab_add_mex) endif() - set(options EXECUTABLE MODULE SHARED R2017b R2018a EXCLUDE_FROM_ALL) + set(options EXECUTABLE MODULE SHARED R2017b R2018a EXCLUDE_FROM_ALL NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES) set(oneValueArgs NAME DOCUMENTATION OUTPUT_NAME) set(multiValueArgs LINK_TO SRC) @@ -1163,16 +1171,19 @@ function(matlab_add_mex) target_include_directories(${${prefix}_NAME} PRIVATE ${Matlab_INCLUDE_DIRS}) - if(Matlab_HAS_CPP_API) - if(Matlab_ENGINE_LIBRARY) - target_link_libraries(${${prefix}_NAME} ${Matlab_ENGINE_LIBRARY}) - endif() - if(Matlab_DATAARRAY_LIBRARY) - target_link_libraries(${${prefix}_NAME} ${Matlab_DATAARRAY_LIBRARY}) + if(NOT ${prefix}_NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES) + if(Matlab_HAS_CPP_API) + if(Matlab_ENGINE_LIBRARY) + target_link_libraries(${${prefix}_NAME} ${Matlab_ENGINE_LIBRARY}) + endif() + if(Matlab_DATAARRAY_LIBRARY) + target_link_libraries(${${prefix}_NAME} ${Matlab_DATAARRAY_LIBRARY}) + endif() endif() - endif() - target_link_libraries(${${prefix}_NAME} ${Matlab_MEX_LIBRARY} ${Matlab_MX_LIBRARY} ${${prefix}_LINK_TO}) + target_link_libraries(${${prefix}_NAME} ${Matlab_MEX_LIBRARY} ${Matlab_MX_LIBRARY}) + endif() + target_link_libraries(${${prefix}_NAME} ${${prefix}_LINK_TO}) set_target_properties(${${prefix}_NAME} PROPERTIES PREFIX "" diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 3ce9b48..d663a14 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -1558,6 +1558,9 @@ if(BUILD_TESTING) set(FindMatlab.targets_checks_BUILD_OPTIONS ${FindMatlab_additional_test_options}) ADD_TEST_MACRO(FindMatlab.targets_checks ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>) set_property(TEST FindMatlab.targets_checks APPEND PROPERTY LABELS "Matlab") + set(FindMatlab.no_implicit_link_checks_BUILD_OPTIONS ${FindMatlab_additional_test_options}) + ADD_TEST_MACRO(FindMatlab.no_implicit_link_checks ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>) + set_property(TEST FindMatlab.no_implicit_link_checks APPEND PROPERTY LABELS "Matlab") endif() set(ExternalProject_BUILD_OPTIONS "") diff --git a/Tests/FindMatlab/no_implicit_link_checks/CMakeLists.txt b/Tests/FindMatlab/no_implicit_link_checks/CMakeLists.txt new file mode 100644 index 0000000..bceeba1 --- /dev/null +++ b/Tests/FindMatlab/no_implicit_link_checks/CMakeLists.txt @@ -0,0 +1,70 @@ + +cmake_minimum_required (VERSION 2.8.12) +enable_testing() +project(no_implicit_links_checks) + +set(MATLAB_FIND_DEBUG TRUE) + +if(IS_MCR) + set(RUN_UNIT_TESTS FALSE) +else() + set(RUN_UNIT_TESTS TRUE) + set(components MAIN_PROGRAM) +endif() + +if(NOT "${MCR_ROOT}" STREQUAL "") + set(Matlab_ROOT_DIR "${MCR_ROOT}") + if(NOT EXISTS "${MCR_ROOT}") + message(FATAL_ERROR "MCR does not exist ${MCR_ROOT}") + endif() +endif() + +find_package(Matlab REQUIRED COMPONENTS ${components}) + + +matlab_add_mex( + # target name + NAME cmake_matlab_test_wrapper1 + # output name + OUTPUT_NAME cmake_matlab_mex1 + SRC ${CMAKE_CURRENT_SOURCE_DIR}/../matlab_wrapper1.cpp + DOCUMENTATION ${CMAKE_CURRENT_SOURCE_DIR}/../help_text1.m.txt + NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES + ) + +# Inspect the LINK_LIBRARIES properties to check if mex or mx are present +get_target_property(MATLAB_TEST_WRAPPER1_LINK_LIBRARIES + cmake_matlab_test_wrapper1 LINK_LIBRARIES) + +string(FIND "${MATLAB_TEST_WRAPPER1_LINK_LIBRARIES}" "mx" SEARCH_RESULT) +if(NOT "${SEARCH_RESULT}" EQUAL "-1") + message(FATAL_ERROR "Matlab::mx linked even if NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES was passed") +endif() + +string(FIND "${MATLAB_TEST_WRAPPER1_LINK_LIBRARIES}" "mex" SEARCH_RESULT) +if(NOT "${SEARCH_RESULT}" EQUAL "-1") + message(FATAL_ERROR "Matlab::mex linked even if NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES was passed") +endif() + +string(FIND "${MATLAB_TEST_WRAPPER1_LINK_LIBRARIES}" "MatlabEngine" SEARCH_RESULT) +if(NOT "${SEARCH_RESULT}" EQUAL "-1") + message(FATAL_ERROR "Matlab::MatlabEngine linked even if NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES was passed") +endif() + +string(FIND "${MATLAB_TEST_WRAPPER1_LINK_LIBRARIES}" "MatlabDataArray" SEARCH_RESULT) +if(NOT "${SEARCH_RESULT}" EQUAL "-1") + message(FATAL_ERROR "Matlab::MatlabDataArray linked even if NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES was passed") +endif() + +# Link separately with Matlab::mx and Matlab::mex to ensure that compilation +# and run of the test is successful +target_link_libraries(cmake_matlab_test_wrapper1 PRIVATE Matlab::mx Matlab::mex) + +if(RUN_UNIT_TESTS) + matlab_add_unit_test( + NAME ${PROJECT_NAME}_matlabtest-1 + TIMEOUT 300 + UNITTEST_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../cmake_matlab_unit_tests1.m + ADDITIONAL_PATH $<TARGET_FILE_DIR:cmake_matlab_test_wrapper1> + ) +endif() |