我在一个位置有三个文件夹,例如A,B和C.我在文件夹A中有两个cmake文件:FindABC.cmake
和UseABC.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_package
或include
行。
编辑:
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
的参数为空)。
答案 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。