2010-08-07 12 views
17

Kod ve birkaç veri dosyası içeren bir CMake projem var (görüntüler net olacak şekilde).CMake ile veri dosyalarını en iyi nasıl kullanılır?

Benim dizin yapısı şu şekildedir:

  • src

src kaynak kodunu içeren

  • verileri, veri veri dosyaları. CMake, kaynak oluşturulmasını önerir, böylece 'u yapmam için çalıştırılabilir programa sahibim, ancak veri dosyalarını değil, bu yüzden programı çalıştıramıyorum. nedenle ben şimdiki gibi geliştirmek, gerekli konuma benim veri dosyalarını kopyalamak ve o iş yapacak make install Tabii

    :

    1. cmake -DCMAKE_INSTALL_DIR = dist
    2. <edit source code>
    3. make install
    4. dist/MyProgram.EXE

    Komut satırı ve editör ile çalışıyorum, ancak kısa bir süre sonra Eclipse CDT'ye geçmeye karar verdim. CMake'ten bir Eclipse projesi oluşturmak harika, ancak Eclipse'den yükleme hedefini el ile yürütmek çok hoş değil.

    Bu sorunu nasıl çözüyorsunuz? Programınızın ikili olduğu yerde olmasa bile veri dizinini bulmaya çalışmak için bazı akıllı algoritmalar var mı? Yoksa kaynak yapılarını kullanmıyor musunuz? Bu sorunu çözmelidir.

  • cevap

    16

    configure_file bu sorunu çözmelidir.

    aşağıdakileri içerir benim veri dizininde bir CMakeLists.txt dosyası var:

    configure_file(data_file ${CMAKE_CURRENT_BINARY_DIR}/data_file COPYONLY) 
    

    bile aynı konumda hangi nedenle cmake, çağrıldığında inşa dizine Bu kopyalar Belirtilen dosya kaynak dışı inşa edilir. file komut yapar iken ancak

    configure_file dizinleri desteklemez:

    file(COPY assets DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) 
    
    +3

    ayrı ayrı her dosya için – Arne

    +2

    bunu yapmak zorundayım kullandığım 'dosyası (KOPYA varlıkları HEDEF $ {CMAKE_CURRENT_BINARY_DIR})' Eğer bilmelidir – WarmWaffles

    11

    Ve dosya kopyalama eğer çok fazla zaman alır (onlar ... görüntülerdir) bunu daha da iyi oluşturarak yapabilir, bir " kaynak dizininizdeki veri yollarını içeren configure_file ile özel "data_header.h".

    Bu

    benim yaptığım: CMake içinde

    const char* const global_testdatapath = "@[email protected]"; 
    

    ve sonra kullanmak configure_file:

    # Assume CMake knows a variable Test_Data_Path, it will be filled in automatically 
    # in the generated config/Global_Build_Config.h 
    configure_file(Global_Build_Config.h.in ${CMAKE_BINARY_DIR}/config/Global_Build_Config.h) 
    # The config directory should be added as a include-searchpath 
    include_directories(${CMAKE_BINARY_DIR}/config/) 
    

    aşağıdaki içeren, benim kaynağında bir dosyayı "global_build_config.h.in" var Daha sonra cpp dosyamda "Global_Build_Config.h" yi ekleyebilir ve sabit yola başvurabilirim.

    +0

    projenin bu marka ambalajı çok daha karmaşık, çünkü bir paket derlemesi için bu cmake, yazmak zorunda olduğunuz extre cmake kodunu belirtmemesi için tekrar çalıştırılmalıdır. – Arne

    2

    Sorunuz biraz eski ama durumda hala ilgileniyorsanız (veya bir başkası), ben bir birim test hedefi için TestData kopya benzer bir senaryo vardır: Yani

    add_custom_command(TARGET ${UTEST_EXE_NAME} 
        POST_BUILD 
        COMMAND ${CMAKE_COMMAND} -E echo "Copying unit test data.." 
        COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_HOME_DIRECTORY}/utest/testdata ${CMAKE_BINARY_DIR} 
        ) 
    

    ana fikir, bir inşa sonrası hedefi kullanmaktır ve her bir yapıdan sonra yürütülür. Benim için çok fazla veri değil ve dosya sistemi önbelleğe alır, bu yüzden kopyalama işlemini hiç hissetmiyorum. Muhtemelen copy_if_different ile kopyalayarak bunu geliştirebilirsiniz. Ancak, bu durumda, görüntü dosyalarınızın bir listesini oluşturmanız ve bir döngü yazmanız gerekir, çünkü komut dosya bazlıdır. GLOB komutuyla, gerek duymanız halinde bunun yapılması zor olmamalıdır.

    İlgili konular