2013-06-10 21 views
9

Tworzę mały program, który wymaga pliku obrazu foo.bmp do uruchomienia
, więc mogę skompilować program, ale aby go uruchomić, muszę skopiować foo.bmp do "kompilacji" "podkatalogu ręcznie jakiego polecenia powinienem użyć w CMakeLists.txt, aby automatycznie dodać foo.bmp do kompilacji podkatalogu podczas kompilacji programu?CMake: dodawanie własnych zasobów do budowania katalogu

Odpowiedz

9

Aby to zrobić, należy użyć polecenia add_custom_command, aby wygenerować reguły kompilacji dla potrzebnych plików w katalogu budowania. Następnie dodaj zależności od celów do tych plików: CMake buduje tylko coś, co jest potrzebne dla celu.

Powinieneś także upewnić się, że kopiujesz tylko pliki, jeśli nie budujesz z katalogu źródłowego.

coś takiego:

project(foo) 

cmake_minimum_required(VERSION 2.8) 

# we don't want to copy if we're building in the source dir 
if (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) 

    # list of files for which we add a copy rule 
    set(data_SHADOW yourimg.png) 

    foreach(item IN LISTS data_SHADOW) 
     message(STATUS ${item}) 
     add_custom_command(
      OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${item}" 
      COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${item}" "${CMAKE_CURRENT_BINARY_DIR}/${item}" 
      DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${item}" 
     ) 
    endforeach() 
endif() 

# files are only copied if a target depends on them 
add_custom_target(data-target ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/yourimg.png") 

W tym przypadku używam „all” niestandardowy cel z zależnością pliku yourimg.png zmusić kopię, ale można również dodać zależność od jednego Twoich obecnych celów.

+0

co robi add_custom_target linię robi. Próbowałem zmodyfikować twój kod i zawrzeć pętlę foreach dla linii add_custom_target, ale to nie powiedzie się na wielu plikach – Archit

+0

Tak, domyślam się, że masz problem z zależnościami ... jak powiedziałem, tylko pliki potrzebne do celów są zbudowane. Więc jeśli nie ma celu zależnego od twoich obrazów, nie zostaną one zbudowane. Dlatego dodaję "add_custom_target" w moim przykładzie. Lepszą regułą może być 'add_custom_target (data-target ALL DEPENDS $ {data_SHADOW}), więc zawsze zależy to od wszystkich obrazów. – Guillaume

1

Jeśli mogłoby to pomóc, spróbowałem innego rozwiązania, używając polecenia file. Istnieje opcja COPY, która po prostu kopiuje plik lub katalog ze źródła do dest.

Jak to: FILE(COPY yourImg.png DESTINATION "${CMAKE_BINARY_DIR}")

względna ścieżka działa również dla odbiorcy (. Można po prostu użyć na przykład)

odniesienia Doc: https://cmake.org/cmake/help/v3.0/command/file.html

Powiązane problemy