如何将这种源生成器集成到CMake构建链中?

时间:2014-05-30 09:11:35

标签: cmake

我正在编写一个使用代码生成器(perl xsubpp)的C ++项目。它从XS文件生成C / C ++源代码。由于xsubpp有时会产生不完整的输出文件,我想在构建实际二进制目标之前运行它,无论是否存在生成的源文件。

我可以找到两种方法来实现它:

# the target is always out-of-date, so the command is always run
add_custom_target(...)
add_library(lib_name ...)
add_dependencies(lib_name ...)

add_library(lib_name ...)
# the command is always run before lib_name is build
add_custom_command(TARGET lib_name PRE_BUILD ...) 

但是,它们都不起作用,因为add_library()在配置时检查源文件。源文件必须存在,或者作为add_custom_command()的输出目标。

第一种方式,add_custom_target()没有输出目标的概念;而对于第二种方式,add_custom_command()用作 lib_name 的辅助,它也没有输出目标的概念。

1 个答案:

答案 0 :(得分:2)

以下适用于我。我希望这就是你想要的。

每次运行make时都会重新生成源代码(foo.cpp)。

的src / C_generated /的CMakeLists.txt:

add_custom_target(generate_foo 
  touch ${CMAKE_CURRENT_SOURCE_DIR}/script.sh
  COMMENT "add_custom_target, touch script.sh"
)

ADD_CUSTOM_COMMAND(
  TARGET generate_foo
  COMMAND   ${CMAKE_CURRENT_SOURCE_DIR}/script.sh
  ARGS      "some args"
  COMMENT "custom commands, executing script.sh"
    )

set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/foo.cpp PROPERTIES GENERATED 1)

add_library(LIBC ${CMAKE_CURRENT_BINARY_DIR}/foo.cpp)
ADD_DEPENDENCIES(LIBC generate_foo)

的src / C_generated / script.sh:

#!/bin/bash

echo "Running script.sh"

echo "#include <stdio.h>" > foo.cpp
echo "/*" >> foo.cpp
date >> foo.cpp
echo "*/" >> foo.cpp
echo >> foo.cpp
echo "void testC()" >> foo.cpp
echo "{" >> foo.cpp
echo "  printf(\"Generated source.\");" >> foo.cpp
echo "}" >> foo.cpp

主CMakeLists.txt,它将生成的源与非生成的源组合在一起:

project(test)
cmake_minimum_required(VERSION 2.8)
INCLUDE_DIRECTORIES(src)
ADD_SUBDIRECTORY(src/A)
ADD_SUBDIRECTORY(src/B)
# Generated files only.
ADD_SUBDIRECTORY(src/C_generated)

# Combine the different libraries into one.
add_library(TESTLIB STATIC src/dummy.c)

ADD_DEPENDENCIES(TESTLIB LIBA)
ADD_DEPENDENCIES(TESTLIB LIBB)
ADD_DEPENDENCIES(TESTLIB LIBC)

GET_TARGET_PROPERTY(LIBA_LOC LIBA LOCATION)
GET_TARGET_PROPERTY(LIBB_LOC LIBB LOCATION)
GET_TARGET_PROPERTY(LIBC_LOC LIBC LOCATION)

SET_TARGET_PROPERTIES(TESTLIB PROPERTIES STATIC_LIBRARY_FLAGS "${LIBA_LOC} ${LIBB_LOC} ${LIBC_LOC}")

从以下网址下载此示例:

https://dl.dropboxusercontent.com/u/68798379/cmake-code-generator.tar.bz2