2011-01-24 11 views
5

Ho un progetto CMake che assomiglia:Come si configura cmake per ricostruire solo i file .java modificati in un progetto java?

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

ma quando eseguo make nella directory, tutti i file Java vengono ricostruiti, anche se non sono stati modificati. C'è un modo per disattivare questo comportamento?

Grazie,

+0

Sono curioso, perché la creazione di tutti i file Java è un problema? Qual è il problema di root qui? – jzd

+0

Scusa, non ho una risposta alla tua domanda, ma ...: perché stai usando cmake per il tuo progetto Java? Esistono strumenti come Apache Ant e Apache Maven che sono di fatto gli strumenti di compilazione standard per i progetti Java. – Jesper

+0

jzd - Fondamentalmente, sto entrando nel range di ~ 40 file java in questo progetto, e ricostruirlo ogni volta che apporto una modifica sta diventando dispendioso in termini di tempo – PerilousApricot

risposta

5

Il supporto add_library in CMake non è troppo caldo. Ignora la direttiva "pacchetto" e assume che "foo.java" crei "foo.class" nella directory di base, non in una sottodirectory com/example/ per package com.example;.

Se si guardano le makefile generati in CMakeFiles/<jar_file>.dir/build.make, è il codice come questo (ripulito un po ')

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

Questa è una dipendenza rotto quando foo.java contiene "pacchetto com.example;" in cima. Fai in attesa che venga creato foo.class, quando non lo è e tu esegui make di nuovo, compilerà foo.java per vedere se forse questa volta funzionerà. Il vero file generato è in com/example (che per fortuna viene aggiunto al file jar finale).

La buona notizia è che le cose sono migliorate di recente. Nella versione 2.8.6 di CMake è stato aggiunto un nuovo modulo chiamato UseJava che svolge un lavoro molto migliore nella compilazione di file Java e nella ricostruzione corretta in caso di modifiche. Invece di usare add_library devi usare add_jar. Ecco un completo file di esempio 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}) 

che produrrà hello.jar dai file di origine di ingresso.

0

Credo che la vostra risposta è quello di costruire solo l'intero progetto Java. Se cambi una classe e la ricomponi, come farai a sapere di compilare un'altra classe che dipende da essa. Cosa succede se si rimuove un metodo in una classe da cui dipendono gli altri, ignorando la ricompilazione delle altre classi si otterranno errori di runtime invece di un errore del compilatore.

Tuttavia, 40 file java sono una piccola quantità e sembra che debbano essere compilati in secondi o meno.

Problemi correlati