2012-04-25 15 views
8

Çok sayıda küçük yürütülebilir dosyadan oluşan bir proje üzerinde çalışıyorum. Yürütülebilir dosyalar terminalden (veya komut isteminden) çalıştırılacak ve herhangi bir programlama dilinde yazılabilir. Yorumlanan dillere yazılanlar, unixy sistemleri için bir shebang hattına sahip olurken, dosya uzantıları Windows'ta PATHEXT ortam değişkenine eklenir.Dosya uzantıları cmake (veya başka bir taşınabilir oluşturma aracı) ile nasıl şeritlenir?

Tüm programlama dillerinde ve her iki ana platform grubunda tutarlı olarak çalıştırılabilirleri kullanmak için, dosya uzantısını unixy sistemlerinde yorumlanmış programların dosya adından çıkarmalıyım. ("Tutarlı kullanım" ile demek istedim: sadece dosya uzantısını belirtmeye gerek kalmadan, onu başlatmak için programın adını yazın.)

Betona daha fazla gitmek için, aşağıdaki CMakeLists dosyası gibi bir şey yazdığımı varsayalım: Ben platformuna bağlı olarak, şartlı elimden edilecek orange.py ve strawberry.lua dosya uzantılarını isterken

project (Mixed Example) 

add_executable (banana banana.cpp) 
add_executable (grape grape.hs) 
add_script? (orange orange.py) 
add_script? (strawberry strawberry.lua) 

install (TARGETS banana grape orange strawberry DESTINATION bin) 

Sonra, banana.cpp ve grape.hs normal şekilde derlenmiş olmak istiyorum. Böylece bin dizin izleyen bir unixy sistemde dosyaları içermelidir:

banana grape orange strawberry 

ve Windows üzerinde aşağıdaki:

banana.exe grape.exe orange.py strawberry.lua 

bunu nasıl?

cevap

6

Eğer CKağıt hedefler olarak bu komut dosyalarını tedavi ve bunun yerine dosyaları olarak tedavi etmezseniz, yapmanız gerekir: Eğer çağırmak yerine bir işlevi kullanmak istiyorsanız

project (Mixed Example) 

add_executable (banana banana.cpp) 
add_executable (grape grape.hs) 

install (TARGETS banana grape DESTINATION bin) 
if (UNIX) 
    install (FILES orange.py DESTINATION bin RENAME orange) 
    install (FILES strawberry.lua DESTINATION bin RENAME strawberry) 
else (WIN32) 
    install (FILES orange.py strawberry.lua DESTINATION bin) 
endif() 


function (install_files) 
    if (UNIX) 
    foreach (file ${ARGV}) 
     get_filename_component (name_without_extension ${file} NAME_WE) 
     install (FILES ${file} DESTINATION bin RENAME ${name_without_extension}) 
    endforeach() 
    else (WIN32) 
    install (FILES ${ARGV} DESTINATION bin) 
    endif() 
endfunction() 

install (TARGETS banana grape DESTINATION bin) 
install_files (orange.py strawberry.lua) 
+0

aynı zamanda yeni bir kural içine bu yapmak için bir yolu var mı, bu yüzden her senaryo için el ile yeniden adlandırma belirtmek gerekmez: install (FILES ... birden çok kez, yapabileceğiniz? Ve daha da önemlisi, her iki komut dosyası için kurulum yöntemini iki kez (yani UNIX için bir kez ve bir kez WIN32 için) tanımlama çabalarını kendimi koruyabilir miyim? – Julian

+0

@Julian Bunun nasıl yapılabileceğini gösteren daha fazla bilgi ekledim. – Fraser

+0

Teşekkürler, bu tam olarak aradığım şey gibi görünüyor! – Julian

İlgili konular