2017-02-14 13 views
2

Я пытаюсь написать модульные тесты для классов в библиотеке. Построение библиотеки lib и проводится с помощью CMake.Модульные тесты с CMake без дублирования компиляции

├── CMakeLists.txt 
├── src 
│   ├── Bar.cpp 
│   ├── CMakeLists.txt 
│   └── Foo.cpp 
└── test 
    ├── BarTest.cpp 
    ├── CMakeLists.txt 
    └── FooTest.cpp 

src/CMakeLists.txt просто add_library(Example Foo.cpp Bar.cpp). А потому, что я хотел бы построить модульные тесты без создания библиотеки (т.е. если я внести изменения, чтобы сказать Foo я могу запустить его модульное тестирование, не имея взаимодействие с Bar работать уже. Так test/CMakeLists.txt выглядит это:

add_executable(FooTest FooTest.cpp ${CMAKE_SOURCE_DIR}/src/Foo.cpp) 
add_test(bla::FooTest ${CMAKE_CURRENT_BINARY_DIR}/FooTest) 

add_executable(BarTest BarTest.cpp ${CMAKE_SOURCE_DIR}/src/Bar.cpp) 
add_test(bla::BarTest ${CMAKE_CURRENT_BINARY_DIR}/BarTest) 

Однако, это приводит каждый исходный файл, будучи строить дважды:

[ 11%] Building CXX object src/CMakeFiles/Example.dir/Foo.o 
[ 22%] Building CXX object src/CMakeFiles/Example.dir/Bar.o 
[ 33%] Linking CXX static library libExample.a 
[ 33%] Built target Example 
[ 44%] Building CXX object test/CMakeFiles/FooTest.dir/FooTest.o 
[ 55%] Building CXX object test/CMakeFiles/FooTest.dir/__/src/Foo.o 
[ 66%] Linking CXX executable FooTest 
[ 66%] Built target FooTest 
[ 77%] Building CXX object test/CMakeFiles/BarTest.dir/BarTest.o 
[ 88%] Building CXX object test/CMakeFiles/BarTest.dir/__/src/Bar.o 
[100%] Linking CXX executable BarTest 
[100%] Built target BarTest 

можно ли избежать этого Т.е., если у меня есть построить src/Foo.cpp б efore для модульного теста , не собирайте его снова для библиотеки? Все флаги одинаковы.

ответ

1

Если вы не возражаете дополнительные цели, это то, что CMake-х object libraries предназначены для:

add_library(Foo OBJECT Foo.cpp) 
add_library(Bar OBJECT Bar.cpp) 
add_executable(Example $<TARGET_OBJECTS:Foo> $<TARGET_OBJECTS:Bar>) 

А потом

add_executable(FooTest FooTest.cpp $<TARGET_OBJECTS:Foo>) 
add_executable(BarTest BarTest.cpp $<TARGET_OBJECTS:Bar>) 

 Смежные вопросы

  • Нет связанных вопросов^_^