显示 CMake 变量而不在 CMakeLists.txt 文件上运行 CMake 或手动检查 config.CMake?

假设我有一个名为 Foo 的包。如果我在包含 find_package(Foo)的 CMakeLists.txt 文件上运行 CMake,那么我可以打印出变量(如 ${Foo_LIBRARIES}${Foo_INCLUDES})的值。

有没有一种简单的方法可以显示这些变量,而不必在 CMakeLists.txt 文件上运行 CMake,也不必手动检查 config.CMake 文件?

163455 次浏览

These variables are generally hardcoded into FindFoo.cmake so that it is not possible to extract them without running the function first. Note that sometimes the value of Foo_LIBRARIES depends on the system configuration, which is unknown until find_package(Foo) is run.

Run CMake and have a look at the cache with the ccmake GUI tool. Then you'll get all the variables.

Or run CMake with -LH then you will get all variables printed after configuration.

So I think it is not possible to get the variables without running CMake.

Run cmake in find-package mode. Example to display a package`s include directories:

cmake -DNAME=ZLIB -DCOMPILER_ID=GNU -DLANGUAGE=C -DMODE=COMPILE --find-package

Example to display the libraries:

cmake -DNAME=ZLIB -DCOMPILER_ID=GNU -DLANGUAGE=C -DMODE=LINK --find-package

The NAME must be set to the package name. You can obtain your COMPILER_ID on this page. LANGUAGE can be C, CXX or Fortran.

You asked: (1) Is there an easy way to display these variables without having to run cmake on a CMakeLists.txt file, and (2) without having to manually inspect the config.cmake file?

I can give you a yes answer to (2) but it does require that you (re)run cmake. But since you can re-run your cmake configure step by simply executing cmake . in the build directory, re-running cmake should not keep you from trying this approach. My answer is given in this SO answer and uses the get_cmake_property command. Here is that code encapsulated into a cmake macro, print_all_variables, so I can use it when debugging my cmake scripts.

macro(print_all_variables)
message(STATUS "print_all_variables------------------------------------------{")
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
message(STATUS "print_all_variables------------------------------------------}")
endmacro()

The macros are invoked with same syntax as cmake functions:

print_all_variables()

To simply print a value, you could do something like this:

message(STATUS "foo include dir: ${foo_INCLUDE}")

where ${foo_INCLUDE} is the value you desire to print.

Note: I'm using cmake > 3.14

I am always suspicious of variables changing values throughout a script somewhere so I like to see the value of a variable at a particular point in the running script. Combining the ideas from both Phil and Aaron B. this is what I'm using:

function(PRINT_VAR VARNAME)
message(STATUS "${VARNAME}: ${${VARNAME}}")
endfunction()
PRINT_VAR("CMAKE_CXX_COMPILER")

Then I can just litter PRINT_VAR statements around like I'm debugging code back in 1980