c++cmake

CMake with include and source paths - basic setup


I'm trying to set up a test project looking like my own project just to get things working first and it looks like this:

/MainProject/inc/main.h
/MainProject/src/main.cpp
/LibProject/inc/test.h
/LibProject/src/test.cpp

I've found some tutorials, but I cant find out how to set up this when I have the inc and src folder? How would the CMakeLists.txt files look? Would I have one in /, one in each of the project folders? It seems like I dont need to have one in the inc and src folders?


Solution

  • 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