Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将这种源生成器集成到CMake构建链中? 我写的是一个使用代码生成器(perl xSuppp)的C++项目。它从XS文件生成C/C++源代码。由于xsubpp有时会生成不完整的输出文件,所以我希望在构建实际的二进制目标之前运行它,而不管是否存在生成的源文件_Cmake - Fatal编程技术网

如何将这种源生成器集成到CMake构建链中? 我写的是一个使用代码生成器(perl xSuppp)的C++项目。它从XS文件生成C/C++源代码。由于xsubpp有时会生成不完整的输出文件,所以我希望在构建实际的二进制目标之前运行它,而不管是否存在生成的源文件

如何将这种源生成器集成到CMake构建链中? 我写的是一个使用代码生成器(perl xSuppp)的C++项目。它从XS文件生成C/C++源代码。由于xsubpp有时会生成不完整的输出文件,所以我希望在构建实际的二进制目标之前运行它,而不管是否存在生成的源文件,cmake,Cmake,我可以找到两种方法来实现这一目标: # 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()会在配置时检查源文件。源文件必须存在,或作为add\u custom\u command()的输出目标 对于第一种方

我可以找到两种方法来实现这一目标:

# 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()
会在配置时检查源文件。源文件必须存在,或作为
add\u custom\u command()
的输出目标


对于第一种方式,
add_custom_target()
没有输出目标的概念;第二种方法是使用
add_custom_command()
作为lib_name的辅助,lib_name也没有输出目标的概念。我希望这就是你想要的

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

src/C_生成/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
从以下站点下载此示例:


使用生成的标题/源不应该是问题,因为源将被标记为已生成,因此可以安全地在add_库中使用(这至少是我从阅读CMake FAQ中获得的)。
#!/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
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}")