我正在做什么我正在编写一个 CMakeLists.txt 来构建一个需要使用 R 的C ++项目。 / p>
我的问题是什么通常,当我想找到一个包/程序时,我会使用find_package/program
函数。但这只能找到路径中的第一个。如果我想查找具有相同名称的所有可执行文件,该怎么办?
例如,如果有人在计算机上安装了多个版本的R,我可以找到它们并返回列表吗?另一种方法是可以检测是否安装了多个R可执行文件?
谢谢!
答案 0 :(得分:2)
正如@Tsyvarev所回答的那样cmake中没有内置方式,但你总是可以在一个循环内完成。
所以这是我缺少的find_program_all()
CMake函数的跨平台版本:
<强>的CMakeLists.txt 强>
cmake_minimum_required(VERSION 3.3)
project(TestFindProgramAll NONE)
function(find_program_all _var)
if (NOT DEFINED ${_var})
while(1)
unset(_found CACHE)
find_program(_found ${ARGN})
if (_found AND NOT _found IN_LIST ${_var})
set(${_var} "${${_var}};${_found}" CACHE FILEPATH "Path to a program." FORCE)
# ignore with the next try
get_filename_component(_dir "${_found}" DIRECTORY)
list(APPEND CMAKE_IGNORE_PATH "${_dir}")
else()
unset(_found CACHE)
break()
endif()
endwhile()
endif()
endfunction()
find_program_all(_gcc "gcc")
message(STATUS "_gcc = ${_gcc}")
它模仿find_program()
行为并缓存结果。
使用我的多个gcc
安装进行测试。
<强>参考强>
答案 1 :(得分:1)
CMake没有随时可用的功能来返回匹配程序的列表。
您可以手动迭代搜索路径,或使用其他实用程序,例如comments中@BenBolker建议的which -a
。