Как вы настраиваете cmake, чтобы перестраивать только измененные файлы .java в проекте java? - PullRequest
5 голосов
/ 24 января 2011

У меня есть проект cmake, который выглядит так:

project(myProject JAVA)
add_library(myLibrary foo.java bar.java)

но когда я запускаю make в каталоге, все java файлы перестраиваются, даже если они не были изменены Есть ли способ отключить это поведение?

Спасибо

Ответы [ 2 ]

5 голосов
/ 28 января 2011

Поддержка add_library Java в CMake не слишком горячая. Он игнорирует директиву package и предполагает, что foo.java создает foo.class в базовом каталоге, а не в подкаталоге com/example/ для package com.example;.

Если вы посмотрите на сгенерированные make-файлы в CMakeFiles/<jar_file>.dir/build.make, у него есть такой код (немного исправленный)

CMakeFiles/test.dir/foo.class: ../foo.java
    javac  $(Java_FLAGS) /full/path/to/foo.java -d CMakeFiles/test.dir

Это нарушенная зависимость, когда foo.java содержит "package com.example;" на вершине. Make ожидает, что будет создан файл foo.class. Если этого не произойдет, и вы запустите make снова, он скомпилирует файл foo.java, чтобы посмотреть, будет ли в этот раз он работать. Фактический сгенерированный файл находится в com / example (который, к счастью, добавляется в окончательный файл jar).

Хорошая новость заключается в том, что в последнее время ситуация улучшилась. В версии 2.8.6 CMake был добавлен новый модуль под названием UseJava, который намного лучше справляется с компиляцией файлов Java и корректной перестройкой при наличии изменений. Вместо использования add_library вам нужно использовать add_jar. Вот полный пример файла CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.6)
find_package(Java)
include(UseJava)
project(java_test Java)
set(SRC
    src/com/example/test/Hello.java
    src/com/example/test/Message.java
)
add_jar(hello ${SRC})

Это создаст hello.jar из исходных файлов.

0 голосов
/ 26 января 2011

Я думаю, что ваш ответ - просто собрать весь Java-проект.Если вы измените один класс и просто перекомпилируете его, как cmake узнает, что нужно скомпилировать другой класс, который зависит от него.Что произойдет, если вы удалите метод в одном классе, от которого зависят другие, пропуская перекомпиляцию других классов, вы получите ошибки времени выполнения вместо ошибки компилятора.

Однако 40 java-файлов - это небольшое количество, и этокажется, что они должны скомпилироваться за секунды или меньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...