diff options
-rw-r--r-- | Help/command/try_compile.rst | 9 | ||||
-rw-r--r-- | Help/command/try_run.rst | 1 | ||||
-rw-r--r-- | Help/dev/try_compile-linker-language.rst | 6 | ||||
-rw-r--r-- | Source/cmCoreTryCompile.cxx | 14 | ||||
-rw-r--r-- | Source/cmCoreTryCompile.h | 1 | ||||
-rw-r--r-- | Tests/RunCMake/CMakeLists.txt | 4 | ||||
-rw-r--r-- | Tests/RunCMake/try_run/LinkerLanguage.cmake | 29 | ||||
-rw-r--r-- | Tests/RunCMake/try_run/RunCMakeTest.cmake | 10 | ||||
-rw-r--r-- | Tests/RunCMake/try_run/lib.cxx | 4 | ||||
-rw-r--r-- | Tests/RunCMake/try_run/main.f90 | 12 |
10 files changed, 89 insertions, 1 deletions
diff --git a/Help/command/try_compile.rst b/Help/command/try_compile.rst index 0255b4d..24d481b 100644 --- a/Help/command/try_compile.rst +++ b/Help/command/try_compile.rst @@ -77,6 +77,7 @@ Try Compiling Source Files [COMPILE_DEFINITIONS <defs>...] [LINK_OPTIONS <options>...] [LINK_LIBRARIES <libs>...] + [LINKER_LANGUAGE <lang>] [OUTPUT_VARIABLE <var>] [COPY_FILE <fileName> [COPY_FILE_ERROR <var>]] [<LANG>_STANDARD <std>] @@ -184,6 +185,14 @@ The options for the above signatures are: set the :prop_tgt:`STATIC_LIBRARY_OPTIONS` target property in the generated project, depending on the :variable:`CMAKE_TRY_COMPILE_TARGET_TYPE` variable. +``LINKER_LANGUAGE <lang>``` + .. versionadded:: 3.29 + + Specify the :prop_tgt:`LINKER_LANGUAGE` target property of the generated + project. When using multiple source files with different languages, set + this to the language of the source file containing the program entry point, + e.g., ``main``. + ``LOG_DESCRIPTION <text>`` .. versionadded:: 3.26 diff --git a/Help/command/try_run.rst b/Help/command/try_run.rst index 1b5087d..c466a81 100644 --- a/Help/command/try_run.rst +++ b/Help/command/try_run.rst @@ -67,6 +67,7 @@ The signature above is recommended for clarity. [COMPILE_DEFINITIONS <defs>...] [LINK_OPTIONS <options>...] [LINK_LIBRARIES <libs>...] + [LINKER_LANGUAGE <lang>] [COMPILE_OUTPUT_VARIABLE <var>] [COPY_FILE <fileName> [COPY_FILE_ERROR <var>]] [<LANG>_STANDARD <std>] diff --git a/Help/dev/try_compile-linker-language.rst b/Help/dev/try_compile-linker-language.rst new file mode 100644 index 0000000..8482dee --- /dev/null +++ b/Help/dev/try_compile-linker-language.rst @@ -0,0 +1,6 @@ +try_compile-linker-language +--------------------------- + +* The :command:`try_compile` and :command:`try_run` commands gained a + ``LINKER_LANGUAGE`` option to specify the :prop_tgt:`LINKER_LANGUAGE` + target property in the generated test project. diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx index 7e19812..2d2b0af 100644 --- a/Source/cmCoreTryCompile.cxx +++ b/Source/cmCoreTryCompile.cxx @@ -176,6 +176,7 @@ auto const TryCompileBaseSourcesArgParser = ArgumentParser::ExpectAtLeast{ 0 }) .Bind("LINK_LIBRARIES"_s, &Arguments::LinkLibraries) .Bind("LINK_OPTIONS"_s, &Arguments::LinkOptions) + .Bind("LINKER_LANGUAGE"_s, &Arguments::LinkerLanguage) .Bind("COPY_FILE"_s, &Arguments::CopyFileTo) .Bind("COPY_FILE_ERROR"_s, &Arguments::CopyFileError) .BIND_LANG_PROPS(C) @@ -1043,6 +1044,19 @@ cm::optional<cmTryCompileResult> cmCoreTryCompile::TryCompileCode( } } + if (arguments.LinkerLanguage) { + std::string LinkerLanguage = *arguments.LinkerLanguage; + if (testLangs.find(LinkerLanguage) == testLangs.end()) { + this->Makefile->IssueMessage( + MessageType::FATAL_ERROR, + "Linker language '" + LinkerLanguage + + "' must be enabled in project(LANGUAGES)."); + } + + fprintf(fout, "set_property(TARGET %s PROPERTY LINKER_LANGUAGE %s)\n", + targetName.c_str(), LinkerLanguage.c_str()); + } + if (arguments.LinkLibraries) { std::string libsToLink = " "; for (std::string const& i : *arguments.LinkLibraries) { diff --git a/Source/cmCoreTryCompile.h b/Source/cmCoreTryCompile.h index 3217a1b..6a26e88 100644 --- a/Source/cmCoreTryCompile.h +++ b/Source/cmCoreTryCompile.h @@ -91,6 +91,7 @@ public: cm::optional<ArgumentParser::MaybeEmpty<std::vector<std::string>>> LinkLibraries; ArgumentParser::MaybeEmpty<std::vector<std::string>> LinkOptions; + cm::optional<std::string> LinkerLanguage; std::map<std::string, std::string> LangProps; std::string CMakeInternal; cm::optional<std::string> OutputVariable; diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 4387c5b..6da9c91 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -583,7 +583,9 @@ endfunction() add_RunCMake_test_try_compile() add_RunCMake_test(try_run -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} - -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}) + -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID} + -DCMAKE_CXX_COMPILER_ID=${CMAKE_CXX_COMPILER_ID} + -DCMAKE_Fortran_COMPILER_ID=${CMAKE_Fortran_COMPILER_ID}) add_RunCMake_test(set) add_RunCMake_test(variable_watch) add_RunCMake_test(while) diff --git a/Tests/RunCMake/try_run/LinkerLanguage.cmake b/Tests/RunCMake/try_run/LinkerLanguage.cmake new file mode 100644 index 0000000..137e198 --- /dev/null +++ b/Tests/RunCMake/try_run/LinkerLanguage.cmake @@ -0,0 +1,29 @@ +enable_language(CXX) +enable_language(Fortran) + +set (lib_name "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}lib${CMAKE_STATIC_LIBRARY_SUFFIX}") +if (CMAKE_SYSTEM_NAME STREQUAL "Windows") + if (CMAKE_SIZEOF_VOID_P EQUAL 4) + set (undef_flag -u _func) + else() + set (undef_flag -u func) + endif() +elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin") + set (undef_flag -u _func) +else() + set (undef_flag -u func) +endif() + +set(CMAKE_TRY_COMPILE_TARGET_TYPE EXECUTABLE) +try_run(run_result compile_result + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/lib.cxx ${CMAKE_CURRENT_SOURCE_DIR}/main.f90 + COMPILE_OUTPUT_VARIABLE compile_out + RUN_OUTPUT_VARIABLE run_out + LINKER_LANGUAGE Fortran) + +if(NOT compile_result) + message(FATAL_ERROR "try_run(... LINKER_LANGUAGE Fortran) compilation failed:\n${compile_out}") +endif() +if(run_result STREQUAL "FAILED_TO_RUN") + message(FATAL_ERROR "try_run(... LINKER_LANGUAGE Fortran) execution failed:\n${run_out}") +endif() diff --git a/Tests/RunCMake/try_run/RunCMakeTest.cmake b/Tests/RunCMake/try_run/RunCMakeTest.cmake index 62e3caf..bd7cd9b 100644 --- a/Tests/RunCMake/try_run/RunCMakeTest.cmake +++ b/Tests/RunCMake/try_run/RunCMakeTest.cmake @@ -19,3 +19,13 @@ if (CMAKE_SYSTEM_NAME MATCHES "^(Linux|Darwin|Windows)$" AND run_cmake(LinkOptions) unset (RunCMake_TEST_OPTIONS) endif() + +if (CMAKE_SYSTEM_NAME MATCHES "^(Linux|Darwin|Windows)$" AND + CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$" AND + CMAKE_Fortran_COMPILER_ID MATCHES "^(GNU)$") + set (RunCMake_TEST_OPTIONS + -DRunCMake_CXX_COMPILER_ID=${CMAKE_CXX_COMPILER_ID} + -DRunCMake_Fortran_COMPILER_ID=${CMAKE_Fortran_COMPILER_ID}) + run_cmake(LinkerLanguage) + unset (RunCMake_TEST_OPTIONS) +endif() diff --git a/Tests/RunCMake/try_run/lib.cxx b/Tests/RunCMake/try_run/lib.cxx new file mode 100644 index 0000000..b01a075 --- /dev/null +++ b/Tests/RunCMake/try_run/lib.cxx @@ -0,0 +1,4 @@ + +extern "C" void func() +{ +} diff --git a/Tests/RunCMake/try_run/main.f90 b/Tests/RunCMake/try_run/main.f90 new file mode 100644 index 0000000..29b933e --- /dev/null +++ b/Tests/RunCMake/try_run/main.f90 @@ -0,0 +1,12 @@ +program main + +implicit none + +interface +subroutine func() bind(C) +end subroutine +end interface + +call func() + +end program |