CMake:函数可调用,而脚本(定义它)不再包含在内

时间:2017-01-12 10:12:07

标签: cmake

我在一个位置有三个文件夹,例如A,B和C.我在文件夹A中有两个cmake文件:FindABC.cmakeUseABC.cmake。前者用于查找库,后者包含一个函数,比如run_command()。文件夹B和文件夹C中的CMakelists.txt包含以下行:

find_package(ABC)
include(UseABC)
run_command()

按预期工作。现在,如果我对文件夹C的find_package()中的include()CMakelists发表评论,据我所知,Cmake应该发出错误告诉unknown command - run_command()。但是,控件进入函数并以不可预测的方式执行。

当包含行被评论时,控件如何进入该功能?列出子目录的根CMakelists中没有任何find_packageinclude行。

编辑:

UseABC.cmake:

set(ABC_COMPILE_DEBUG FALSE)
set(ABC_COMPILE_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/abc_gen")
message("USEABC1 - -> " ${ABC_COMPILE_OUTPUT_DIR})
function(run_command)
    message("USEABC2 - File recurs -> " ${ABC_COMPILE_OUTPUT_DIR})
    file(REMOVE_RECURSE "${ABC_COMPILE_OUTPUT_DIR}")
    file(MAKE_DIRECTORY "${ABC_COMPILE_OUTPUT_DIR}")
    add_custom_command() #command to be executed
endfunction()

这里,当没有注释时(find_package和include没有在任何CMakelists.txt中注释),我得到了我打印的两条消息的正确路径。

当我在第二个include(UseABC)中评论CMakelists.txt时,配置失败,第一条消息根本没有打印,第二条消息被打印,但没有给出变量的值。它还会删除文件夹C中的所有文件(但REMOVE_RECURSE的参数为空)。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这种情况,你有:

<强>的CMakeLists.txt

add_subdirectory(B)
add_subdirectory(C)

<强> B /的CMakeLists.txt

find_package(ABC)
include(UseABC)

在这种情况下,run_command中定义的UseABC.cmake函数在C/CMakeLists.txt可访问,但此脚本未对其进行定义。

在CMake中函数定义是全局的

相反,变量定义是本地到范围,定义它们。 (在变量缓存之前,在这种情况下,它们具有全局可见性)。

即{/ 1}}中定义的变量 ABC_COMPILE_DEBUG

  • UseABC.cmake脚本
  • UseABC.cmake脚本,因为它包含B/CMakeLists.txt个,UseABC.cmake命令引入范围

无法访问
  • include()脚本,因为CMakeLists.txt 引入范围
  • add_subdirectory(B)脚本

有关变量可见性的更多详细信息,请参阅documentation