Cmake按特定顺序构建

时间:2013-03-20 17:18:14

标签: java java-native-interface cmake

我正在尝试用CMake创建一个JNI jar。为此,必须按照适当的顺序进行以下操作:

  1. 编译.class文件
  2. 生成.h标题
  3. 构建本机库
  4. jar everything
  5. ,其中

    1. 完成add_jar()(我更喜欢使用custom_command)
    2. 完成了add_custom_command(TARGET ...)
    3. 完成了add_library()
    4. 使用add_custom_command(TARGET ...)完成(因为add_jar不支持-C选项)
    5. 如何确保遵循正确的订单?我有时会在第一次运行时遇到错误。

      add_custom_commandPOST / PRE构建选项,但add_jaradd_library没有。没有参数add_custom_command的{​​{1}}有TARGET选项,我应该使用它吗?

      有没有办法让DEPENDS等待2.自定义命令运行?

1 个答案:

答案 0 :(得分:8)

我想错误的是你在使用第一次运行CMake时尚不存在的源文件调用add_library

如果是这样,您可以使用GENERATED命令在这些源文件上设置set_source_files_properties属性。这让CMake知道这些文件在配置时不存在(当CMake运行时),但它们将在构建时存在。

要确保add_jar命令在add_library之前执行,请使用add_dependenciesadd_jar目标上创建依赖关系。要确保add_custom_command命令在add_library之前执行,请使用自定义命令使用TARGET ... PRE_BUILD选项。

例如,如果lib的源列表保存在名为${Srcs}的变量中,则可以执行以下操作:

# Allow 'Srcs' to not exist at configure-time
set_source_files_properties(${Srcs} PROPERTIES GENERATED TRUE)
add_library(MyLib ${Srcs})

# compile .class files
add_jar(MyJarTarget ...)

# generate .h headers
add_custom_command(TARGET MyLib PRE_BUILD COMMAND ...)

# Force 'add_jar' to be built before 'MyLib'
add_dependencies(MyLib MyJarTarget)