我正在尝试编写一个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_FLAGS
和CMAKE_CXX_OUTPUT_EXTENSION
这样的CMake变量,这些似乎也没有任何影响(即它们被忽略了)当CMake运行时。当我查看生成的Makefile时,这些设置不会出现,当我运行make时,会构建一个常规对象文件,而不是LLVM bitcode文件。
我有点像新手,所以有人可以解释一下这里发生了什么吗?我在这里使用CMake功能是否存在某种误解?
答案 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_options
,add_definitions
或通过手动设置目标的属性 COMPILE_FLAGS 为具体目标定义其他编译器选项,或者 COMPILE_DEFINITIONS
在build_llvm_lib
函数体中,只有 CMAKE_STATIC_LIBRARY_SUFFIX 变量可能具有 per-target 性质:虽然documentation中没有说明,但是怀疑它只是为新定义的目标设置SUFFIX属性。