2010-03-01 20 views
13

Ben add_custom_command ile uğraşıyorum. Problemi detaylı bir şekilde açıklayayım.cmake add_custom_command

Bu cxx dosyaları ve hxx dosyalarını ayarladım. Belli bir çeviri dosyası oluşturmak için her birinde perl betiği çalıştırıyorum. Komut,

perl trans.pl source.cxx -o source_cxx_tro 

ve benzer şekilde header.hxx dosyaları için de geçerlidir.

yüzden bazı çoklu komutlar (bir dosya için her)

Sonra bu komutları üretilen çıktı başka perl scripn çalıştırın (source_cxx_tro, header_hxx_tro)

perl combine.pl source_cxx_tro header_hxx_tro -o dir.trx 

dir ile bitireceğiz .trx çıktı dosyasıdır.

Böyle bir şeyim var.

Loop_Over_All_Files() 
Add_Custom_Command (OUTPUT ${trofile} COMMAND perl trans.pl ${file} -o ${file_tro}) 
List (APPEND trofiles ${file_tro}) 
End_Loop() 

Add_Custom_Command (TARGET LibraryTarget POST_BUILD COMMAND perl combine.pl ${trofiles} -o LibraryTarget.trx) 

Beklenti hedefi oluştururken beklediğim, ilk önce trofiller oluşturulacak. ama durum böyle değil. $ {Trofiles} oluşturulmuyor ve dolayısıyla post build komutu bir hatayla sonuçlanıyor. POST_BUILD komutunun önceki özel komuta bağlı olduğunu söyleyebilmemin herhangi bir yolu var mı?

Herhangi bir öneriniz var mı? peşin

sayesinde Surya

cevap

27

kullanın add_custom_command en bir dosya dönüşümü zincirini

  • * oluşturmak için (cxx | Hxx) ile -> * _. (Cxx | HXX) _tro
  • * _ (Cxx | HXX) _tro -> Foo. trx

ve son dönüşümü cmake içindeki birinci sınıf öğeyi add_custom_target kullanarak yapın. Varsayılan olarak, bu hedef TÜM ile işaretlemedikçe veya üzerine kurulu başka bir hedefe izin vermedikçe, oluşturulmayacaktır.

 
set(SOURCES foo.cxx foo.hxx) 
add_library(Foo ${SOURCES}) 

set(trofiles) 
foreach(_file ${SOURCES}) 
    string(REPLACE "." "_" file_tro ${_file}) 
    set(file_tro "${file_tro}_tro") 
    add_custom_command(
    OUTPUT ${file_tro} 
    COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/trans.pl ${CMAKE_CURRENT_SOURCE_DIR}/${_file} -o ${file_tro} 
    DEPENDS ${_file} 
) 
    list(APPEND trofiles ${file_tro}) 
endforeach() 
add_custom_command(
    OUTPUT Foo.trx 
    COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/combine.pl ${trofiles} -o Foo.trx 
    DEPENDS ${trofiles} 
) 
add_custom_target(do_trofiles DEPENDS Foo.trx) 
add_dependencies(Foo do_trofiles) 
3

Sen özel komutların çıkışını tüketir özel hedef oluşturmak istiyoruz. Sonra komutların doğru sırada çalıştırıldığından emin olmak için ADD_DEPENDENCIES kullanın.

Bu yakın istediğinize sıralama olabilir: http://www.cmake.org/Wiki/CMake_FAQ#How_do_I_use_CMake_to_build_LaTeX_documents.3F

Temelde oluşturulan her dosya için bir add_custom_command, o zaman, bu dosyaların (trofiles) bir listesini toplamak listesi trofiles BAĞLIDIR ile add_custom_target kullanın. Ardından LibraryTarget özel hedefe bağlı hale getirmek için add_dependencies kullanın. Ardından, kütüphane hedefi oluşturulmadan önce özel hedef oluşturulmalıdır.