在函数

时间:2016-10-26 16:38:39

标签: cmake

我正在尝试编写一个CMake函数,用于创建LLVM bitcode文件的对象库。这是我到目前为止所拥有的

function(build_llvm_lib OUTPUT SRC)
  if(NOT LLVM_FOUND)
    message(FATAL_ERROR "LLVM build requested but LLVM not found")
  endif()

  set(SRCS ${SRC} ${ARGN})

  set(CMAKE_C_OUTPUT_EXTENSION ".bc")
  set(CMAKE_CXX_OUTPUT_EXTENSION ".bc")
  set(CMAKE_STATIC_LIBRARY_SUFFIX ".bc")

  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -emit-llvm")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -emit-llvm")

  set(CMAKE_C_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang)
  set(CMAKE_CXX_COMPILER ${LLVM_TOOLS_BINARY_DIR}/clang++)
  set(CMAKE_AR ${LLVM_TOOLS_BINARY_DIR}/llvm-ar)
  set(CMAKE_RANLIB ${LLVM_TOOLS_BINARY_DIR}/llvm-ranlib)

  add_library(${OUTPUT} OBJECT ${SRCS})
endfunction(build_llvm_lib)

然而,我遇到的问题是,即使我设置了像CMAKE_CXX_FLAGSCMAKE_CXX_OUTPUT_EXTENSION这样的CMake变量,这些似乎也没有任何影响(即它们被忽略了)当CMake运行时。当我查看生成的Makefile时,这些设置不会出现,当我运行make时,会构建一个常规对象文件,而不是LLVM bitcode文件。

我有点像新手,所以有人可以解释一下这里发生了什么吗?我在这里使用CMake功能是否存在某种误解?

1 个答案:

答案 0 :(得分:3)

虽然创建不同目标时所有CMake变量可能具有不同的值,但CMake预计所有目标的某些变量可能相同。这些变量的例子:

  • CMAKE_< LANG> _COMPILER

  • CMAKE_AR

  • CMAKE_RANLIB

  • CMAKE_< LANG> _OUTPUT_EXTENSION

这意味着您不能对同一项目中的不同目标使用不同的编译器。见,例如, this question

变量 CMAKE_< LANG> _FLAGS 也应全局定义,适用于所有目标。

只传播到目标的属性的CMake变量和函数具有 per-target含义

例如,您可以使用命令add_compile_optionsadd_definitions或通过手动设置目标的属性 COMPILE_FLAGS 为具体目标定义其他编译器选项,或者 COMPILE_DEFINITIONS

build_llvm_lib函数体中,只有 CMAKE_STATIC_LIBRARY_SUFFIX 变量可能具有 per-target 性质:虽然documentation中没有说明,但是怀疑它只是为新定义的目标设置SUFFIX属性。