【问题标题】:How to define a cmake macro in a sub_directory that uses the CURRENT_SOURCE_DIR?如何在使用 CURRENT_SOURCE_DIR 的子目录中定义 cmake 宏?
【发布时间】:2017-03-13 08:53:37
【问题描述】:

我想做的是创建一个CMakeLists.txt,它定义了一个在父作用域中使用的便利宏。我可以很好地使用宏。但是,我使用了${CMAKE_CURRENT_SOURCE_DIR},不幸的是,它不是定义宏的 CMake 脚本的目录,而是调用它的目录。有什么办法可以改变吗?

MWE

cmake_minimum_required(VERSION 3.6)
project(git_info CXX)
macro(do_stuff)
    message("This CMakeLists.txt file is in ${CMAKE_CURRENT_SOURCE_DIR}")
endmacro()

我发现一种丑陋的方法是将变量导出到包含路径的父作用域并在宏中使用它。但我宁愿只导出宏定义,如果可能的话,以保持干净。

编辑: 澄清一点。我有一个文件夹,里面有我的顶级CMakeLists.txt 和一个文件夹 (my_folder),里面有上面的 MWE CMakeLists.txt。顶级CMakeLists.txt 如下所示:

cmake_minimum_required(VERSION 3.6)
project(top_project CXX)
add_subdirectory(my_folder)
do_stuff()

【问题讨论】:

    标签: cmake


    【解决方案1】:

    您必须将宏外部的 CMAKE_CURRENT_LIST_DIR 转移到另一个变量中,或者 - 在您的情况下 - 用户定义的全局属性:

    set_property(GLOBAL PROPERTY DoStuffPath "${CMAKE_CURRENT_LIST_DIR}")
    
    macro(do_stuff)
        get_property(_my_marcros_file GLOBAL PROPERTY DoStuffPath)
        message("This CMakeLists.txt file is in ${_my_marcros_file}")
    endmacro()
    

    这也适用于宏定义在添加了include() 的文件中。

    参考文献

    【讨论】:

    • 这有一个问题,因为宏是在 parent_scope 中调用的,_my_marcros_file 在宏定义的地方是不可见的。因此打印的消息将是(“This CMakeLists.txt file is in”)。
    • 我对这个问题做了一些澄清。
    • 但情况恰恰相反。我想在父作用域中使用子作用域中定义的宏。哪个有效,但我不想让子范围的变量对父范围可见。
    • @MrZ 好的。我刚刚看到你改变的问题。通过使用用户定义的全局属性,修改了我的代码以在您的场景中工作。
    【解决方案2】:

    使用CMAKE_SOURCE_DIR 获取到最外层父级 CMakeLists.txt 的路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多