我正在使用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