Reputation: 25
For my research project I am setting up a project (coom
) to benchmark a set of algorithms on a data structure. For unit testing I settled on Bandit, which leaves me with a project structure that looks as follows:
+ root
|-- CMakeLists.txt
|-+ external/
| \-- bandit/
|-+ src/
| |-- CMakeLists.txt
| |-- node.cpp
| \-- node.h
\-+ test/
|-- CMakeLists.txt
|-- test.cpp
\-- test_node.cpp
From my experience with other languages, this seems to me a standard project structure? The test/
folder contains unit tests for the logic in src/
and no dependencies are intermixed with the source and test code, but are instead in external/
.
The testing files I want to look as follows (with irrelevant parts removed)
// test/test.cpp
#include <bandit/bandit.h>
(...)
#include "test_node.cpp"
int main(int argc, char* argv[]) {
(...)
}
// test/test_node.cpp
#include <coom/node.h>
(...)
But my problem is, that when I try to compile with cmake ..
and the subsequent Makefile
, they are unable to find the source code in src/
where I get the compiler error:
fatal error: coom/node.h: No such file or directory.
I would expect the test/CMakeLists.txt
should look somewhat like the following:
# test/CMakeLists.txt
add_executable (test_unit test.cpp)
target_link_libraries(test_unit coom)
I cannot figure out how to setup the CMakeLists.txt
and src/CMakeLists.txt
to ensure I get the desired outcome above. Currently they look as follows:
# CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project (coom VERSION 0.1)
# ============================================================================ #
# Dependencies
(...)
# ============================================================================ #
# COOM project
add_subdirectory (src)
add_subdirectory (test)
# src/CMakeLists.txt
# ============================================================================ #
# Link up files for the library
set(HEADERS
node.h
)
set(SOURCES
node.cpp
)
add_library(coom ${HEADERS} ${SOURCES})
I can see from other projects, that it is possible to link the src/
directory with some libname/
prefix, but I cannot discern from their CMakeLists.txt
files what I am doing wrong. I have looked at writing a coom.pc.in
file and providing an install
-target, and tried to set_target_properties
with either FOLDER coom
or PREFIX coom
, but neither worked. I can hack an include_directory(../src)
into the test/CMakeLists.txt
to be able to include the file via an #include <node.cpp>
, but that screams I'm doing something inherently wrong.
I'm at this point very much pulling my hairs out, and the CMake documentation is of very little help to me.
Upvotes: 2
Views: 926
Reputation: 18243
Your coom
target has no include directories defined. You can define the include directories to use for this target (with target_include_directories()
), and propagate these include directories so they are visible to the consuming test_unit
target (by using PUBLIC
):
# src/CMakeLists.txt
# ============================================================================ #
# Link up files for the library
set(HEADERS
node.h
)
set(SOURCES
node.cpp
)
add_library(coom ${HEADERS} ${SOURCES})
target_include_directories(coom PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
Furthermore, the file path to the node.h
header is coom/src/node.h
, not coom/node.h
. But, because you now have coom/src
as an public include directory, you can use the following to include the node.h
header in your test file:
#include <node.h>
Upvotes: 1