我有一个CMake项目,它允许一个全局设置变量(在命令行上设置为-DARDUINO_SDK_PATH=/a/b/c
)消失,即突然给定的值消失,导致致命错误。
我知道 以不同方式“隐藏”变量(例如内部函数或外部项目)
就我而言:
set()
或find_path()
)使用variable_watch(ARDUINO_SDK_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
...
以下是我的建议:
编译器检查(由终端上的check for working C compiler ..
表示)是否拥有自己的变量空间,并且不知道命令行上提供的变量?
注意:这个问题是对this问题的概括,该问题过于专业化,但可能会提供一些有用的背景信息。
答案 0 :(得分:1)
在variable_watch()
命令看起来像是CMake中的某个bug之后,没有跟踪对变量的任何修改。
一般来说,一个&#34;缓存的CMake变量&#34;可以通过正常的CMake变量隐藏&#34;同名。但是例如如果已经设置,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}")
会给(没有variable_watch()
条消息:
-- something
-- hiding something
-- something
-- something
<强>参考强>
答案 1 :(得分:0)
我不确定这是一个错误还是一个功能,但是(至少某些)CMake变量在CMake配置过程的某些步骤中不可用。
您可以通过在工具链文件中添加以下内容来检查:
MESSAGE("FOO: ${FOO}")
并像这样运行CMake
cd build-dir
cmake -DFOO=TEST ..
您可能会在配置过程开始时看到FOO
一次打印值TEST
,然后再次打印但是为空。
不要从工具链文件中的全局空间访问变量(无论如何都不属于那里)。