编译后是否可以创建CMake目标和文件全局文件?

时间:2019-06-17 11:25:25

标签: c++ cmake

我正在使用CMake通过ExternalProject_Add编译外部项目。该项目可以完美编译,但是我需要根据该项目构建的二进制文件创建其他目标。

基本上,外部二进制文件是我要创建的目标的依赖项。

这意味着我无法为不存在的文件创建目标(尚未),因此CMake会抱怨。由于这个确切的原因,我无法创建一组文件(file(GLOB files $external_build/bin))或使用任何其他CMake规则,因为它们是在配置时进行评估的。

有没有办法在编译后评估CMake规则?

用例

我正在使用 LLVM ,并且我修改了llc并集成了自定义通行证。我需要在现实世界的项目上测试经过修改的llc可执行文件,例如,这是我直接从源代码树编译GNU的binutils的方式:

set(BINUTILS_URL "https://ftp.gnu.org/gnu/binutils/binutils-2.32.tar.xz")
set(BINUTILS_SHA256 "0ab6c55dd86a92ed561972ba15b9b70a8b9f75557f896446c82e8b36e473ee04")
set(BINUTILS_PREFIX ${CMAKE_BINARY_DIR}/binutils)
set(BINUTILS_BINARY_DIR ${BINUTILS_PREFIX}/bin)

find_program(MAKE_BIN NAMES gmake nmake make)
ExternalProject_Add(binutils
        URL ${BINUTILS_URL}
        URL_HASH SHA256=${BINUTILS_SHA256}

        BUILD_IN_SOURCE On
        GIT_PROGRESS On
        CONFIGURE_COMMAND ${WLLVM_CONFIGURE_FLAGS} ./configure --prefix ${BINUTILS_PREFIX}
        BUILD_COMMAND ${WLLVM_COMPILE_FLAGS} ${MAKE_BIN} -j${JOBS}
        )

ExternalProject_Add_Step(binutils
        extract-bitcode
        COMMENT "Extracting binutils' bitcode..."
        DEPENDEES install
        WORKING_DIRECTORY ${BINUTILS_BINARY_DIR}
        COMMAND ${EXTRACT_BC_EXE} ${BINUTILS_BINARY_DIR}
        )

为了测试llc,我需要处理LLVM的位代码,因此我使用wllvm来编译LLVM的位代码并将其直接嵌入binutils的已编译二进制文件中。

从这一点开始,我将需要二进制列表(一旦设置了输出二进制目录,这将非常简单)以通过add_executable创建CMake的目标。

我已经通过自定义工具链使用add_custom_command()来编译.c文件:这种情况没有什么不同,但是这次我没有位码文件(与.c文件相反)由于它们是通过extract-bitcode步骤创建的。

编辑: 我遵循了注释中的建议,并提出了CMakeLists.txt。我已经手动插入了要由自动替换的二进制文件列表,然后添加了指令,以根据{{其中一个步骤)生成的.bc文件创建新的可执行文件。 1}}。

不幸的是,CMake抱怨循环依赖。我想我必须找到一种方法使CMake知道ExternalProject_Add文件。

这是我的.bc

CMakeLists.txt

这是运行set(BINUTILS_URL "https://ftp.gnu.org/gnu/binutils/binutils-2.32.tar.xz") set(BINUTILS_SHA256 "0ab6c55dd86a92ed561972ba15b9b70a8b9f75557f896446c82e8b36e473ee04") set(BINUTILS_PREFIX ${CMAKE_BINARY_DIR}/binutils) set(BINUTILS_BINARY_DIR ${BINUTILS_PREFIX}/bin) set(BINUTILS_BINARY_NAMES addr2line ar as c++filt elfedit gprof ld ld.bfd nm objcopy objdump ranlib readelf size strings strip ) find_program(MAKE_BIN NAMES gmake nmake make) # This step will compile GNU's binutils ExternalProject_Add(binutils URL ${BINUTILS_URL} URL_HASH SHA256=${BINUTILS_SHA256} BUILD_IN_SOURCE On GIT_PROGRESS On CONFIGURE_COMMAND ${WLLVM_CONFIGURE_FLAGS} ./configure --prefix ${BINUTILS_PREFIX} BUILD_COMMAND ${WLLVM_COMPILE_FLAGS} ${MAKE_BIN} -j${JOBS} ) # This step will create the ${binutil-exec}.bc files needed in the next step ExternalProject_Add_Step(binutils extract-bitcode COMMENT "Extracting binutils' bitcode..." DEPENDEES install WORKING_DIRECTORY ${BINUTILS_BINARY_DIR} COMMAND ${EXTRACT_BC_EXE} ${BINUTILS_BINARY_DIR} ) # use llc on the ${binutils-exec}.bc files foreach (exec_name ${BINUTILS_BINARY_NAMES}) set(llc_exec_name "${exec_name}-llc") add_dependencies(binutils ${llc_exec_name}) add_executable(${llc_exec_name} ${llc_exec_name}.s) target_link_libraries(${llc_exec_name} c) add_custom_command( OUTPUT ${llc_exec_name}.s DEPENDS binutils llc COMMAND $<TARGET_FILE:llc> ARGS ${BINUTILS_BINARY_DIR}/${llc_exec_name}.bc -o ${llc_exec_name}.s ) endforeach () 时的CMake错误:

cmake

1 个答案:

答案 0 :(得分:0)

这可以通过使用DEPENDS关键字

来完成
ADD_CUSTOM_COMMAND(
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/eLut.h
  COMMAND $<TARGET_FILE:eLut> ARGS > ${CMAKE_CURRENT_BINARY_DIR}/eLut.h
  DEPENDS eLut)

例如参见here

还给出了一个示例here