Variables 如何隐藏CMake变量?
我有一个CMake项目,它允许一个全局设置变量(在命令行上用Variables 如何隐藏CMake变量?,variables,cmake,trace,Variables,Cmake,Trace,我有一个CMake项目,它允许一个全局设置变量(在命令行上用-DARDUINO_SDK_PATH=/a/b/c设置)消失,即突然给定值消失,从而导致致命错误 我知道有不同的方法“隐藏”变量(例如内部函数或外部项目) 就我而言: 未在代码中的任何位置明确设置变量(例如,通过set()或find\u path()) 导致错误的访问位于顶层(即不在函数内部) 有一些说明(即,相同的文件/行),其中一种情况下,变量具有给定的值,下一次该值消失 使用variable\u watch(ARDUINO\u
-DARDUINO_SDK_PATH=/a/b/c
设置)消失,即突然给定值消失,从而导致致命错误
我知道有不同的方法“隐藏”变量(例如内部函数或外部项目)
就我而言:
- 未在代码中的任何位置明确设置变量(例如,通过
或set()
)find\u path()
- 导致错误的访问位于顶层(即不在函数内部)
- 有一些说明(即,相同的文件/行),其中一种情况下,变量具有给定的值,下一次该值消失
variable\u watch(ARDUINO\u SDK\u PATH)
跟踪变量,在检查编译器之前,我可以看到一切正常:
cmake -DARDUINO_SDK_PATH=/a/b/c <path>
...
... everything fine, ${DARDUINO_SDK_PATH} == '/a/b/c' everywhere
...
-- Check for working C compiler: /usr/bin/avr-gcc
...
... here the variable is empty and not being traced any more
...
cmake-DARDUINO\u SDK\u路径=/a/b/c
...
... 一切正常,${DARDUINO_SDK_PATH}=='/a/b/c'无处不在
...
--检查C编译器是否工作:/usr/bin/avr gcc
...
... 这里的变量是空的,不再被跟踪
...
以下是我的建议:
编译器检查(在终端上用check for working C compiler..
表示)是否有自己的变量空间,并且不知道命令行上提供的变量
注意:这个问题是对这个问题的概括,这个问题已经变得过于专业化,但可能会提供一些有用的背景信息。在
variable\u watch()
命令之后,对变量的任何修改都不会被跟踪,这对我来说似乎是CMake中的一个bug
一般来说,“缓存的CMake变量”可以被同名的“普通CMake变量”隐藏。但是,例如,find_path()
不会再次运行或修改已设置的变量
以下是一个例子:
cmake_minimum_required(VERSION 2.4)
project(VariableWatchTest NONE)
variable_watch(MY_TEST_VAR)
set(MY_TEST_VAR "something" CACHE INTERNAL "")
message("${MY_TEST_VAR}")
set(MY_TEST_VAR "hiding something")
message("${MY_TEST_VAR}")
unset(MY_TEST_VAR)
message("${MY_TEST_VAR}")
find_path(MY_TEST_VAR NAMES "CMakeLists.txt" HINTS "${CMAKE_CURRENT_LIST_DIR}")
message("${MY_TEST_VAR}")
将给出(不带变量的\u watch()
消息:
-- something
-- hiding something
-- something
-- something
参考资料
MESSAGE("FOO: ${FOO}")
像这样运行CMake
cd build-dir
cmake -DFOO=TEST ..
在配置过程开始时,您可能会看到FOO
以值TEST
打印一次,然后再次打印,但为空
只是不要从工具链文件中的全局空间访问变量(反正不属于那里)