Estou tentando o CTest no CMake para executar automaticamente alguns dos meus testes usando o make test
alvo. O problema é que o CMake não "entende" que o teste que estou disposto a executar precisa ser construído, pois faz parte do projeto.
Portanto, estou procurando uma maneira de especificar explicitamente essa dependência.
dependencies
cmake
ctest
claf
fonte
fonte
check
alvo e eles possam colidirNa verdade, existe uma maneira de usar
make test
. Você precisa definir a construção do executável de teste como um dos testes e, em seguida, adicionar dependências entre os testes. Isso é:fonte
Eu uso uma variante da resposta de richq. No nível superior
CMakeLists.txt
, adiciono um destino personalizado,,build_and_test
para criar e executar todos os testes:Nos vários
CMakeLists.txt
arquivos de subprojeto emtest/
, adiciono cada executável de teste como uma dependência debuild_and_test
:Com essa abordagem, eu só preciso em
make build_and_test
vez demake test
(oumake all test
), e tem a vantagem de apenas construir o código de teste (e suas dependências). É uma pena que não posso usar o nome do alvotest
. No meu caso, não é tão ruim porque tenho um script de nível superior que faz a depuração fora da árvore e libera (e compila compilações cruzadas) chamandocmake
e entãomake
, e isso se traduztest
embuild_and_test
.Obviamente, o material GTest não é necessário. Acontece que eu uso / gosto do Google Test e queria compartilhar um exemplo completo de como usá-lo com o CMake / CTest. IMHO, essa abordagem também tem o benefício de me permitir usar
ctest -V
, que mostra a saída do Google Test enquanto os testes são executados:fonte
Se você está tentando emular
make check
, pode achar esta entrada do wiki útil:http://www.cmake.org/Wiki/CMakeEmulateMakeCheck
Acabei de verificar se ele faz o que diz com sucesso (CMake 2.8.10).
fonte
make check
. Para testes com tempos de compilação dominantes, isso tornactest -R
inútil.Evite a dor de cabeça:
Funciona imediatamente para mim e cria dependências antes de executar o teste. Dado o quão simples isso é, isso quase torna a
make test
funcionalidade nativa conveniente porque dá a você a opção de executar os últimos testes de compilação, mesmo se seu código estiver corrompido.fonte
make -j4 all && make test
. E também fica difícil usar uma ferramenta de compilação não-Make.Se você estiver usando CMake> = 3.7, a abordagem recomendada é usar acessórios :
Isso faz o seguinte:
test
alvo executável criado a partir detest.cpp
test_build
"teste" que executa o Cmake para construir o destinotest
test_build
teste como uma tarefa de configuração de fixaçãotest_fixture
test
teste que apenas execute otest
executáveltest
teste para precisar de fixaçãotest_fixture
.Portanto, toda vez que o teste
test
deve ser executado, ele primeiro executa o testetest_build
, que cria o executável necessário.fonte
$<CONFIG>
não for definido, o--target
se tornará o argumento para o--config
.$<CONFIG>
sempre não está vazio. É uma expressão geradora para o nome da configuração: cmake.org/cmake/help/latest/manual/… Vou editar a resposta para colocá-la entre aspas de qualquer maneira, porque não faz diferença.cmake
? Eu faço desta forma:mkdir build; cd build; cmake ..; make
. E parece que não há nenhum padrão e todas as variáveis relacionadas estão vazias, até queCMAKE_BUILD_TYPE
seja definido manualmente. (atualmente no Debian 10, não verifiquei outras plataformas)Isso é o que eu martelei e tenho usado:
YMMV
fonte
Resposta de Derrick, simplificada e comentada:
Não é perfeitamente correto, pois não resolve o problema de concorrência de execução
ninja all test
, caso alguém o faça. Pelo contrário, porque agora, você tem dois processos ninja.A solução final, se você me perguntar, é usar Meson em vez de CMake. Meson acertou, entre muitas outras coisas.
fonte
Todas as respostas acima são perfeitas. Mas, na verdade, o CMake usa o CTest como suas ferramentas de teste, então o método padrão (eu acho que é) para fazer a missão é:
Em seguida, execute cmake e make para construir os alvos. Depois disso, você pode executar make test ou apenas executar
você obterá o resultado. Isso é testado no CMake 2.8.
Verifique os detalhes em: http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing
fonte
enable_testing()
,add_test()
, etc. O problema é que ele tem que emitir manualmente o comando de compilação antes de executar testes. Ele deseja que omake test
destino crie automaticamente os executáveis de teste conforme necessário.Todas as respostas são boas, mas implicam em uma violação da tradição de executar um teste por comando
make test
. Eu fiz este truque:Isso significa que o teste consiste na construção (opcional) e na execução do destino executável.
fonte
make
e perde o recurso do CMake de geração de scripts para outras ferramentas de construção.