C++ CMake variable#u watch不';t显示对变量PKG_CONFIG_可执行文件的修改
我有由C++ CMake variable#u watch不';t显示对变量PKG_CONFIG_可执行文件的修改,c++,cmake,C++,Cmake,我有由FindPkgConfig.cmake设置的PKG\u CONFIG\u EXECUTABLE变量的无效值,因此我想检查原因。为此,我添加了variable\u watch(PKG\u CONFIG\u可执行文件)。结果如下: (...) CMake Debug Log at /home/my/CMake/share/cmake-3.16/Modules/FindPkgConfig.cmake:27 (if): Variable "PKG_CONFIG_EXECUTABLE&
FindPkgConfig.cmake
设置的PKG\u CONFIG\u EXECUTABLE
变量的无效值,因此我想检查原因。为此,我添加了variable\u watch(PKG\u CONFIG\u可执行文件)
。结果如下:
(...)
CMake Debug Log at /home/my/CMake/share/cmake-3.16/Modules/FindPkgConfig.cmake:27 (if):
Variable "PKG_CONFIG_EXECUTABLE" was accessed using READ_ACCESS with value
"aarch64-linux-gnu-pkg-config".
Call Stack (most recent call first):
build/_deps/domedependency/CMakeLists.txt:11 (include)
CMake Debug Log at /home/my/CMake/share/cmake-3.16/Modules/FindPkgConfig.cmake:30 (find_program):
Variable "PKG_CONFIG_EXECUTABLE" was accessed using READ_ACCESS with value
"aarch64-linux-gnu-pkg-config".
Call Stack (most recent call first):
build/_deps/domedependency/CMakeLists.txt:11 (include)
CMake Debug Log at /home/my/CMake/share/cmake-3.16/Modules/FindPkgConfig.cmake:33 (if):
Variable "PKG_CONFIG_EXECUTABLE" was accessed using READ_ACCESS with value
"/home/my/Projects/zzz/aarch64-linux-gnu-pkg-config".
Call Stack (most recent call first):
build/_deps/domedependency/CMakeLists.txt:11 (include)
(...)
因此,变量在没有任何写访问权限的情况下发生了更改。怎么可能呢
更重要的是,新的变量值是错误的——CMake通过将正确的可执行文件名与项目的根目录连接在一起,以某种方式生成了错误的路径。我认为这可能是
FindPkgConfig.cmake
中的一个错误,根据文档,它不跟踪对缓存变量的访问。变量PKG\u CONFIG\u EXECUTABLE
实际上是一个缓存变量
但是,在CMake中读取变量始终使用变量的非缓存版本:非缓存版本在第一个变量取消引用时创建,并设置为与缓存版本相等。有关详细信息,请参阅文档:
也就是说,variable\u watch
对于观察缓存变量仍然有用:可以假设变量是在包含不同值的两次读取之间写入的。在您的情况下,变量写在两行之间
/home/my/CMake/share/cmake-3.16/Modules/FindPkgConfig.cmake:30
/home/my/CMake/share/cmake-3.16/Modules/FindPkgConfig.cmake:33
当(非缓存)变量将值从aarch64 linux-gnu-pkg-config
更改为/home/my/Projects/zzz/aarch64 linux-gnu-pkg-config
使用给定的脚本,您可以猜测变量的设置位置
find_program(PKG_CONFIG_EXECUTABLE NAMES pkg-config DOC "pkg-config executable")
此命令用于搜索名为pkg config
的可执行文件,因此它无法找到/home/my/Projects/zzz/aarch64 linux gnu pkg config
,该文件具有可执行文件的其他基本名称。产生该值的唯一原因是:变量在命令行中设置
似乎您将参数
-DPKG\u CONFIG\u EXECUTABLE=aarch64 linux gnu pkg CONFIG
传递给cmake
调用。这可以解释为什么在find\u program
之前,PKG\u CONFIG\u EXECUTABLE
已被评估为该值
这也可以解释新的值:
PKG\u CONFIG\u EXECUTABLE
应该是对应可执行文件的绝对路径。因此,CMake将您的输入--aarch64 linux gnu pkg配置
-解释为相对路径,并将其转换为绝对路径一-/home/my/Projects/zzz/aarch64 linux gnu pkg配置
。这是有文档记录的转换:请参阅中-D
选项的说明。但是这种转换只允许PATH
或FILEPATH
类型的缓存变量,这就是为什么转换被延迟到定义变量类型的find\u program
调用
因此,如果要将值设置为变量
PKG\u CONFIG\u EXECUTABLE
,则需要设置绝对路径,而不仅仅是可执行文件的名称。PKG\u CONFIG\u EXECUTABLE
是一个缓存变量。因此,它存储在CMake调用之间。您需要清除CMake缓存(删除生成目录或仅删除其中的CMakeCachek.txt
文件),以观察变量的赋值。@Tsyvarev输出来自第一次CMake调用,CMakeCache.txt
不存在。但我认为这并不重要——看看第二和第三输出日志部分之间的区别。在脚本执行期间,变量会在其间更改其值。没错,变量是在命令行中设置的。我还尝试在我的工具链文件中设置它,并通过CMAKE\u工具链文件
传递,但它不起作用。也就是说,它只是简单的set(PKG\u CONFIG\u可执行文件aarch64 linux gnu PKG CONFIG)
。你能猜出它为什么不起作用吗?无论如何,感谢您的澄清。再一次,可执行文件PKG\u CONFIG\u
应该包含绝对路径,因此valueaarch64 linux gnu PKG CONFIG
对于它来说完全无效。如果要让CMake查找可执行文件,请使用find\u program
命令。(这种方式仅适用于工具链,使用-D
选项,您不能要求CMake搜索任何内容)。@好的,CMake工具链文件中的两行解决了我的问题:set(PKG\u CONFIG\u EXECUTABLE\u NAME aarch64 linux gnu PKG CONFIG)
查找程序(PKG\u CONFIG\u EXECUTABLE${PKG\u CONFIG\u EXECUTABLE\u NAME})谢谢您的帮助