From d176a8c5ce88dadf84cc9e02621da18c2e164886 Mon Sep 17 00:00:00 2001 From: Maximilian Sander Date: Mon, 26 May 2025 21:42:22 +0200 Subject: [PATCH] Fortran: Add support for [CMAKE_]Fortran_LINKER_LAUNCHER `CMAKE__LINKER_LAUNCHER` and `_LINKER_LAUNCHER` are already support for C, CXX, OBJC, and OBJCXX. Add Fortran. Closes: #26951 --- Help/prop_tgt/LANG_LINKER_LAUNCHER.rst | 11 +++++++++-- Help/release/dev/linker-launcher.rst | 7 +++++++ Help/variable/CMAKE_LANG_LINKER_LAUNCHER.rst | 10 +++++++++- Modules/CMakeFortranInformation.cmake | 5 +++++ Source/cmTarget.cxx | 2 ++ .../RunCMake/LinkerLauncher/Fortran-Build-stdout.txt | 1 + Tests/RunCMake/LinkerLauncher/Fortran-common.cmake | 3 +++ .../LinkerLauncher/Fortran-env-Build-stdout.txt | 1 + Tests/RunCMake/LinkerLauncher/Fortran-env.cmake | 1 + .../LinkerLauncher/Fortran-launch-Build-stdout.txt | 1 + .../Fortran-launch-env-Build-stdout.txt | 1 + .../RunCMake/LinkerLauncher/Fortran-launch-env.cmake | 3 +++ Tests/RunCMake/LinkerLauncher/Fortran-launch.cmake | 3 +++ Tests/RunCMake/LinkerLauncher/Fortran.cmake | 2 ++ Tests/RunCMake/LinkerLauncher/RunCMakeTest.cmake | 3 +++ Tests/RunCMake/LinkerLauncher/main.f90 | 4 ++++ 16 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 Help/release/dev/linker-launcher.rst create mode 100644 Tests/RunCMake/LinkerLauncher/Fortran-Build-stdout.txt create mode 100644 Tests/RunCMake/LinkerLauncher/Fortran-common.cmake create mode 100644 Tests/RunCMake/LinkerLauncher/Fortran-env-Build-stdout.txt create mode 100644 Tests/RunCMake/LinkerLauncher/Fortran-env.cmake create mode 100644 Tests/RunCMake/LinkerLauncher/Fortran-launch-Build-stdout.txt create mode 100644 Tests/RunCMake/LinkerLauncher/Fortran-launch-env-Build-stdout.txt create mode 100644 Tests/RunCMake/LinkerLauncher/Fortran-launch-env.cmake create mode 100644 Tests/RunCMake/LinkerLauncher/Fortran-launch.cmake create mode 100644 Tests/RunCMake/LinkerLauncher/Fortran.cmake create mode 100644 Tests/RunCMake/LinkerLauncher/main.f90 diff --git a/Help/prop_tgt/LANG_LINKER_LAUNCHER.rst b/Help/prop_tgt/LANG_LINKER_LAUNCHER.rst index d39ec203aa..1669504d97 100644 --- a/Help/prop_tgt/LANG_LINKER_LAUNCHER.rst +++ b/Help/prop_tgt/LANG_LINKER_LAUNCHER.rst @@ -3,8 +3,15 @@ .. versionadded:: 3.21 -This property is implemented only when ```` is ``C``, ``CXX``, -``OBJC``, or ``OBJCXX`` +This property is implemented only when ```` is one of: + +* ``C`` +* ``CXX`` +* ``OBJC`` +* ``OBJCXX`` +* ``Fortran`` + + .. versionadded:: 4.1 Specify a :ref:`semicolon-separated list ` containing a command line for a linker launching tool. The :ref:`Makefile Generators` and the diff --git a/Help/release/dev/linker-launcher.rst b/Help/release/dev/linker-launcher.rst new file mode 100644 index 0000000000..438bf3d988 --- /dev/null +++ b/Help/release/dev/linker-launcher.rst @@ -0,0 +1,7 @@ +linker-launcher +--------------- + +* :ref:`Makefile Generators` and :ref:`Ninja Generators` gained support + for adding a linker launcher with ``Fortran``. + See the :variable:`CMAKE__LINKER_LAUNCHER` variable + and :prop_tgt:`_LINKER_LAUNCHER` target property for details. diff --git a/Help/variable/CMAKE_LANG_LINKER_LAUNCHER.rst b/Help/variable/CMAKE_LANG_LINKER_LAUNCHER.rst index b76b9391b1..c28627976d 100644 --- a/Help/variable/CMAKE_LANG_LINKER_LAUNCHER.rst +++ b/Help/variable/CMAKE_LANG_LINKER_LAUNCHER.rst @@ -5,7 +5,15 @@ CMAKE__LINKER_LAUNCHER Default value for :prop_tgt:`_LINKER_LAUNCHER` target property. This variable is used to initialize the property on each target as it is created. -This is done only when ```` is ``C``, ``CXX``, ``OBJC``, or ``OBJCXX``. +This is done only when ```` is one of: + +* ``C`` +* ``CXX`` +* ``OBJC`` +* ``OBJCXX`` +* ``Fortran`` + + .. versionadded:: 4.1 This variable is initialized to the :envvar:`CMAKE__LINKER_LAUNCHER` environment variable if it is set. diff --git a/Modules/CMakeFortranInformation.cmake b/Modules/CMakeFortranInformation.cmake index 675e55831f..3f3a194a33 100644 --- a/Modules/CMakeFortranInformation.cmake +++ b/Modules/CMakeFortranInformation.cmake @@ -78,6 +78,11 @@ if(NOT CMAKE_Fortran_COMPILER_LAUNCHER AND DEFINED ENV{CMAKE_Fortran_COMPILER_LA CACHE STRING "Compiler launcher for Fortran.") endif() +if(NOT CMAKE_Fortran_LINKER_LAUNCHER AND DEFINED ENV{CMAKE_Fortran_LINKER_LAUNCHER}) + set(CMAKE_Fortran_LINKER_LAUNCHER "$ENV{CMAKE_Fortran_LINKER_LAUNCHER}" + CACHE STRING "Linker launcher for Fortran.") +endif() + include(CMakeCommonLanguageInclude) _cmake_common_language_platform_flags(Fortran) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 37da15644b..e0610fcd5d 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -457,6 +457,8 @@ TargetProperty const StaticTargetProperties[] = { { "OBJC_LINKER_LAUNCHER"_s, IC::CanCompileSources }, // ---- Objective C++ { "OBJCXX_LINKER_LAUNCHER"_s, IC::CanCompileSources }, + // ---- Fortran + { "Fortran_LINKER_LAUNCHER"_s, IC::CanCompileSources }, // Static analysis // -- C diff --git a/Tests/RunCMake/LinkerLauncher/Fortran-Build-stdout.txt b/Tests/RunCMake/LinkerLauncher/Fortran-Build-stdout.txt new file mode 100644 index 0000000000..3313e31f63 --- /dev/null +++ b/Tests/RunCMake/LinkerLauncher/Fortran-Build-stdout.txt @@ -0,0 +1 @@ +.*-E env USED_LAUNCHER=1.* diff --git a/Tests/RunCMake/LinkerLauncher/Fortran-common.cmake b/Tests/RunCMake/LinkerLauncher/Fortran-common.cmake new file mode 100644 index 0000000000..014efdcea0 --- /dev/null +++ b/Tests/RunCMake/LinkerLauncher/Fortran-common.cmake @@ -0,0 +1,3 @@ +enable_language(Fortran) +set(CMAKE_VERBOSE_MAKEFILE TRUE) +add_executable(main main.f90) diff --git a/Tests/RunCMake/LinkerLauncher/Fortran-env-Build-stdout.txt b/Tests/RunCMake/LinkerLauncher/Fortran-env-Build-stdout.txt new file mode 100644 index 0000000000..9f8c7541c8 --- /dev/null +++ b/Tests/RunCMake/LinkerLauncher/Fortran-env-Build-stdout.txt @@ -0,0 +1 @@ +.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=Fortran.* diff --git a/Tests/RunCMake/LinkerLauncher/Fortran-env.cmake b/Tests/RunCMake/LinkerLauncher/Fortran-env.cmake new file mode 100644 index 0000000000..3dc27c3933 --- /dev/null +++ b/Tests/RunCMake/LinkerLauncher/Fortran-env.cmake @@ -0,0 +1 @@ +include(Fortran-common.cmake) diff --git a/Tests/RunCMake/LinkerLauncher/Fortran-launch-Build-stdout.txt b/Tests/RunCMake/LinkerLauncher/Fortran-launch-Build-stdout.txt new file mode 100644 index 0000000000..3313e31f63 --- /dev/null +++ b/Tests/RunCMake/LinkerLauncher/Fortran-launch-Build-stdout.txt @@ -0,0 +1 @@ +.*-E env USED_LAUNCHER=1.* diff --git a/Tests/RunCMake/LinkerLauncher/Fortran-launch-env-Build-stdout.txt b/Tests/RunCMake/LinkerLauncher/Fortran-launch-env-Build-stdout.txt new file mode 100644 index 0000000000..9f8c7541c8 --- /dev/null +++ b/Tests/RunCMake/LinkerLauncher/Fortran-launch-env-Build-stdout.txt @@ -0,0 +1 @@ +.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=Fortran.* diff --git a/Tests/RunCMake/LinkerLauncher/Fortran-launch-env.cmake b/Tests/RunCMake/LinkerLauncher/Fortran-launch-env.cmake new file mode 100644 index 0000000000..30a196c8b3 --- /dev/null +++ b/Tests/RunCMake/LinkerLauncher/Fortran-launch-env.cmake @@ -0,0 +1,3 @@ +set(CTEST_USE_LAUNCHERS 1) +include(CTestUseLaunchers) +include(Fortran-env.cmake) diff --git a/Tests/RunCMake/LinkerLauncher/Fortran-launch.cmake b/Tests/RunCMake/LinkerLauncher/Fortran-launch.cmake new file mode 100644 index 0000000000..7e9a564795 --- /dev/null +++ b/Tests/RunCMake/LinkerLauncher/Fortran-launch.cmake @@ -0,0 +1,3 @@ +set(CTEST_USE_LAUNCHERS 1) +include(CTestUseLaunchers) +include(Fortran.cmake) diff --git a/Tests/RunCMake/LinkerLauncher/Fortran.cmake b/Tests/RunCMake/LinkerLauncher/Fortran.cmake new file mode 100644 index 0000000000..79d16c5f8a --- /dev/null +++ b/Tests/RunCMake/LinkerLauncher/Fortran.cmake @@ -0,0 +1,2 @@ +set(CMAKE_Fortran_LINKER_LAUNCHER "${CMAKE_COMMAND};-E;env;USED_LAUNCHER=1") +include(Fortran-common.cmake) diff --git a/Tests/RunCMake/LinkerLauncher/RunCMakeTest.cmake b/Tests/RunCMake/LinkerLauncher/RunCMakeTest.cmake index 025f367844..754377ccca 100644 --- a/Tests/RunCMake/LinkerLauncher/RunCMakeTest.cmake +++ b/Tests/RunCMake/LinkerLauncher/RunCMakeTest.cmake @@ -24,6 +24,9 @@ function(run_linker_launcher_env lang) endfunction() set(langs C CXX) +if(CMake_TEST_Fortran) + list(APPEND langs Fortran) +endif() if(CMake_TEST_OBJC) list(APPEND langs OBJC OBJCXX) endif() diff --git a/Tests/RunCMake/LinkerLauncher/main.f90 b/Tests/RunCMake/LinkerLauncher/main.f90 new file mode 100644 index 0000000000..ce59e23e87 --- /dev/null +++ b/Tests/RunCMake/LinkerLauncher/main.f90 @@ -0,0 +1,4 @@ +program main + implicit none + ! Do nothing +end program main