2013-03-20 64 views
4

我正在试图用CMake创建一个JNI jar。对于下面有适当的顺序来进行:Cmake按特定顺序构建

  1. 编译.class文件
  2. 产生的.h头
  3. 构建本地库
  4. 罐子一切

其中

  1. 完成add_jar()(我首选在custom_command)
  2. add_custom_command(TARGET ...)
  3. 完成与add_library()
  4. 做的是用做add_custom_command(TARGET ...)(因为C选项不被支持add_jar)

我如何能确保以正确的顺序之后?第一次运行时有时会出错。

add_custom_commandPOST/PRE构建选项,但add_jaradd_library没有。 add_custom_command没有参数TARGETDEPENDS选项,我应该使用它吗?

有没有办法告诉add_library等待2. custom命令已经运行?

+0

add_dependencies? – EHuhtala 2013-03-20 17:36:03

回答

8

我想错误是你打电话给add_library带有CMake第一次运行时还不存在的源文件?

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

要确保add_jar命令在add_library之前执行,请使用add_dependencies创建对add_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) 
+0

太棒了。做到了这一点:add_dependencies并知道PRE/POST构建一种'联合'自定义命令与参数传递的目标)。 其实,我为我工作的是add_jar,然后custom_command javah与add_jar目标上的POST_BUILD,然后add_library依赖于add_jar目标,最后是库上的自定义命令POST_BUILD。 我真的很开心,我真的没想到有可能cmake + java – quimnuss 2013-03-21 11:17:07

+0

啊!并感谢set_source_files_properties。我不喜欢手动列出标题,因为它们的文件名也是自动生成的。但既然包含目录是已知的,这不是一个问题(除非你在VS下,并希望在解决方案上的标题http://stackoverflow.com/questions/1167154/listing-header-files-in-visual-studio -c-project-generated-by-cmake) – quimnuss 2013-03-21 11:21:57

+0

@quimnuss非常好 - 很高兴你能工作。 – Fraser 2013-03-21 12:55:46