[CMake] Beginner's Question: Organizing Projects

Dominik Gabi dkgispam at gmail.com
Wed Oct 27 09:15:15 EDT 2010


Thanks. The way I understand this is that now instead of 

include_directories(${GTKMM_INCLUDE_DIRS})

i would write something like 

include_directories(${GTKMM_INCLUDE_DIRS})
# and at the end of the file
set(INCLUDE_DIRECTORIES ${INCLUDE_DIRECTORIES} PARENT_SCOPE)

? I'd do the same with the LINK_DIRECTORIES, LINK_LIBRARIES property and
for all other libraries? 

Is this more or less what you mean by "exporting"? Sorry for the stupid
questions but I'm currently a bit overwhelmed by the cmake
documentation...

Thanks, 
  Dominik.

On Wed, 2010-10-27 at 14:32 +0200, Marcel Loose wrote:
> On Wed, 2010-10-27 at 14:02 +0200, Dominik Gabi wrote:
> > Hi,
> > 
> > after reading the tutorial I've decided to make my own project using
> > cmake but I'm having some troubles here. I'd like to organize my
> project
> > as follows:
> > 
> > Pixels/
> >   CMakeLists.txt (0)
> >   Pixels.cpp
> >   geometry/
> >     CMakeLists.txt (1)
> >     Vector.h Vector.cpp ...
> >   ui/
> >     CMakeLists.txt (2)
> >     MainWindow.h MainWindow.cpp ...
> > 
> > The dependencies are the following: the geometry package should be
> self
> > sufficient. The ui package needs the geometry library, gtkmm etc. and
> > Pixels.cpp for now just calls a static method in MainWindow therefore
> > depends only on ui.
> > 
> > I've spent the past few hours trying to get everything to compile but
> I
> > always end up with some cmake or linker error :(
> > 
> > Here's what I've come up with so far:
> > 
> > ### CMakeLists.txt (1)
> > add_library(Geometry Vector.h Vector.cpp ...)
> > 
> > ### CMakeLists.txt (2)
> > add_library(Ui MainWindow.h MainWindow.cpp ...)
> > 
> > # Geometry
> > include_directories(${PIXELS_SRC_DIR}/geometry)
> > link_directories(${PIXELS_BIN_DIR}/geometry)
> > target_link_libraries(Ui Geometry)
> > 
> > find_package(PkgConfig)
> > # GTKMM
> > pkg_check_modules(GTKMM gtkmm-2.4)
> > include_directories(${GTKMM_INCLUDE_DIRS})
> > link_directories(${GTKMM_LIBRARY_DIRS})
> > target_link_libraries(Ui ${GTKMM_LIBRARIES})
> > 
> > # GTKGLEXTMM
> > pkg_check_modules(GLEXT gtkglextmm-1.2)
> > include_directories(${GLEXT_INCLUDE_DIRS})
> > link_directories(${GLEXT_LIBRARY_DIRS})
> > target_link_libraries(Ui ${GLEXT_LIBRARIES})
> > 
> > ### CMakeLists.txt (0)
> > cmake_minimum_required(VERSION 2.8)
> > project(Pixels)
> > 
> > set(PIXELS_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
> > set(PIXELS_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR})
> > 
> > add_executable(Pixels Pixels.cpp)
> > 
> > include_directories(${PIXELS_SRC_DIR}/ui)
> > add_subdirectory(${PIXELS_SRC_DIR}/ui)
> > target_link_libraries(Pixels Ui)
> > ### end
> > 
> > Unfortunately, this results in a ton of errors such as 
> > 
> > make[2]: *** [CMakeFiles/Pixels.dir/Pixels.cpp.o] Error 1
> > make[1]: *** [CMakeFiles/Pixels.dir/all] Error 2
> > make: *** [all] Error 2
> > 
> > "Gtk has not been declared", "Vector.h: no such file or directory".
> > Obviously I'm not doing it right ;)
> > 
> > The question then is: What am I doing wrong?
> > 
> > Thanks,
> >   Dominik.
> >  
> 
> Hi Dominik,
> 
> You should realize that variables have scope, as have properties you set
> on directories (which happens when you use, e.g.,
> include_directories()). The GTK stuff is only put on the include path in
> the UI directory. 
> 
> There are, IMO, two ways you can solve this.
> 
> 1) Search for GTK in you top-level CMakeLists.txt file and use
> include_directories() there. This will ensure that the
> INCLUDE_DIRECTORIES property is set on all the subdirectories.
> 
> 2) "Export" the GTK include directory up-level. The IMO fragile way of
> doing this is using PARENT_SCOPE, because you have to use that at all
> intermediate levels. The safer way is to use a global property.
> 
> The first option is definitely the easiest to implement but, for larger
> projects, will cause your top-level CMakeLists.txt file to grow
> extensively. And, worse, that file will "share implementation details"
> of some lower-level directory, requiring package XYZ. So, for larger
> projects, I would choose the seconds option.
> 
> Hope this helps.
> 
> Best regards,
> Marcel Loose.
> 
> 
> 




More information about the CMake mailing list