2013-03-20 3 views
4

Я пытаюсь создать банку JNI с CMake. Для этого следующего должно быть сделано в соответствующем порядке: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_command имеет опцию построить POST/PRE, но add_jar и add_library нет. add_custom_command, у которого нет аргумента TARGET, имеет параметр DEPENDS, следует ли использовать его?

Есть ли способ сообщить add_library, чтобы дождаться, когда будет выполнена обычная команда?

+0

add_dependencies? – EHuhtala

ответ

8

Я думаю, ошибка заключается в том, что вы вызываете add_library с исходными файлами, которые еще не существуют во время первого запуска CMake?

Если это так, вы можете установить свойство GENERATED на эти исходные файлы с помощью команды set_source_files_properties. Это позволяет CMake знать, что это нормально, если эти файлы не существуют во время configure (когда запускаются CMake), но они будут существовать во время сборки.

Чтобы убедиться, что команда add_jar выполняется перед add_library, создать зависимость от add_jar цели с помощью add_dependencies. Чтобы убедиться, что команда 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

Awesome. Это сделало это: add_dependencies и зная, что PRE/POST создает тип «объединить» пользовательскую команду с целью, переданной аргументом). На самом деле, то, что я работал для меня, это add_jar, затем custom_command javah с POST_BUILD для цели add_jar, а затем add_library, зависящий от цели add_jar, и, наконец, пользовательская команда POST_BUILD в библиотеке. Я рад, я действительно не думал, что это возможно cmake + java – quimnuss

+0

ах! и спасибо за set_source_files_properties. Мне не нравилось перечислять заголовки вручную, поскольку их имена файлов также автогенерируются.Но поскольку в то время как каталог include известен, это не проблема (если вы не находитесь под VS и хотите, чтобы заголовки находились в решении http://stackoverflow.com/questions/1167154/listing-header-files-in-visual-studio -c-project-generated-by-cmake) – quimnuss

+0

@quimnuss Отлично - рад, что вы его работали. – Fraser

Смежные вопросы