子目录之间的CMAKE共享变量

时间:2018-09-26 13:03:48

标签: c++ cmake

我正在尝试从foo(请参见下文)访问在bar中计算出的变量。我在SO上观察到的方法是将CACHE INTERNAL添加到SET中。它可以工作,但是我必须两次调用GNU Make文件的生成。看起来该变量不在第一次运行时在缓存中,因此,我得到的只是一个空值。

结构

CMakeList.txt (top)--
                    |
                    -- CMakeList.txt (foo)
                    |
                    -- CMakeList.txt (bar)

内容 顶部CMakeList.txt

...
...
ADD_SUBDIRECTORY(foo)
ADD_SUBDIRECTORY(bar)
...
...

Foo CMakeList.txt

...
...
    TARGET_INCLUDE_DIRECTORIES(MyProject SYSTEM PRIVATE
        ${BarPath}
    )
    MESSAGE(STATUS "Bar include path " ${BarPath})
...
...

Bar CMakeList.txt

...
...
SET(BarPath ${CMAKE_CURRENT_BINARY_DIR} CACHE INTERNAL "Path to generated files.")
...
...

然后,当我运行cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=. -G "CodeBlocks - Unix Makefiles"时,Foo文件中的MESSAGE返回空的BarPath。再次运行,期望值将填充到变量中。怎么了?

1 个答案:

答案 0 :(得分:2)

Foo/CMakeLists.txtcmakeBar/CMakeLists.txt之前执行。

首次运行cmake时:

  1. ${BarPath}未定义,Foo/CMakeLists.txt将其打印为空。
  2. ${BarPath}Bar/CMakeLists.txt定义和缓存。

第二次运行时:

    通过打印${BarPath}在缓存中找到
  1. Foo/CMakeLists.txt
  2. ${BarPath}Bar/CMakeLists.txt重新定义并缓存。