2011-10-22 18 views
12

C++ projemde ANTLR kullanmaya çalışıyorum. Belirtilen dilbilgisi için ANTLR jeneratörü çalıştırmak için bir hedef yaptım ve buna bağlı ana prjct yaptı.Belirtilen dosyanın değiştirilip değiştirilmediğini CMake hedefi nasıl yapılır?

ADD_CUSTOM_TARGET(GenerateParser 
    COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g 
          -o ${PROJECT_SOURCE_DIR}/src/MyGrammar 
) 

ADD_LIBRARY(MainProject ${LIBRARY_TYPE} ${TARGET_SOURCES} ${TARGET_OPTIONS}) 
ADD_DEPENDENCIES(MainProject GenerateParser) 

Sorun projeyi inşa etmek ve yeterli zaman tüketir her zaman çalıştıran ANTLR jeneratör. Sadece dilbilgimin değişip değişmediğini nasıl çalıştırırım? Veya ANTLR'yi bir şekilde yalnızca tarih dilbilgisi dışında ayrıştırıcı üretmesi mümkün olabilir.

cevap

9

http://www.cmake.org/cmake/help/cmake2.6docs.html#command:add_custom_command

add_custom_command , hile olacaktır. İşte
ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/src/MyGrammar 
    COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g 
    -o ${PROJECT_SOURCE_DIR}/src/MyGrammar 
    DEPENDS ${PROJECT_SOURCE_DIR}/src/MyGrammar.g 
) 

ADD_CUSTOM_TARGET(GenerateParser ALL 
    DEPENDS ${PROJECT_SOURCE_DIR}/src/MyGrammar 
) 

ADD_LIBRARY(MainProject ${LIBRARY_TYPE} ${TARGET_SOURCES} ${TARGET_OPTIONS}) 
ADD_DEPENDENCIES(MainProject GenerateParser) 

, özel hedef her zaman "inşa", ancak yapacak tek şey, çıkış duruma göre değişir üzerine özel komutu inşa olmakla eğer:

Böyle bir şey çalışması gerekir sadece özel komutun çıkışı DEPENDS dosyalarına göre güncel değil ise. Kaynak dosyası oluşturur

Ekleme hedef: Hedef bazı oluşturulan kaynaklardan bağlıdır eğer özel hedefiyle önerilen çözüm yanında

3

Sıfırdan add_custom_command ister misiniz? Burada, komutları sadece bağımlı dosya değiştiğinde çalıştıracak olan DEPENDS ['...'] 'i belirtebilirsiniz. Doğru buna çağrıyı inşa halinde

add_custom_command(OUTPUT output1 [output2 ...] 
       COMMAND command1 [ARGS] [args1...] 
       [COMMAND command2 [ARGS] [args2...] ...] 
       [MAIN_DEPENDENCY depend] 
       [DEPENDS [depends...]] 
       [IMPLICIT_DEPENDS <lang1> depend1 ...] 
       [WORKING_DIRECTORY dir] 
       [COMMENT comment] [VERBATIM] [APPEND]) 
+1

Çalışmıyor gibi görünüyor. Anladığım kadarıyla DEPENDS sadece hedeflerle çalışıyor, örn. bağımlı hedef değiştiğinde (kütüphane yeniden oluşturuldu, vb.) komut çalıştırılır. – DikobrAz

2

, ortak iş akışı şudur. Hatalardan kaçınmak için tam yolları kullanmanızı tavsiye ederim. Oluşturulan kaynak dosyanızın GENEL özelliklerini ayarlayın. Yani cmake eksik kaynak dosya hakkında şikayet olmaz.

set_source_files_properties(${GENERATED_SOURCE_FILE} PROPERTIES 
    GENERATED TRUE 
) 

Üretilen kaynağı, hedefinize her zamanki gibi ekleyin. $ {DEPENDENCIES} bazı dosyaların değişmiş olsaydı

add_executable(${YOUR_TARGET} SOURCES ${GENERATED_SOURCE_FILE}) 

Yani teklif edilen örnek Doları {ÜRETİMİ KOMUTANLIĞI} sadece başlatılacak.

+0

[docs] 'a göre (https://cmake.org/cmake/help/v3.6/command/add_custom_command.html) dosyaları "GENERATED" olarak elle işaretlemenize gerek yoktur. varsayılan. –

İlgili konular