Estou tentando estruturar meu projeto para incluir as fontes de produção (na srcsubpasta) e testes (na testsubpasta). Estou usando o CMake para criar isso. Como um exemplo mínimo, tenho os seguintes arquivos:
CMakeLists.txt:
cmake_minimum_required (VERSION 2.8)
project (TEST)
add_subdirectory (src)
add_subdirectory (test)
src / CMakeLists.txt:
add_executable (demo main.cpp sqr.cpp)
src / sqr.h
#ifndef SQR_H
#define SQR_H
double sqr(double);
#endif // SQR_H
src / sqr.cpp
#include "sqr.h"
double sqr(double x) { return x*x; }
src / main.cpp - usa sqr, realmente não importa
test / CMakeLists.txt:
find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
include_directories (${TEST_SOURCE_DIR}/src)
ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK)
add_executable (test test.cpp ${TEST_SOURCE_DIR}/src/sqr.cpp)
target_link_libraries(test
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
)
enable_testing()
add_test(MyTest test)
test / test.cpp:
#define BOOST_TEST_MODULE SqrTests
#include <boost/test/unit_test.hpp>
#include "sqr.h"
BOOST_AUTO_TEST_CASE(FailTest)
{
BOOST_CHECK_EQUAL(5, sqr(2));
}
BOOST_AUTO_TEST_CASE(PassTest)
{
BOOST_CHECK_EQUAL(4, sqr(2));
}
Algumas questões:
- Essa estrutura faz sentido? Quais são as melhores práticas ao estruturar este código? (Eu estou vindo de c # e java, e aí é mais fácil em um sentido)
- Não gosto do fato de precisar listar todos os arquivos da
srcpasta notest/CMakeLists.txtarquivo. Se este fosse um projeto de biblioteca, eu apenas vincularia a biblioteca. Existe uma maneira de evitar listar todos os arquivos cpp do outro projeto? - Quais são as linhas
enable_testing()eadd_test(MyTest test)fazendo? Eu não vi nenhum efeito. Como posso executar os testes do CMake (ou CTest)? - Até agora, eu apenas corri
cmake .na pasta raiz, mas isso criou uma confusão com arquivos temporários em todos os lugares. Como posso obter os resultados da compilação em uma estrutura razoável?