2012-10-16 27 views
5

Birçok alt projeyle birlikte bir CMake projem var. Her biri, bazı belirli bilgileri içeren küçük bir metin dosyası oluşturmak için sağladığım bir işlevi kullanabilir (add_custom_command öğesini arayarak). Son adımda, tüm bu dosyaları bir büyük metin dosyasına birleştirmek istiyorum.CMake: add_custom_command'a bağımlılığı dinamik olarak ekle

Oluşturulan dosyaları (hepsi bir arada) arayarak bunları birleştiren özel bir komut oluşturdum. Sorun şu ki, bu son adım, ne kadar dosya sağlanacağını bilmediğim halde alt projelerde yapılan küçük adımların tümüne bağlı kalmak istiyorum.

Benim son komutu benziyor:

add_custom_command(OUTPUT combination.txt 
        COMMAND create combination.txt from all files from /path/) 

ve benim oluşturmak-küçük metin dosyası-için-her-alt proje komutu gibi görünür:

add_custom_command(OUTPUT /path/${sub_project_name}.txt 
        COMMAND create /path/${sub_project_name}.txt) 

Ve o küçük dosyalar oluştururken "combination.txt" yapmak için gibi /path/${sub_project_name}.txt bağlıdır şey yapmak istiyorum

Yani isterdim:

add_dependency(combination.txt /path/${sub_project_name}.txt) 

Ancak bu yalnızca hedefler için çalışır.

Ben de OBJECT_DEPENDS ile set_source_files_properties kullanmayı denedim ama (belki onun add_target en cpp dosyalarla kullanılacak niyetinde?)

son yolu olsun ben görmek işe çalışmıyor gibi görünüyor tüm bu küçük dosyaları yolları birikir ve daha sonra bu gibi kullanmak olacak bir önbellek değişkeni kullanmaktır:

add_custom_command(OUTPUT combination.txt 
        COMMAND create combination.txt from all files from /path/ 
        DEPENDS ${all_small_files_list}) 

ama bu yapmak istediğim son şey.

cevap

4

add_custom_command kullanmak yerine, doğru bağımlılık tanımlamasıyla add_custom_target kullanabilirsiniz (bu her zaman yapılmamaktadır).

add_custom_target(project 
        COMMAND touch project.txt) 

add_custom_target(project2 
        COMMAND touch project2.txt) 

add_custom_target(combination 
        COMMAND cat project.txt project2.txt > combination.txt) 

add_dependencies(combination project2) 
add_dependencies(combination project) 

add_executable(t t.c) 
add_dependencies(t combination.txt) 

Tekrar: Bir proje hedef ve böylece kombinasyon hedef güncel alır böylece gerçek bağımlılık zincirini oluşturmak için add_custom_target arasında DEPENDS argüman kullandığınızdan emin olun.

UPDATE: Çok erkendüm. Aslında cmake (en az 2.8.9'a kadar) bağımlılıklar için aşağıdaki gibi çalışır: add_dependencies numaralı bir çağrıyla, özel bir IOW a (oluşturulmuş) komut dosyasının OUTPUT bağımlılığını ekleyemezsiniz. add_dependencies ile, add_custom_target tarafından oluşturulan target'u ekleyebilirsiniz. Ancak, add_custom_target'da add_custom_command çıktısına DEPENDS yönergesini kullanarak bağlı olabilirsiniz. Yani bu iş yapar ki:

add_custom_command(OUTPUT project.txt 
        COMMAND uptime >> project.txt MAIN_DEPENDENCY t2.c) 
add_custom_target(project DEPENDS project.txt) 

add_custom_target(combination 
        COMMAND cat project.txt project2.txt > combination.txt) 
add_dependencies(combination project) 

Bu

kombinasyon hedef her zaman hiçbir MAIN_DEPENDENCY veya DEPENDS olduğu gibi rejenere edilmesi, ancak add_dependencies kullanımı izin yapacak.

+0

Bu, tam olarak beklendiği gibi değil, aynı şekilde çalışacaktır: Her ne zaman yaptığım, tüm hedefler (kombinasyon, proje ve proje2) yeniden oluşturulacak - dosyalar yeniden oluşturulacak. Bu, olabildiğince güzel değil;) Benim için beklenen davranış, gerekli olmadıkça herhangi bir dosyayı yeniden oluşturmamaktır. CMake'in belgelerine göre - add_custom_target her zaman üretiliyor. Keşke add_custom_command olarak çalışan bir çözüm bulsaydım - bu yalnızca bağımlılık değiştiğinde oluşur. –

+0

Proje.txt oluşturmak için bağımlılık olarak neler kullanıyorsunuz? Ben, cmake-doc'ın söylemek istediği şey, custom_target'in her zaman yeniden oluşturulup oluşturulmayacağını kontrol edip etmediğidir - en azından benim için böyle çalışıyor gibi görünüyor. –

+0

Peki, nasıl yaptığımızın doğru bir şekilde okunmasından sonra, çok erken olduğumu itiraf etmeliyim. Cevabımı güncellemeye bakın. –