CMake:跨子目录访问变量

时间:2013-05-08 17:45:58

标签: cmake

我有一个来自root的两个子目录,其中一个有一行:

 set(${LIBNAME}_publicheaders
     LocalizeResource.h
 )

我希望能够从其他子目录访问此变量。我怎么能这样做?

2 个答案:

答案 0 :(得分:6)

@ JoakimGebart的回答可能是更常见的解决方法。但是,你可以直接从第二个子目录中使用get_directory_property来实现你所追求的目标。

我在您的评论中看到,您已使用${LIB_NAME}_publicheaders,但在您的问题中,您有${LIBNAME}_publicheaders。这可能是导致问题的原因,因为命令应该像这样工作:

get_directory_property(MyVar
    DIRECTORY ${CMAKE_SOURCE_DIR}/abc
    DEFINITION ${LIBNAME}_publicheaders)

但是,有几个附带条件:

  1. 在中设置变量后,必须在中调用。即你必须确保在add_subdirectory(abc)之前调用add_subdirectory来使用它。
  2. 如果同一子目录(abc)中的LIBNAME也是set,则需要先检索该值。
  3. 因此,尽管这可能是一种不太常见的解决方案,但它的优势在于它不会使用特定于子目录的变量“污染”全局命名空间 - 这可以通过引用另一个子目录的子目录来实现。

答案 1 :(得分:4)

您可以使用PARENT_SCOPE选项设置父作用域中的变量来设置()

示例:

set(${LIBNAME}_publicheaders
    LocalizeResource.h
    PARENT_SCOPE
)

请参阅http://www.cmake.org/cmake/help/v2.8.10/cmake.html#command:set

但是,这意味着该变量不仅可以在其他子目录中使用,而且可以在同一级别的任何其他子目录中使用。