我在CMakeLists.txt文件中调用了find_program,以找到Ninja的路径。当我通过命令行运行忍者时,这将返回正确的值,但是当我在QtCreator中运行它时,它将失败:
sorter <- function(...) {
m <- match.call()
ret <- lapply(list(...), sortdf)
if (is.null(names(ret))) {
names(ret) <- make.names(m[-1])
} else {
names(ret)[names(ret) == ''] <- make.names(m[-1])[names(ret) == '']
}
ret
}
data("mtcars")
D1 <- mtcars[,c('cyl','drat','wt','am','qsec')]
sorter(D1, mtcars)
sorter(D1, b=data.frame(b='b',a='a'))
在忍者中返回:
find_program(
CMAKE_MAKE_PROGRAM
NAME ninja
PATHS /opt/local/bin
)
message(${CMAKE_MAKE_PROGRAM})
在QtCreator中返回:
/opt/local/bin/ninja
为什么CMake找不到$ PATH中存在的内容?
答案 0 :(得分:1)
摘自find_program()的文档:
将创建一个由VAR命名的缓存条目,以存储此命令的结果。如果找到程序,则结果存储在变量中,除非清除变量,否则将不会重复搜索。
在您的情况下,CMAKE_MAKE_PROGRAM
恰好被缓存为/usr/bin/make
(可能是QtCreator在某个时候设置的),所以find_program()
什么也不做。
在make
和ninja
之间切换的正确方法是使用CMake generators。
答案 1 :(得分:0)
变量CMAKE_MAKE_PROGRAM由CMake生成器缓存。 find_program
不会更新缓存的变量,除非它包含*-NOTFOUND
。
您需要在find_program
调用中使用其他变量,然后使用CMAKE_MAKE_PROGRAM
更新set(CACHE ... FORCE)
变量:
set(CMAKE_MAKE_PROGRAM <new-value> CACHE FILEPATH "" FORCE)
请注意,将CMAKE_MAKE_PROGRAM
从make
切换到ninja
并不是更改CMake generator的正确方法。您需要通过-G
选项将适当的CMake生成器传递给cmake
本身。