在QtCreator中运行时CMake找不到忍者

时间:2019-01-24 08:21:45

标签: cmake qt-creator ninja

我在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中存在的内容?

2 个答案:

答案 0 :(得分:1)

摘自find_program()的文档:

  

将创建一个由VAR命名的缓存条目,以存储此命令的结果。如果找到程序,则结果存储在变量中,除非清除变量,否则将不会重复搜索。

在您的情况下,CMAKE_MAKE_PROGRAM恰好被缓存为/usr/bin/make(可能是QtCreator在某个时候设置的),所以find_program()什么也不做。

makeninja之间切换的正确方法是使用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_PROGRAMmake切换到ninja并不是更改CMake generator的正确方法。您需要通过-G选项将适当的CMake生成器传递给cmake本身。