CMake with include and source paths - basic setup
Solution 1:
You need a CMakeLists.txt
for each source subdirectory. Your structure should look something like this:
root
|-MainProject
| |-inc
| | '-main.h
| |-src
| | |-main.cpp
| | '-CMakeLists.txt
| '-CMakeLists.txt
|-LibProject
| |-inc
| | '-test.h
| |-src
| | |-test.cpp
| | '-CMakeLists.txt
| '-CMakeLists.txt
'-CMakeLists.txt
Content of root/CMakeLists.txt
:
project(MyProject)
add_subdirectory(MainProject)
add_subdirectory(LibProject)
Content of LibProject/CMakeLists.txt
and MainProject/CMakeLists.txt
:
add_subdirectory(src)
Content of LibProject/src/CMakeLists.txt
:
# Notice name prefix of this variable, set by CMake according
# to value given with "project()" in the root CMakeLists.txt.
include_directories(${MyProject_SOURCE_DIR}/LibProject/inc)
add_library(LibProject test.cpp)
Content of MainProject/src/CMakeLists.txt
:
include_directories(${MyProject_SOURCE_DIR}/MainProject/inc)
# I assume you want to use LibProject as a library in MainProject.
include_directories(${MyProject_SOURCE_DIR}/LibProject/inc)
link_directories(${MyProject_SOURCE_DIR}/LibProject/src)
add_executable(MainProject main.cpp)
target_link_libraries(MainProject LibProject)
Then configure and build with:
$ cd root
$ mkdir build
$ cd build
$ cmake ..
$ make
Solution 2:
You could do it like following.
-
CMakeLists.txt in your MainProject directory:
project(MainProject) add_subdirectory(LibProject/src) add_subdirectory(MainProject/src)
-
CMakeLists.txt in your LibProject/src directory:
include_directories(${PROJECT_SOURCE_DIR}/LibProject/inc/) add_library(LibProject test.cpp)
-
CMakeLists.txt in your MainProject/src directory:
include_directories(${PROJECT_SOURCE_DIR}/MainProject/inc/) add_executable(MainProject main.cpp) target_link_libraries(MainProject LibProject)
Solution 3:
In my case I wanted to do it with a single CMakeList. And it worked for me. I add my solution in case it serves to anyone.
This is what I did in my case:
My structure:
Project
|CMakeLists.txt
|-src
| |*.cpp
| |*.c
|-include
| |*.hpp
| |*.h
My CMakeLists.txt have to main parts:
include_directories(
${PROJECT_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/src
)
^ Enables .cpp files to add headers in the include folder.
file(GLOB all_SRCS
"${PROJECT_SOURCE_DIR}/include/*.h"
"${PROJECT_SOURCE_DIR}/include/*.hpp"
"${PROJECT_SOURCE_DIR}/src/*.cpp"
"${PROJECT_SOURCE_DIR}/src/*.c"
)
^ Just add whatever is in those folders.
add_executable(MyTarget ${all_SRCS})
^ Build the target from the list of all sources
PS: if you want to see the full CMakeLists.txt go the the project link NEGU93/ForbiddenDesert.