浏览代码

launcher: support setting a compiler launcher through the environment

This makes it much easier to use a launcher for all CMake projects in an
environment rather than having to remember to pass the setting to every
CMake build.
Ben Boeckel 5 年之前
父节点
当前提交
6f48c59257
共有 33 个文件被更改,包括 88 次插入12 次删除
  1. 10 0
      Help/envvar/CMAKE_LANG_COMPILER_LAUNCHER.rst
  2. 1 0
      Help/manual/cmake-env-variables.7.rst
  3. 5 0
      Help/release/dev/compiler-launcher-env.rst
  4. 3 0
      Help/variable/CMAKE_LANG_COMPILER_LAUNCHER.rst
  5. 5 0
      Modules/CMakeCInformation.cmake
  6. 5 0
      Modules/CMakeCUDAInformation.cmake
  7. 5 0
      Modules/CMakeCXXInformation.cmake
  8. 5 0
      Modules/CMakeFortranInformation.cmake
  9. 3 0
      Tests/RunCMake/CompilerLauncher/C-common.cmake
  10. 1 0
      Tests/RunCMake/CompilerLauncher/C-env-Build-stdout.txt
  11. 1 0
      Tests/RunCMake/CompilerLauncher/C-env-launch-Build-stdout.txt
  12. 1 0
      Tests/RunCMake/CompilerLauncher/C-env.cmake
  13. 3 0
      Tests/RunCMake/CompilerLauncher/C-launch-env.cmake
  14. 1 3
      Tests/RunCMake/CompilerLauncher/C.cmake
  15. 3 0
      Tests/RunCMake/CompilerLauncher/CUDA-common.cmake
  16. 1 0
      Tests/RunCMake/CompilerLauncher/CUDA-env-Build-stdout.txt
  17. 1 0
      Tests/RunCMake/CompilerLauncher/CUDA-env-launch-Build-stdout.txt
  18. 1 0
      Tests/RunCMake/CompilerLauncher/CUDA-env.cmake
  19. 3 0
      Tests/RunCMake/CompilerLauncher/CUDA-launch-env.cmake
  20. 1 3
      Tests/RunCMake/CompilerLauncher/CUDA.cmake
  21. 3 0
      Tests/RunCMake/CompilerLauncher/CXX-common.cmake
  22. 1 0
      Tests/RunCMake/CompilerLauncher/CXX-env-Build-stdout.txt
  23. 1 0
      Tests/RunCMake/CompilerLauncher/CXX-env-launch-Build-stdout.txt
  24. 1 0
      Tests/RunCMake/CompilerLauncher/CXX-env.cmake
  25. 3 0
      Tests/RunCMake/CompilerLauncher/CXX-launch-env.cmake
  26. 1 3
      Tests/RunCMake/CompilerLauncher/CXX.cmake
  27. 3 0
      Tests/RunCMake/CompilerLauncher/Fortran-common.cmake
  28. 1 0
      Tests/RunCMake/CompilerLauncher/Fortran-env-Build-stdout.txt
  29. 1 0
      Tests/RunCMake/CompilerLauncher/Fortran-env-launch-Build-stdout.txt
  30. 1 0
      Tests/RunCMake/CompilerLauncher/Fortran-env.cmake
  31. 3 0
      Tests/RunCMake/CompilerLauncher/Fortran-launch-env.cmake
  32. 1 3
      Tests/RunCMake/CompilerLauncher/Fortran.cmake
  33. 9 0
      Tests/RunCMake/CompilerLauncher/RunCMakeTest.cmake

+ 10 - 0
Help/envvar/CMAKE_LANG_COMPILER_LAUNCHER.rst

@@ -0,0 +1,10 @@
+CMAKE_<LANG>_COMPILER_LAUNCHER
+------------------------------
+
+.. include:: ENV_VAR.txt
+
+Default compiler launcher to use for the specified language. Will only be used
+by CMake to initialize the variable on the first configuration. Afterwards, it
+is available through the cache setting of the variable of the same name. For
+any configuration run (including the first), the environment variable will be
+ignored if the :variable:`CMAKE_<LANG>_COMPILER_LAUNCHER` variable is defined.

+ 1 - 0
Help/manual/cmake-env-variables.7.rst

@@ -28,6 +28,7 @@ Environment Variables that Control the Build
    /envvar/CMAKE_GENERATOR_INSTANCE
    /envvar/CMAKE_GENERATOR_INSTANCE
    /envvar/CMAKE_GENERATOR_PLATFORM
    /envvar/CMAKE_GENERATOR_PLATFORM
    /envvar/CMAKE_GENERATOR_TOOLSET
    /envvar/CMAKE_GENERATOR_TOOLSET
+   /envvar/CMAKE_LANG_COMPILER_LAUNCHER
    /envvar/CMAKE_MSVCIDE_RUN_PATH
    /envvar/CMAKE_MSVCIDE_RUN_PATH
    /envvar/CMAKE_NO_VERBOSE
    /envvar/CMAKE_NO_VERBOSE
    /envvar/CMAKE_OSX_ARCHITECTURES
    /envvar/CMAKE_OSX_ARCHITECTURES

+ 5 - 0
Help/release/dev/compiler-launcher-env.rst

@@ -0,0 +1,5 @@
+compiler-launcher-env
+---------------------
+
+* The :envvar:`CMAKE_<LANG>_COMPILER_LAUNCHER` environment variable may now be
+  used to initialize the :variable:`CMAKE_<LANG>_COMPILER_LAUNCHER` variable.

+ 3 - 0
Help/variable/CMAKE_LANG_COMPILER_LAUNCHER.rst

@@ -5,3 +5,6 @@ Default value for :prop_tgt:`<LANG>_COMPILER_LAUNCHER` target property.
 This variable is used to initialize the property on each target as it is
 This variable is used to initialize the property on each target as it is
 created.  This is done only when ``<LANG>`` is ``C``, ``CXX``, ``Fortran``,
 created.  This is done only when ``<LANG>`` is ``C``, ``CXX``, ``Fortran``,
 or ``CUDA``.
 or ``CUDA``.
+
+This variable is initialized to the :envvar:`CMAKE_<LANG>_COMPILER_LAUNCHER`
+environment variable if it is set.

+ 5 - 0
Modules/CMakeCInformation.cmake

@@ -110,6 +110,11 @@ if(CMAKE_C_STANDARD_LIBRARIES_INIT)
   mark_as_advanced(CMAKE_C_STANDARD_LIBRARIES)
   mark_as_advanced(CMAKE_C_STANDARD_LIBRARIES)
 endif()
 endif()
 
 
+if(NOT CMAKE_C_COMPILER_LAUNCHER AND DEFINED ENV{CMAKE_C_COMPILER_LAUNCHER})
+  set(CMAKE_C_COMPILER_LAUNCHER "$ENV{CMAKE_C_COMPILER_LAUNCHER}"
+    CACHE STRING "Compiler launcher for C.")
+endif()
+
 include(CMakeCommonLanguageInclude)
 include(CMakeCommonLanguageInclude)
 
 
 # now define the following rule variables
 # now define the following rule variables

+ 5 - 0
Modules/CMakeCUDAInformation.cmake

@@ -82,6 +82,11 @@ if(CMAKE_CUDA_STANDARD_LIBRARIES_INIT)
   mark_as_advanced(CMAKE_CUDA_STANDARD_LIBRARIES)
   mark_as_advanced(CMAKE_CUDA_STANDARD_LIBRARIES)
 endif()
 endif()
 
 
+if(NOT CMAKE_CUDA_COMPILER_LAUNCHER AND DEFINED ENV{CMAKE_CUDA_COMPILER_LAUNCHER})
+  set(CMAKE_CUDA_COMPILER_LAUNCHER "$ENV{CMAKE_CUDA_COMPILER_LAUNCHER}"
+    CACHE STRING "Compiler launcher for CUDA.")
+endif()
+
 include(CMakeCommonLanguageInclude)
 include(CMakeCommonLanguageInclude)
 
 
 # now define the following rules:
 # now define the following rules:

+ 5 - 0
Modules/CMakeCXXInformation.cmake

@@ -207,6 +207,11 @@ if(CMAKE_CXX_STANDARD_LIBRARIES_INIT)
   mark_as_advanced(CMAKE_CXX_STANDARD_LIBRARIES)
   mark_as_advanced(CMAKE_CXX_STANDARD_LIBRARIES)
 endif()
 endif()
 
 
+if(NOT CMAKE_CXX_COMPILER_LAUNCHER AND DEFINED ENV{CMAKE_CXX_COMPILER_LAUNCHER})
+  set(CMAKE_CXX_COMPILER_LAUNCHER "$ENV{CMAKE_CXX_COMPILER_LAUNCHER}"
+    CACHE STRING "Compiler launcher for CXX.")
+endif()
+
 include(CMakeCommonLanguageInclude)
 include(CMakeCommonLanguageInclude)
 
 
 # now define the following rules:
 # now define the following rules:

+ 5 - 0
Modules/CMakeFortranInformation.cmake

@@ -163,6 +163,11 @@ set(CMAKE_Fortran_FLAGS_INIT "$ENV{FFLAGS} ${CMAKE_Fortran_FLAGS_INIT}")
 
 
 cmake_initialize_per_config_variable(CMAKE_Fortran_FLAGS "Flags used by the Fortran compiler")
 cmake_initialize_per_config_variable(CMAKE_Fortran_FLAGS "Flags used by the Fortran compiler")
 
 
+if(NOT CMAKE_Fortran_COMPILER_LAUNCHER AND DEFINED ENV{CMAKE_Fortran_COMPILER_LAUNCHER})
+  set(CMAKE_Fortran_COMPILER_LAUNCHER "$ENV{CMAKE_Fortran_COMPILER_LAUNCHER}"
+    CACHE STRING "Compiler launcher for Fortran.")
+endif()
+
 include(CMakeCommonLanguageInclude)
 include(CMakeCommonLanguageInclude)
 
 
 # now define the following rule variables
 # now define the following rule variables

+ 3 - 0
Tests/RunCMake/CompilerLauncher/C-common.cmake

@@ -0,0 +1,3 @@
+enable_language(C)
+set(CMAKE_VERBOSE_MAKEFILE TRUE)
+add_executable(main main.c)

+ 1 - 0
Tests/RunCMake/CompilerLauncher/C-env-Build-stdout.txt

@@ -0,0 +1 @@
+.*-E env USED_LAUNCHER=1.*

+ 1 - 0
Tests/RunCMake/CompilerLauncher/C-env-launch-Build-stdout.txt

@@ -0,0 +1 @@
+.*-E env USED_LAUNCHER=1.*

+ 1 - 0
Tests/RunCMake/CompilerLauncher/C-env.cmake

@@ -0,0 +1 @@
+include(C-common.cmake)

+ 3 - 0
Tests/RunCMake/CompilerLauncher/C-launch-env.cmake

@@ -0,0 +1,3 @@
+set(CTEST_USE_LAUNCHERS 1)
+include(CTestUseLaunchers)
+include(C-env.cmake)

+ 1 - 3
Tests/RunCMake/CompilerLauncher/C.cmake

@@ -1,4 +1,2 @@
-enable_language(C)
 set(CMAKE_C_COMPILER_LAUNCHER "${CMAKE_COMMAND};-E;env;USED_LAUNCHER=1")
 set(CMAKE_C_COMPILER_LAUNCHER "${CMAKE_COMMAND};-E;env;USED_LAUNCHER=1")
-set(CMAKE_VERBOSE_MAKEFILE TRUE)
-add_executable(main main.c)
+include(C-common.cmake)

+ 3 - 0
Tests/RunCMake/CompilerLauncher/CUDA-common.cmake

@@ -0,0 +1,3 @@
+enable_language(CUDA)
+set(CMAKE_VERBOSE_MAKEFILE TRUE)
+add_executable(main main.cu)

+ 1 - 0
Tests/RunCMake/CompilerLauncher/CUDA-env-Build-stdout.txt

@@ -0,0 +1 @@
+.*-E env USED_LAUNCHER=1.*

+ 1 - 0
Tests/RunCMake/CompilerLauncher/CUDA-env-launch-Build-stdout.txt

@@ -0,0 +1 @@
+.*-E env USED_LAUNCHER=1.*

+ 1 - 0
Tests/RunCMake/CompilerLauncher/CUDA-env.cmake

@@ -0,0 +1 @@
+include(CUDA-common.cmake)

+ 3 - 0
Tests/RunCMake/CompilerLauncher/CUDA-launch-env.cmake

@@ -0,0 +1,3 @@
+set(CTEST_USE_LAUNCHERS 1)
+include(CTestUseLaunchers)
+include(CUDA-env.cmake)

+ 1 - 3
Tests/RunCMake/CompilerLauncher/CUDA.cmake

@@ -1,4 +1,2 @@
-enable_language(CUDA)
 set(CMAKE_CUDA_COMPILER_LAUNCHER "${CMAKE_COMMAND};-E;env;USED_LAUNCHER=1")
 set(CMAKE_CUDA_COMPILER_LAUNCHER "${CMAKE_COMMAND};-E;env;USED_LAUNCHER=1")
-set(CMAKE_VERBOSE_MAKEFILE TRUE)
-add_executable(main main.cu)
+include(CUDA-common.cmake)

+ 3 - 0
Tests/RunCMake/CompilerLauncher/CXX-common.cmake

@@ -0,0 +1,3 @@
+enable_language(CXX)
+set(CMAKE_VERBOSE_MAKEFILE TRUE)
+add_executable(main main.cxx)

+ 1 - 0
Tests/RunCMake/CompilerLauncher/CXX-env-Build-stdout.txt

@@ -0,0 +1 @@
+.*-E env USED_LAUNCHER=1.*

+ 1 - 0
Tests/RunCMake/CompilerLauncher/CXX-env-launch-Build-stdout.txt

@@ -0,0 +1 @@
+.*-E env USED_LAUNCHER=1.*

+ 1 - 0
Tests/RunCMake/CompilerLauncher/CXX-env.cmake

@@ -0,0 +1 @@
+include(CXX-common.cmake)

+ 3 - 0
Tests/RunCMake/CompilerLauncher/CXX-launch-env.cmake

@@ -0,0 +1,3 @@
+set(CTEST_USE_LAUNCHERS 1)
+include(CTestUseLaunchers)
+include(CXX-env.cmake)

+ 1 - 3
Tests/RunCMake/CompilerLauncher/CXX.cmake

@@ -1,4 +1,2 @@
-enable_language(CXX)
 set(CMAKE_CXX_COMPILER_LAUNCHER "${CMAKE_COMMAND};-E;env;USED_LAUNCHER=1")
 set(CMAKE_CXX_COMPILER_LAUNCHER "${CMAKE_COMMAND};-E;env;USED_LAUNCHER=1")
-set(CMAKE_VERBOSE_MAKEFILE TRUE)
-add_executable(main main.cxx)
+include(CXX-common.cmake)

+ 3 - 0
Tests/RunCMake/CompilerLauncher/Fortran-common.cmake

@@ -0,0 +1,3 @@
+enable_language(Fortran)
+set(CMAKE_VERBOSE_MAKEFILE TRUE)
+add_executable(main main.F)

+ 1 - 0
Tests/RunCMake/CompilerLauncher/Fortran-env-Build-stdout.txt

@@ -0,0 +1 @@
+.*-E env USED_LAUNCHER=1.*

+ 1 - 0
Tests/RunCMake/CompilerLauncher/Fortran-env-launch-Build-stdout.txt

@@ -0,0 +1 @@
+.*-E env USED_LAUNCHER=1.*

+ 1 - 0
Tests/RunCMake/CompilerLauncher/Fortran-env.cmake

@@ -0,0 +1 @@
+include(Fortran-common.cmake)

+ 3 - 0
Tests/RunCMake/CompilerLauncher/Fortran-launch-env.cmake

@@ -0,0 +1,3 @@
+set(CTEST_USE_LAUNCHERS 1)
+include(CTestUseLaunchers)
+include(Fortran-env.cmake)

+ 1 - 3
Tests/RunCMake/CompilerLauncher/Fortran.cmake

@@ -1,4 +1,2 @@
-enable_language(Fortran)
 set(CMAKE_Fortran_COMPILER_LAUNCHER "${CMAKE_COMMAND};-E;env;USED_LAUNCHER=1")
 set(CMAKE_Fortran_COMPILER_LAUNCHER "${CMAKE_COMMAND};-E;env;USED_LAUNCHER=1")
-set(CMAKE_VERBOSE_MAKEFILE TRUE)
-add_executable(main main.F)
+include(Fortran-common.cmake)

+ 9 - 0
Tests/RunCMake/CompilerLauncher/RunCMakeTest.cmake

@@ -15,6 +15,13 @@ function(run_compiler_launcher lang)
   run_cmake_command(${lang}-Build ${CMAKE_COMMAND} --build . ${verbose_args})
   run_cmake_command(${lang}-Build ${CMAKE_COMMAND} --build . ${verbose_args})
 endfunction()
 endfunction()
 
 
+function(run_compiler_launcher_env lang)
+  string(REGEX REPLACE "-.*" "" core_lang "${lang}")
+  set(ENV{CMAKE_${core_lang}_COMPILER_LAUNCHER} "${CMAKE_COMMAND};-E;env;USED_LAUNCHER=1")
+  run_compiler_launcher(${lang})
+  unset(ENV{CMAKE_${core_lang}_COMPILER_LAUNCHER})
+endfunction()
+
 set(langs C CXX)
 set(langs C CXX)
 if(CMake_TEST_CUDA)
 if(CMake_TEST_CUDA)
   list(APPEND langs CUDA)
   list(APPEND langs CUDA)
@@ -25,7 +32,9 @@ endif()
 
 
 foreach(lang ${langs})
 foreach(lang ${langs})
   run_compiler_launcher(${lang})
   run_compiler_launcher(${lang})
+  run_compiler_launcher_env(${lang}-env)
   if (NOT RunCMake_GENERATOR STREQUAL "Watcom WMake")
   if (NOT RunCMake_GENERATOR STREQUAL "Watcom WMake")
     run_compiler_launcher(${lang}-launch)
     run_compiler_launcher(${lang}-launch)
+    run_compiler_launcher_env(${lang}-launch-env)
   endif()
   endif()
 endforeach()
 endforeach()