Просмотр исходного кода

Check*: Add option to pass link directories into checks

Aliaksandr Averchanka 1 год назад
Родитель
Сommit
9e95bd49f2
41 измененных файлов с 454 добавлено и 25 удалено
  1. 5 0
      Help/module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
  2. 99 0
      Help/release/dev/macro-required-link-directories.rst
  3. 18 14
      Modules/CMakePushCheckState.cmake
  4. 2 0
      Modules/CheckCCompilerFlag.cmake
  5. 2 0
      Modules/CheckCSourceCompiles.cmake
  6. 2 0
      Modules/CheckCSourceRuns.cmake
  7. 2 0
      Modules/CheckCXXCompilerFlag.cmake
  8. 2 0
      Modules/CheckCXXSourceCompiles.cmake
  9. 2 0
      Modules/CheckCXXSourceRuns.cmake
  10. 2 0
      Modules/CheckCXXSymbolExists.cmake
  11. 2 0
      Modules/CheckCompilerFlag.cmake
  12. 2 0
      Modules/CheckFortranCompilerFlag.cmake
  13. 13 9
      Modules/CheckFortranFunctionExists.cmake
  14. 2 0
      Modules/CheckFortranSourceCompiles.cmake
  15. 2 0
      Modules/CheckFortranSourceRuns.cmake
  16. 10 0
      Modules/CheckFunctionExists.cmake
  17. 11 0
      Modules/CheckIncludeFile.cmake
  18. 11 0
      Modules/CheckIncludeFileCXX.cmake
  19. 11 0
      Modules/CheckIncludeFiles.cmake
  20. 10 1
      Modules/CheckLibraryExists.cmake
  21. 2 0
      Modules/CheckOBJCCompilerFlag.cmake
  22. 2 0
      Modules/CheckOBJCSourceCompiles.cmake
  23. 2 0
      Modules/CheckOBJCSourceRuns.cmake
  24. 2 0
      Modules/CheckOBJCXXCompilerFlag.cmake
  25. 2 0
      Modules/CheckOBJCXXSourceCompiles.cmake
  26. 2 0
      Modules/CheckOBJCXXSourceRuns.cmake
  27. 11 0
      Modules/CheckPrototypeDefinition.cmake
  28. 2 0
      Modules/CheckSourceCompiles.cmake
  29. 2 0
      Modules/CheckSourceRuns.cmake
  30. 2 0
      Modules/CheckStructHasMember.cmake
  31. 11 0
      Modules/CheckSymbolExists.cmake
  32. 11 0
      Modules/CheckTypeSize.cmake
  33. 10 0
      Modules/CheckVariableExists.cmake
  34. 9 0
      Modules/Internal/CheckSourceCompiles.cmake
  35. 8 0
      Modules/Internal/CheckSourceRuns.cmake
  36. 6 1
      Tests/CMakeTests/PushCheckStateTest.cmake.in
  37. 122 0
      Tests/RunCMake/CheckModules/CheckLinkDirectories.cmake
  38. 1 0
      Tests/RunCMake/CheckModules/CheckLinkDirectoriesTestLib.cmake
  39. 28 0
      Tests/RunCMake/CheckModules/RunCMakeTest.cmake
  40. 3 0
      Tests/RunCMake/CheckModules/TestLib/CMakeLists.txt
  41. 6 0
      Tests/RunCMake/CheckModules/TestLib/TestLib.c

+ 5 - 0
Help/module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt

@@ -0,0 +1,5 @@
+  ``CMAKE_REQUIRED_LINK_DIRECTORIES``
+    .. versionadded:: 3.31
+
+    A :ref:`;-list <CMake Language Lists>` of libraries search paths to pass to
+    the linker (see :command:`try_compile` for further details).

+ 99 - 0
Help/release/dev/macro-required-link-directories.rst

@@ -0,0 +1,99 @@
+macro-required-link-directories
+-------------------------------
+
+* The :module:`CMakePushCheckState` module ``cmake_push_check_state``,
+  ``cmake_pop_check_state`` and ``cmake_reset_check_state`` macros
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckCCompilerFlag` module ``check_c_compiler_flag`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckCSourceCompiles` module ``check_c_source_compiles`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckCSourceRuns` module ``check_c_source_runs`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckCXXCompilerFlag` module ``check_cxx_compiler_flag`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckCXXSourceCompiles` module ``check_cxx_source_compiles`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckCXXSourceRuns` module ``check_cxx_source_runs`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckCXXSymbolExists` module ``check_cxx_symbol_exists`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckCompilerFlag` module ``check_compiler_flag`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckFortranCompilerFlag` module ``check_fortran_compiler_flag`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckFortranFunctionExists` module ``check_fortran_function_exists`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckFortranSourceCompiles` module ``check_fortran_source_compiles`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckFortranSourceRuns` module ``check_fortran_source_runs`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckFunctionExists` module ``check_function_exists`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckIncludeFile` module ``check_include_file`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckIncludeFileCXX` module ``check_include_file_cxx`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckIncludeFiles` module ``check_include_files`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckOBJCCompilerFlag` module ``check_objc_compiler_flag`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckLibraryExists` module ``check_library_exists`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckOBJCCompilerFlag` module ``check_objc_compiler_flag`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckOBJCSourceCompiles` module ``check_objc_source_compiles`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckOBJCSourceRuns` module ``check_objc_source_runs`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckOBJCXXCompilerFlag` module ``check_objcxx_compiler_flag`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckOBJCXXSourceCompiles` module ``check_objcxx_source_compiles`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckOBJCXXSourceRuns` module ``check_objcxx_source_runs`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckPrototypeDefinition` module ``check_prototype_definition`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckSourceCompiles` module ``check_source_compiles`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckSourceRuns` module ``check_source_runs`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckStructHasMember` module ``check_struct_has_member`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckSymbolExists` module ``check_symbol_exists`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckTypeSize` module ``check_type_size`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.
+
+* The :module:`CheckVariableExists` module ``check_variable_exists`` macro
+  learned to honor the ``CMAKE_REQUIRED_LINK_DIRECTORIES`` variable.

+ 18 - 14
Modules/CMakePushCheckState.cmake

@@ -12,6 +12,7 @@ This module defines three macros: ``CMAKE_PUSH_CHECK_STATE()``
 be used to save, restore and reset (i.e., clear contents) the state of
 the variables ``CMAKE_REQUIRED_FLAGS``, ``CMAKE_REQUIRED_DEFINITIONS``,
 ``CMAKE_REQUIRED_LINK_OPTIONS``, ``CMAKE_REQUIRED_LIBRARIES``,
+``CMAKE_REQUIRED_LINK_DIRECTORIES``,
 ``CMAKE_REQUIRED_INCLUDES`` and ``CMAKE_EXTRA_INCLUDE_FILES`` used by the
 various Check-files coming with CMake, like e.g. ``check_function_exists()``
 etc.
@@ -45,6 +46,7 @@ macro(CMAKE_RESET_CHECK_STATE)
   set(CMAKE_REQUIRED_DEFINITIONS)
   set(CMAKE_REQUIRED_LINK_OPTIONS)
   set(CMAKE_REQUIRED_LIBRARIES)
+  set(CMAKE_REQUIRED_LINK_DIRECTORIES)
   set(CMAKE_REQUIRED_FLAGS)
   set(CMAKE_REQUIRED_QUIET)
 
@@ -58,13 +60,14 @@ macro(CMAKE_PUSH_CHECK_STATE)
 
   math(EXPR _CMAKE_PUSH_CHECK_STATE_COUNTER "${_CMAKE_PUSH_CHECK_STATE_COUNTER}+1")
 
-  set(_CMAKE_EXTRA_INCLUDE_FILES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}    ${CMAKE_EXTRA_INCLUDE_FILES})
-  set(_CMAKE_REQUIRED_INCLUDES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}      ${CMAKE_REQUIRED_INCLUDES})
-  set(_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}   ${CMAKE_REQUIRED_DEFINITIONS})
-  set(_CMAKE_REQUIRED_LINK_OPTIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}  ${CMAKE_REQUIRED_LINK_OPTIONS})
-  set(_CMAKE_REQUIRED_LIBRARIES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}     ${CMAKE_REQUIRED_LIBRARIES})
-  set(_CMAKE_REQUIRED_FLAGS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}         ${CMAKE_REQUIRED_FLAGS})
-  set(_CMAKE_REQUIRED_QUIET_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}         ${CMAKE_REQUIRED_QUIET})
+  set(_CMAKE_EXTRA_INCLUDE_FILES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}        ${CMAKE_EXTRA_INCLUDE_FILES})
+  set(_CMAKE_REQUIRED_INCLUDES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}          ${CMAKE_REQUIRED_INCLUDES})
+  set(_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}       ${CMAKE_REQUIRED_DEFINITIONS})
+  set(_CMAKE_REQUIRED_LINK_OPTIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}      ${CMAKE_REQUIRED_LINK_OPTIONS})
+  set(_CMAKE_REQUIRED_LIBRARIES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}         ${CMAKE_REQUIRED_LIBRARIES})
+  set(_CMAKE_REQUIRED_LINK_DIRECTORIES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}  ${CMAKE_REQUIRED_LINK_DIRECTORIES})
+  set(_CMAKE_REQUIRED_FLAGS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}             ${CMAKE_REQUIRED_FLAGS})
+  set(_CMAKE_REQUIRED_QUIET_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}             ${CMAKE_REQUIRED_QUIET})
 
   if (${ARGC} GREATER 0 AND "${ARGV0}" STREQUAL "RESET")
     cmake_reset_check_state()
@@ -77,13 +80,14 @@ macro(CMAKE_POP_CHECK_STATE)
 # don't pop more than we pushed
   if("${_CMAKE_PUSH_CHECK_STATE_COUNTER}" GREATER "0")
 
-    set(CMAKE_EXTRA_INCLUDE_FILES    ${_CMAKE_EXTRA_INCLUDE_FILES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
-    set(CMAKE_REQUIRED_INCLUDES      ${_CMAKE_REQUIRED_INCLUDES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
-    set(CMAKE_REQUIRED_DEFINITIONS   ${_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
-    set(CMAKE_REQUIRED_LINK_OPTIONS  ${_CMAKE_REQUIRED_LINK_OPTIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
-    set(CMAKE_REQUIRED_LIBRARIES     ${_CMAKE_REQUIRED_LIBRARIES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
-    set(CMAKE_REQUIRED_FLAGS         ${_CMAKE_REQUIRED_FLAGS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
-    set(CMAKE_REQUIRED_QUIET         ${_CMAKE_REQUIRED_QUIET_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
+    set(CMAKE_EXTRA_INCLUDE_FILES       ${_CMAKE_EXTRA_INCLUDE_FILES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
+    set(CMAKE_REQUIRED_INCLUDES         ${_CMAKE_REQUIRED_INCLUDES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
+    set(CMAKE_REQUIRED_DEFINITIONS      ${_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
+    set(CMAKE_REQUIRED_LINK_OPTIONS     ${_CMAKE_REQUIRED_LINK_OPTIONS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
+    set(CMAKE_REQUIRED_LIBRARIES        ${_CMAKE_REQUIRED_LIBRARIES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
+    set(CMAKE_REQUIRED_LINK_DIRECTORIES ${_CMAKE_REQUIRED_LINK_DIRECTORIES_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
+    set(CMAKE_REQUIRED_FLAGS            ${_CMAKE_REQUIRED_FLAGS_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
+    set(CMAKE_REQUIRED_QUIET            ${_CMAKE_REQUIRED_QUIET_SAVE_${_CMAKE_PUSH_CHECK_STATE_COUNTER}})
 
     math(EXPR _CMAKE_PUSH_CHECK_STATE_COUNTER "${_CMAKE_PUSH_CHECK_STATE_COUNTER}-1")
   endif()

+ 2 - 0
Modules/CheckCCompilerFlag.cmake

@@ -43,6 +43,8 @@ in these variables can case a false negative result.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckCSourceCompiles.cmake

@@ -45,6 +45,8 @@ Check once if C source code can be built.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckCSourceRuns.cmake

@@ -38,6 +38,8 @@ subsequently be run.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckCXXCompilerFlag.cmake

@@ -43,6 +43,8 @@ in these variables can case a false negative result.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 #]=======================================================================]
 

+ 2 - 0
Modules/CheckCXXSourceCompiles.cmake

@@ -45,6 +45,8 @@ Check once if C++ source code can be built.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckCXXSourceRuns.cmake

@@ -38,6 +38,8 @@ subsequently be run.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckCXXSymbolExists.cmake

@@ -51,6 +51,8 @@ the way the check is run:
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 For example:

+ 2 - 0
Modules/CheckCompilerFlag.cmake

@@ -43,6 +43,8 @@ in these variables can case a false negative result.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckFortranCompilerFlag.cmake

@@ -45,6 +45,8 @@ flags in these variables can case a false negative result.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 13 - 9
Modules/CheckFortranFunctionExists.cmake

@@ -29,16 +29,11 @@ Check if a Fortran function exists.
 The following variables may be set before calling this macro to modify
 the way the check is run:
 
-``CMAKE_REQUIRED_LINK_OPTIONS``
-  .. versionadded:: 3.14
-    A :ref:`;-list <CMake Language Lists>` of options to add to the link
-    command (see :command:`try_compile` for further details).
+.. include:: /module/CMAKE_REQUIRED_LINK_OPTIONS.txt
 
-``CMAKE_REQUIRED_LIBRARIES``
-  A :ref:`;-list <CMake Language Lists>` of libraries to add to the link
-  command. These can be the name of system libraries or they can be
-  :ref:`Imported Targets <Imported Targets>` (see :command:`try_compile` for
-  further details).
+.. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
+
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
 #]=======================================================================]
 
 include_guard(GLOBAL)
@@ -58,6 +53,12 @@ macro(CHECK_FORTRAN_FUNCTION_EXISTS FUNCTION VARIABLE)
     else()
       set(CHECK_FUNCTION_EXISTS_ADD_LIBRARIES)
     endif()
+    if(CMAKE_REQUIRED_LINK_DIRECTORIES)
+      set(_CFFE_LINK_DIRECTORIES
+        "-DLINK_DIRECTORIES:STRING=${CMAKE_REQUIRED_LINK_DIRECTORIES}")
+    else()
+      set(_CFFE_LINK_DIRECTORIES)
+    endif()
     set(__CheckFunction_testFortranCompilerSource
     "
       program TESTFortran
@@ -70,8 +71,11 @@ macro(CHECK_FORTRAN_FUNCTION_EXISTS FUNCTION VARIABLE)
       SOURCE_FROM_VAR testFortranCompiler.f __CheckFunction_testFortranCompilerSource
       ${CHECK_FUNCTION_EXISTS_ADD_LINK_OPTIONS}
       ${CHECK_FUNCTION_EXISTS_ADD_LIBRARIES}
+      CMAKE_FLAGS
+      "${_CFFE_LINK_DIRECTORIES}"
     )
     unset(__CheckFunction_testFortranCompilerSource)
+    unset(_CFFE_LINK_DIRECTORIES)
     if(${VARIABLE})
       set(${VARIABLE} 1 CACHE INTERNAL "Have Fortran function ${FUNCTION}")
       message(CHECK_PASS "found")

+ 2 - 0
Modules/CheckFortranSourceCompiles.cmake

@@ -53,6 +53,8 @@ Check once if Fortran source code can be built.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckFortranSourceRuns.cmake

@@ -51,6 +51,8 @@ subsequently be run.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 10 - 0
Modules/CheckFunctionExists.cmake

@@ -29,6 +29,8 @@ way the check is run:
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 .. note::
@@ -67,6 +69,12 @@ macro(CHECK_FUNCTION_EXISTS FUNCTION VARIABLE)
     else()
       set(CHECK_FUNCTION_EXISTS_ADD_LIBRARIES)
     endif()
+    if(CMAKE_REQUIRED_LINK_DIRECTORIES)
+      set(_CFE_LINK_DIRECTORIES
+        "-DLINK_DIRECTORIES:STRING=${CMAKE_REQUIRED_LINK_DIRECTORIES}")
+    else()
+      set(_CFE_LINK_DIRECTORIES)
+    endif()
     if(CMAKE_REQUIRED_INCLUDES)
       set(CHECK_FUNCTION_EXISTS_ADD_INCLUDES
         "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
@@ -89,8 +97,10 @@ macro(CHECK_FUNCTION_EXISTS FUNCTION VARIABLE)
       ${CHECK_FUNCTION_EXISTS_ADD_LIBRARIES}
       CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
       "${CHECK_FUNCTION_EXISTS_ADD_INCLUDES}"
+      "${_CFE_LINK_DIRECTORIES}"
       )
     unset(_cfe_source)
+    unset(_CFE_LINK_DIRECTORIES)
 
     if(${VARIABLE})
       set(${VARIABLE} 1 CACHE INTERNAL "Have function ${FUNCTION}")

+ 11 - 0
Modules/CheckIncludeFile.cmake

@@ -31,6 +31,8 @@ the way the check is run:
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 See the :module:`CheckIncludeFiles` module to check for multiple headers
@@ -87,6 +89,13 @@ macro(CHECK_INCLUDE_FILE INCLUDE VARIABLE)
       unset(_CIF_CMP0075)
     endif()
 
+    if(CMAKE_REQUIRED_LINK_DIRECTORIES)
+      set(_CIF_LINK_DIRECTORIES
+        "-DLINK_DIRECTORIES:STRING=${CMAKE_REQUIRED_LINK_DIRECTORIES}")
+    else()
+      set(_CIF_LINK_DIRECTORIES)
+    endif()
+
     try_compile(${VARIABLE}
       SOURCE_FROM_VAR CheckIncludeFile.c _CIF_SOURCE_CONTENT
       COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
@@ -95,9 +104,11 @@ macro(CHECK_INCLUDE_FILE INCLUDE VARIABLE)
       CMAKE_FLAGS
       -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_INCLUDE_FILE_FLAGS}
       "${CHECK_INCLUDE_FILE_C_INCLUDE_DIRS}"
+      "${_CIF_LINK_DIRECTORIES}"
       )
     unset(_CIF_LINK_OPTIONS)
     unset(_CIF_LINK_LIBRARIES)
+    unset(_CIF_LINK_DIRECTORIES)
 
     if(${ARGC} EQUAL 3)
       set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS_SAVE})

+ 11 - 0
Modules/CheckIncludeFileCXX.cmake

@@ -31,6 +31,8 @@ the way the check is run:
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 See modules :module:`CheckIncludeFile` and :module:`CheckIncludeFiles`
@@ -86,6 +88,13 @@ macro(CHECK_INCLUDE_FILE_CXX INCLUDE VARIABLE)
       unset(_CIF_CMP0075)
     endif()
 
+    if(CMAKE_REQUIRED_LINK_DIRECTORIES)
+      set(_CIF_LINK_DIRECTORIES
+        "-DLINK_DIRECTORIES:STRING=${CMAKE_REQUIRED_LINK_DIRECTORIES}")
+    else()
+      set(_CIF_LINK_DIRECTORIES)
+    endif()
+
     try_compile(${VARIABLE}
       SOURCE_FROM_VAR CheckIncludeFile.cxx _CIF_SOURCE_CONTENT
       COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
@@ -94,9 +103,11 @@ macro(CHECK_INCLUDE_FILE_CXX INCLUDE VARIABLE)
       CMAKE_FLAGS
       -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_INCLUDE_FILE_FLAGS}
       "${CHECK_INCLUDE_FILE_CXX_INCLUDE_DIRS}"
+      "${_CIF_LINK_DIRECTORIES}"
       )
     unset(_CIF_LINK_OPTIONS)
     unset(_CIF_LINK_LIBRARIES)
+    unset(_CIF_LINK_DIRECTORIES)
 
     if(${ARGC} EQUAL 3)
       set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS_SAVE})

+ 11 - 0
Modules/CheckIncludeFiles.cmake

@@ -37,6 +37,8 @@ the way the check is run:
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 See modules :module:`CheckIncludeFile` and :module:`CheckIncludeFileCXX`
@@ -126,6 +128,13 @@ macro(CHECK_INCLUDE_FILES INCLUDE VARIABLE)
       unset(_CIF_CMP0075)
     endif()
 
+    if(CMAKE_REQUIRED_LINK_DIRECTORIES)
+      set(_CIF_LINK_DIRECTORIES
+        "-DLINK_DIRECTORIES:STRING=${CMAKE_REQUIRED_LINK_DIRECTORIES}")
+    else()
+      set(_CIF_LINK_DIRECTORIES)
+    endif()
+
     if(NOT CMAKE_REQUIRED_QUIET)
       message(CHECK_START "Looking for ${_description}")
     endif()
@@ -137,9 +146,11 @@ macro(CHECK_INCLUDE_FILES INCLUDE VARIABLE)
       CMAKE_FLAGS
       -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_INCLUDE_FILES_FLAGS}
       "${CHECK_INCLUDE_FILES_INCLUDE_DIRS}"
+      "${_CIF_LINK_DIRECTORIES}"
       )
     unset(_CIF_LINK_OPTIONS)
     unset(_CIF_LINK_LIBRARIES)
+    unset(_CIF_LINK_DIRECTORIES)
     if(${VARIABLE})
       if(NOT CMAKE_REQUIRED_QUIET)
         message(CHECK_PASS "found")

+ 10 - 1
Modules/CheckLibraryExists.cmake

@@ -35,6 +35,8 @@ the way the check is run:
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]
@@ -58,6 +60,12 @@ macro(CHECK_LIBRARY_EXISTS LIBRARY FUNCTION LOCATION VARIABLE)
       set(CHECK_LIBRARY_EXISTS_LIBRARIES
         ${CHECK_LIBRARY_EXISTS_LIBRARIES} ${CMAKE_REQUIRED_LIBRARIES})
     endif()
+    if(CMAKE_REQUIRED_LINK_DIRECTORIES)
+      set(_CLE_LINK_DIRECTORIES
+        "-DLINK_DIRECTORIES:STRING=${LOCATION};${CMAKE_REQUIRED_LINK_DIRECTORIES}")
+    else()
+      set(_CLE_LINK_DIRECTORIES "-DLINK_DIRECTORIES:STRING=${LOCATION}")
+    endif()
 
     if(CMAKE_C_COMPILER_LOADED)
       set(_cle_source CheckFunctionExists.c)
@@ -74,9 +82,10 @@ macro(CHECK_LIBRARY_EXISTS LIBRARY FUNCTION LOCATION VARIABLE)
       LINK_LIBRARIES ${CHECK_LIBRARY_EXISTS_LIBRARIES}
       CMAKE_FLAGS
       -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_LIBRARY_EXISTS_DEFINITION}
-      -DLINK_DIRECTORIES:STRING=${LOCATION}
+      "${_CLE_LINK_DIRECTORIES}"
       )
     unset(_cle_source)
+    unset(_CLE_LINK_DIRECTORIES)
 
     if(${VARIABLE})
       if(NOT CMAKE_REQUIRED_QUIET)

+ 2 - 0
Modules/CheckOBJCCompilerFlag.cmake

@@ -45,6 +45,8 @@ flags in these variables can case a false negative result.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckOBJCSourceCompiles.cmake

@@ -47,6 +47,8 @@ Check once if Objective-C source can be built.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckOBJCSourceRuns.cmake

@@ -40,6 +40,8 @@ can subsequently be run.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckOBJCXXCompilerFlag.cmake

@@ -45,6 +45,8 @@ flags in these variables can case a false negative result.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckOBJCXXSourceCompiles.cmake

@@ -47,6 +47,8 @@ Check once if Objective-C++ source can be built.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckOBJCXXSourceRuns.cmake

@@ -40,6 +40,8 @@ and can subsequently be run.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 11 - 0
Modules/CheckPrototypeDefinition.cmake

@@ -45,6 +45,8 @@ the way the check is run:
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]
@@ -83,6 +85,13 @@ function(check_prototype_definition _FUNCTION _PROTOTYPE _RETURN _HEADER _VARIAB
       set(CMAKE_SYMBOL_EXISTS_INCLUDES)
     endif()
 
+    if(CMAKE_REQUIRED_LINK_DIRECTORIES)
+      set(_CPD_LINK_DIRECTORIES
+        "-DLINK_DIRECTORIES:STRING=${CMAKE_REQUIRED_LINK_DIRECTORIES}")
+    else()
+      set(_CPD_LINK_DIRECTORIES)
+    endif()
+
     foreach(_FILE ${_HEADER})
       string(APPEND CHECK_PROTOTYPE_DEFINITION_HEADER
         "#include <${_FILE}>\n")
@@ -102,7 +111,9 @@ function(check_prototype_definition _FUNCTION _PROTOTYPE _RETURN _HEADER _VARIAB
       ${CHECK_PROTOTYPE_DEFINITION_LIBS}
       CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CHECK_PROTOTYPE_DEFINITION_FLAGS}
       "${CMAKE_SYMBOL_EXISTS_INCLUDES}"
+      "${_CPD_LINK_DIRECTORIES}"
       )
+    unset(_CPD_LINK_DIRECTORIES)
 
     if (${_VARIABLE})
       set(${_VARIABLE} 1 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}")

+ 2 - 0
Modules/CheckSourceCompiles.cmake

@@ -76,6 +76,8 @@ Check once if source code can be built for a given language.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckSourceRuns.cmake

@@ -62,6 +62,8 @@ subsequently be run.
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 #]=======================================================================]

+ 2 - 0
Modules/CheckStructHasMember.cmake

@@ -36,6 +36,8 @@ the way the check is run:
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 

+ 11 - 0
Modules/CheckSymbolExists.cmake

@@ -41,6 +41,8 @@ the way the check is run:
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 For example:
@@ -121,6 +123,13 @@ macro(__CHECK_SYMBOL_EXISTS_IMPL SOURCEFILE SYMBOL FILES VARIABLE)
     else()
       set(CMAKE_SYMBOL_EXISTS_INCLUDES)
     endif()
+
+    if(CMAKE_REQUIRED_LINK_DIRECTORIES)
+      set(_CSE_LINK_DIRECTORIES
+        "-DLINK_DIRECTORIES:STRING=${CMAKE_REQUIRED_LINK_DIRECTORIES}")
+    else()
+      set(_CSE_LINK_DIRECTORIES)
+    endif()
     foreach(FILE ${FILES})
       string(APPEND _CSE_SOURCE
         "#include <${FILE}>\n")
@@ -159,7 +168,9 @@ int main(int argc, char** argv)
       CMAKE_FLAGS
       -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_SYMBOL_EXISTS_FLAGS}
       "${CMAKE_SYMBOL_EXISTS_INCLUDES}"
+      "${_CSE_LINK_DIRECTORIES}"
       )
+    unset(_CSE_LINK_DIRECTORIES)
     if(${VARIABLE})
       if(NOT CMAKE_REQUIRED_QUIET)
         message(CHECK_PASS "found")

+ 11 - 0
Modules/CheckTypeSize.cmake

@@ -77,6 +77,8 @@ the way the check is run:
 
 .. include:: /module/CMAKE_REQUIRED_LIBRARIES.txt
 
+.. include:: /module/CMAKE_REQUIRED_LINK_DIRECTORIES.txt
+
 .. include:: /module/CMAKE_REQUIRED_QUIET.txt
 
 ``CMAKE_EXTRA_INCLUDE_FILES``
@@ -140,6 +142,13 @@ function(__check_type_size_impl type var map builtin language)
     string(APPEND headers "#include \"${h}\"\n")
   endforeach()
 
+  if(CMAKE_REQUIRED_LINK_DIRECTORIES)
+    set(_CTS_LINK_DIRECTORIES
+      "-DLINK_DIRECTORIES:STRING=${CMAKE_REQUIRED_LINK_DIRECTORIES}")
+  else()
+    set(_CTS_LINK_DIRECTORIES)
+  endif()
+
   # Perform the check.
   set(bin ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckTypeSize/${var}.bin)
   file(READ ${__check_type_size_dir}/CheckTypeSize.c.in src_content)
@@ -151,8 +160,10 @@ function(__check_type_size_impl type var map builtin language)
     CMAKE_FLAGS
       "-DCOMPILE_DEFINITIONS:STRING=${CMAKE_REQUIRED_FLAGS}"
       "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}"
+      "${_CTS_LINK_DIRECTORIES}"
     COPY_FILE ${bin}
     )
+  unset(_CTS_LINK_DIRECTORIES)
 
   if(HAVE_${var})
     # The check compiled.  Load information from the binary.

+ 10 - 0
Modules/CheckVariableExists.cmake

@@ -59,13 +59,23 @@ macro(CHECK_VARIABLE_EXISTS VAR VARIABLE)
     else()
       set(CHECK_VARIABLE_EXISTS_ADD_LIBRARIES)
     endif()
+
+    if(CMAKE_REQUIRED_LINK_DIRECTORIES)
+      set(_CVE_LINK_DIRECTORIES
+        "-DLINK_DIRECTORIES:STRING=${CMAKE_REQUIRED_LINK_DIRECTORIES}")
+    else()
+      set(_CVE_LINK_DIRECTORIES)
+    endif()
+
     try_compile(${VARIABLE}
       SOURCES ${CMAKE_ROOT}/Modules/CheckVariableExists.c
       COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
       ${CHECK_VARIABLE_EXISTS_ADD_LINK_OPTIONS}
       ${CHECK_VARIABLE_EXISTS_ADD_LIBRARIES}
       CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_VARIABLE_DEFINITIONS}
+      "${_CVE_LINK_DIRECTORIES}"
       )
+    unset(_CVE_LINK_DIRECTORIES)
     if(${VARIABLE})
       set(${VARIABLE} 1 CACHE INTERNAL "Have variable ${VAR}")
       if(NOT CMAKE_REQUIRED_QUIET)

+ 9 - 0
Modules/Internal/CheckSourceCompiles.cmake

@@ -87,6 +87,13 @@ function(CMAKE_CHECK_SOURCE_COMPILES _lang _source _var)
     else()
       set(CHECK_${LANG}_SOURCE_COMPILES_ADD_LIBRARIES)
     endif()
+    if(CMAKE_REQUIRED_LINK_DIRECTORIES)
+      set(_CSC_LINK_DIRECTORIES
+        "-DLINK_DIRECTORIES:STRING=${CMAKE_REQUIRED_LINK_DIRECTORIES}")
+    else()
+      set(_CSC_LINK_DIRECTORIES)
+    endif()
+
     if(CMAKE_REQUIRED_INCLUDES)
       set(CHECK_${LANG}_SOURCE_COMPILES_ADD_INCLUDES
         "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
@@ -105,7 +112,9 @@ function(CMAKE_CHECK_SOURCE_COMPILES _lang _source _var)
       ${CHECK_${LANG}_SOURCE_COMPILES_ADD_LIBRARIES}
       CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CMAKE_REQUIRED_FLAGS}
       "${CHECK_${LANG}_SOURCE_COMPILES_ADD_INCLUDES}"
+      "${_CSC_LINK_DIRECTORIES}"
       OUTPUT_VARIABLE OUTPUT)
+    unset(_CSC_LINK_DIRECTORIES)
 
     foreach(_regex ${_FAIL_REGEX})
       if("${OUTPUT}" MATCHES "${_regex}")

+ 8 - 0
Modules/Internal/CheckSourceRuns.cmake

@@ -79,6 +79,12 @@ function(CMAKE_CHECK_SOURCE_RUNS _lang _source _var)
     else()
       set(CHECK_${_lang}_SOURCE_COMPILES_ADD_LIBRARIES)
     endif()
+    if(CMAKE_REQUIRED_LINK_DIRECTORIES)
+      set(_CSR_LINK_DIRECTORIES
+        "-DLINK_DIRECTORIES:STRING=${CMAKE_REQUIRED_LINK_DIRECTORIES}")
+    else()
+      set(_CSR_LINK_DIRECTORIES)
+    endif()
     if(CMAKE_REQUIRED_INCLUDES)
       set(CHECK_${_lang}_SOURCE_COMPILES_ADD_INCLUDES
         "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
@@ -98,7 +104,9 @@ function(CMAKE_CHECK_SOURCE_RUNS _lang _source _var)
       CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CMAKE_REQUIRED_FLAGS}
       -DCMAKE_SKIP_RPATH:BOOL=${CMAKE_SKIP_RPATH}
       "${CHECK_${_lang}_SOURCE_COMPILES_ADD_INCLUDES}"
+      "${_CSR_LINK_DIRECTORIES}"
       )
+    unset(_CSR_LINK_DIRECTORIES)
     # if it did not compile make the return value fail code of 1
     if(NOT ${_var}_COMPILED)
       set(${_var}_EXITCODE 1)

+ 6 - 1
Tests/CMakeTests/PushCheckStateTest.cmake.in

@@ -5,6 +5,7 @@ set(CMAKE_EXTRA_INCLUDE_FILES file1)
 set(CMAKE_REQUIRED_INCLUDES dir1)
 set(CMAKE_REQUIRED_DEFINITIONS defs1 )
 set(CMAKE_REQUIRED_LIBRARIES lib1)
+set(CMAKE_REQUIRED_LINK_DIRECTORIES linkdir1)
 set(CMAKE_REQUIRED_FLAGS flag1)
 set(CMAKE_REQUIRED_QUIET 1)
 
@@ -14,16 +15,17 @@ set(CMAKE_EXTRA_INCLUDE_FILES file2)
 set(CMAKE_REQUIRED_INCLUDES dir2)
 set(CMAKE_REQUIRED_DEFINITIONS defs2)
 set(CMAKE_REQUIRED_LIBRARIES lib2)
+set(CMAKE_REQUIRED_LINK_DIRECTORIES linkdir2)
 set(CMAKE_REQUIRED_FLAGS flag2)
 set(CMAKE_REQUIRED_QUIET 2)
 
 cmake_push_check_state()
 
 set(CMAKE_EXTRA_INCLUDE_FILES file3)
-set(CMAKE_REQUIRED_DEFINITIONS defs3)
 set(CMAKE_REQUIRED_INCLUDES dir3)
 set(CMAKE_REQUIRED_DEFINITIONS defs3)
 set(CMAKE_REQUIRED_LIBRARIES lib3)
+set(CMAKE_REQUIRED_LINK_DIRECTORIES linkdir3)
 set(CMAKE_REQUIRED_FLAGS flag3)
 set(CMAKE_REQUIRED_QUIET 3)
 
@@ -34,6 +36,7 @@ foreach(pair IN ITEMS
   REQUIRED_INCLUDES|
   REQUIRED_DEFINITIONS|
   REQUIRED_LIBRARIES|
+  REQUIRED_LINK_DIRECTORIES|
   REQUIRED_FLAGS|
   REQUIRED_QUIET|
   )
@@ -55,6 +58,7 @@ foreach(pair IN ITEMS
   REQUIRED_INCLUDES|dir2
   REQUIRED_DEFINITIONS|defs2
   REQUIRED_LIBRARIES|lib2
+  REQUIRED_LINK_DIRECTORIES|linkdir2
   REQUIRED_FLAGS|flag2
   REQUIRED_QUIET|2
   )
@@ -74,6 +78,7 @@ foreach(pair IN ITEMS
   REQUIRED_INCLUDES|dir1
   REQUIRED_DEFINITIONS|defs1
   REQUIRED_LIBRARIES|lib1
+  REQUIRED_LINK_DIRECTORIES|linkdir1
   REQUIRED_FLAGS|flag1
   REQUIRED_QUIET|1
   )

+ 122 - 0
Tests/RunCMake/CheckModules/CheckLinkDirectories.cmake

@@ -0,0 +1,122 @@
+cmake_policy(SET CMP0075 NEW)
+
+enable_language(C)
+enable_language(CXX)
+
+function(test_check_result isSucceed functionName)
+  if(isSucceed AND NOT IS_NEED_SUCCESS)
+    message(SEND_ERROR "${functionName}: check succeeded instead of failure")
+  elseif((NOT isSucceed) AND IS_NEED_SUCCESS)
+    message(SEND_ERROR "${functionName}: check failed instead of success")
+  endif()
+endfunction()
+
+# Common variables
+set(validCSourceCode "int main() {return 0;}")
+
+###
+# Checking checkers
+###
+
+# It uses common internal function `CMAKE_CHECK_SOURCE_COMPILES()`
+# include(CheckCCompilerFlag)
+
+# Also checks common internal function `CMAKE_CHECK_SOURCE_COMPILES()`
+include(CheckCSourceCompiles)
+check_c_source_compiles("${validCSourceCode}" CHECK_C_SOURCE_COMPILES_SUCCEED)
+test_check_result("${CHECK_C_SOURCE_COMPILES_SUCCEED}" check_c_source_compiles)
+
+# Also checks common internal function `CMAKE_CHECK_SOURCE_RUNS()`
+include(CheckCSourceRuns)
+check_c_source_runs("${validCSourceCode}" CHECK_C_SOURCE_RUNS_SUCCEED)
+test_check_result("${CHECK_C_SOURCE_RUNS_SUCCEED}" check_c_source_runs)
+
+# Shares code with similar C checkers
+# include(CheckCXXCompilerFlag)
+# include(CheckCXXSourceCompiles)
+# include(CheckCXXSourceRuns)
+# include(CheckCXXSymbolExists)
+
+# Shares code with similar C checkers
+# include(CheckCompilerFlag)
+# include(CheckSourceCompiles)
+# include(CheckSourceRuns)
+
+# Shares code with similar C checkers
+# include(CheckFortranCompilerFlag)
+# include(CheckFortranFunctionExists) # No way to test it
+# include(CheckFortranSourceCompiles)
+# include(CheckFortranSourceRuns)
+
+include(CheckFunctionExists)
+check_function_exists (memcpy CHECK_FUNCTION_EXISTS_SUCCEED)
+test_check_result("${CHECK_FUNCTION_EXISTS_SUCCEED}" check_function_exists)
+
+include(CheckIncludeFile)
+check_include_file("stddef.h" CHECK_INCLUDE_FILE_SUCCEED)
+test_check_result("${CHECK_INCLUDE_FILE_SUCCEED}" check_include_file)
+
+include(CheckIncludeFileCXX)
+check_include_file_cxx("stddef.h" CHECK_INCLUDE_FILE_CXX_SUCCEED)
+test_check_result("${CHECK_INCLUDE_FILE_CXX_SUCCEED}" check_include_file_cxx)
+
+include(CheckIncludeFiles)
+check_include_files("stddef.h;stdlib.h" CHECK_INCLUDE_FILES_SUCCEED)
+test_check_result("${CHECK_INCLUDE_FILES_SUCCEED}" check_include_files)
+
+include(CheckLibraryExists)
+block(PROPAGATE HAVE_LIBM)
+  unset(CMAKE_REQUIRED_LIBRARIES)
+  unset(CMAKE_REQUIRED_LINK_DIRECTORIES)
+  check_library_exists(m ceil "" HAVE_LIBM)
+endblock()
+
+if(HAVE_LIBM)
+  check_library_exists(m ceil "" CHECK_LIBRARY_EXISTS_SUCCEED)
+  test_check_result("${CHECK_LIBRARY_EXISTS_SUCCEED}" check_library_exists)
+endif()
+
+# Shares code with similar C checkers
+# include(CheckOBJCCompilerFlag)
+# include(CheckOBJCSourceCompiles)
+# include(CheckOBJCSourceRuns)
+
+# Shares code with similar C checkers
+# include(CheckOBJCXXCompilerFlag)
+# include(CheckOBJCXXSourceCompiles)
+# include(CheckOBJCXXSourceRuns)
+
+include(CheckPrototypeDefinition)
+block(PROPAGATE CHECK_PROTOTYPE_DEFINITION_WORKS)
+  unset(CMAKE_REQUIRED_LIBRARIES)
+  unset(CMAKE_REQUIRED_LINK_DIRECTORIES)
+  check_prototype_definition(memmove
+    "void *memmove(void *dest, const void *src, size_t n)"
+    "NULL"
+    "string.h"
+    CHECK_PROTOTYPE_DEFINITION_SUCCEED)
+endblock()
+
+if (CHECK_PROTOTYPE_DEFINITION_WORKS)
+  check_prototype_definition(memmove
+    "void *memmove(void *dest, const void *src, size_t n)"
+    "NULL"
+    "string.h"
+    CHECK_PROTOTYPE_DEFINITION_SUCCEED)
+  test_check_result("${CHECK_PROTOTYPE_DEFINITION_SUCCEED}" check_prototype_definition)
+endif()
+
+# It uses common internal function `CMAKE_CHECK_SOURCE_COMPILES()`
+# include(CheckStructHasMember)
+
+include(CheckSymbolExists)
+check_symbol_exists(errno "errno.h" CHECK_SYMBOL_EXISTS_SUCCEED)
+test_check_result("${CHECK_SYMBOL_EXISTS_SUCCEED}" check_symbol_exists)
+
+include(CheckTypeSize)
+check_type_size(int SIZEOF_INT)
+test_check_result("${HAVE_SIZEOF_INT}" check_type_size)
+
+include(CheckVariableExists)
+check_variable_exists(myTestVar CHECK_VARIABLE_EXISTS_SUCCEED)
+test_check_result("${CHECK_VARIABLE_EXISTS_SUCCEED}" check_variable_exists)

+ 1 - 0
Tests/RunCMake/CheckModules/CheckLinkDirectoriesTestLib.cmake

@@ -0,0 +1 @@
+add_subdirectory(TestLib)

+ 28 - 0
Tests/RunCMake/CheckModules/RunCMakeTest.cmake

@@ -22,3 +22,31 @@ run_cmake(CheckIncludeFilesOkNoC)
 run_cmake(CheckIncludeFilesMissingLanguage)
 run_cmake(CheckIncludeFilesUnknownArgument)
 run_cmake(CheckIncludeFilesUnknownLanguage)
+
+block()
+    # Set common variables
+    set(libDir ${RunCMake_BINARY_DIR}/CheckLinkDirectoriesTestLib-build/TestLib/lib)
+    set(libName mySharedLibrary)
+
+    # Build common part
+    run_cmake(CheckLinkDirectoriesTestLib)
+    set(RunCMake_TEST_NO_CLEAN 1)
+    set(RunCMake_TEST_OUTPUT_MERGE 1)
+    run_cmake_command(CheckLinkDirectoriesTestLib ${CMAKE_COMMAND} --build .)
+
+    # Run tests cleanly
+    unset(RunCMake_TEST_NO_CLEAN)
+    unset(RunCMake_TEST_OUTPUT_MERGE)
+
+    set(RunCMake_TEST_VARIANT_DESCRIPTION "WithDirectories")
+    run_cmake_with_options("CheckLinkDirectories"
+        "-DCMAKE_REQUIRED_LIBRARIES=${libName}"
+        "-DCMAKE_REQUIRED_LINK_DIRECTORIES=${libDir}"
+        "-DIS_NEED_SUCCESS:BOOL=ON"
+    )
+    set(RunCMake_TEST_VARIANT_DESCRIPTION "WithoutDirectories")
+    run_cmake_with_options("CheckLinkDirectories"
+        "-DCMAKE_REQUIRED_LIBRARIES=${libName}"
+        "-DIS_NEED_SUCCESS:BOOL=OFF"
+    )
+endblock()

+ 3 - 0
Tests/RunCMake/CheckModules/TestLib/CMakeLists.txt

@@ -0,0 +1,3 @@
+project(TestLib C)
+add_library(mySharedLibrary TestLib.c)
+set_target_properties(mySharedLibrary PROPERTIES ARCHIVE_OUTPUT_DIRECTORY $<1:lib>)

+ 6 - 0
Tests/RunCMake/CheckModules/TestLib/TestLib.c

@@ -0,0 +1,6 @@
+int myTestVar = 42;
+
+int TestSymbol(void)
+{
+  return 0;
+}