Estou tentando criar um projeto simples no CLion. Ele usa CMake (sou novo aqui) para gerar Makefiles para construir o projeto (ou algum tipo dele)
Tudo que preciso é transferir algum arquivo que não seja do projeto (algum tipo de arquivo de recurso) para o diretório binário toda vez que executo o meu código.
Esse arquivo contém dados de teste e um aplicativo aberto para lê-los. Tentei várias maneiras de fazer isso:
Através da
file(COPY ...
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/input.txt
Parece bom, mas funciona apenas uma vez e não copia novamente o arquivo após a próxima execução.
Através da
add_custom_command
OUTPUT
versãoadd_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.txt ${CMAKE_CURRENT_BINARY_DIR}/input.txt)
TARGET
versãoadd_custom_target(foo) add_custom_command( TARGET foo COMMAND ${CMAKE_COMMAND} copy ${CMAKE_CURRENT_BINARY_DIR}/test/input.txt ${CMAKE_SOURCE_DIR})
Mas nada disso funciona.
O que estou fazendo de errado?
configure_file
não funcionará com subdiretórios, mesmo que você use GLOB para criar uma lista de arquivos.ambas as opções são válidas e visam duas etapas diferentes de sua construção:
file(COPY ...
copia o arquivo na etapa de configuração e somente nesta etapa. Quando você reconstrói seu projeto sem ter alterado a configuração do cmake, este comando não será executado.add_custom_command
é a escolha preferida quando você deseja copiar o arquivo em cada etapa de construção.A versão certa para sua tarefa seria:
você pode escolher entre
PRE_BUILD
,PRE_LINK
,POST_BUILD
melhor é que você leia a documentação de add_custom_commandum exemplo de como usar a primeira versão pode ser encontrado aqui: Use CMake add_custom_command para gerar fonte para outro destino
fonte
CMAKE_CURRENT_SOURCE_DIR
se otest/input.txt
arquivo for relativo aoCMakeLists.txt
arquivo atual . Se for relativo à raizCMakeLists.txt
, useCMAKE_SOURCE_DIR
.A primeira opção que você tentou não funcionou por dois motivos.
Primeiro, você se esqueceu de fechar o parêntese.
Em segundo lugar,
DESTINATION
deve ser um diretório, não um nome de arquivo. Supondo que você fechou o parêntese, o arquivo iria parar em uma pasta chamadainput.txt
.Para fazer funcionar, basta alterá-lo para
fonte
Eu sugeriria
TARGET_FILE_DIR
se você deseja que o arquivo seja copiado para a mesma pasta do seu arquivo .exe.No VS, este script cmake irá copiar input.txt para o mesmo arquivo que seu exe final, não importa se ele é depurado ou lançado.
fonte
Isso é o que eu usei para copiar alguns arquivos de recursos: os arquivos de cópia são um alvo vazio para ignorar erros
fonte
add_dependencies(MainTarget copy-files)
para fazê-lo rodar automaticamente quando eu construir MainTargetadd_dependencies(MainTarget copy-files)
noCMakeLists.txt
arquivo raiz significa que ele pode ser usado em todo o projeto.se você deseja copiar a pasta do diretório atual para a pasta binária (pasta de compilação)
então o syntexe é:
fonte
O configure_file sugerido é provavelmente a solução mais fácil. No entanto, ele não executará novamente o comando de cópia se você excluiu manualmente o arquivo do diretório de construção. Para lidar também com este caso, o seguinte funciona para mim:
fonte