如何隐藏CMake变量?

时间:2017-05-01 10:58:59

标签: variables cmake trace

我有一个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问题的概括,该问题过于专业化,但可能会提供一些有用的背景信息。

2 个答案:

答案 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,然后再次打印但是为空。

不要从工具链文件中的全局空间访问变量(无论如何都不属于那里)。