[CMake] "include_directories" help

David Cole david.cole at kitware.com
Tue Aug 7 14:10:33 EDT 2012


On Thu, Aug 2, 2012 at 4:09 PM, John L. Poole <jlpoole56 at gmail.com> wrote:
> I'm either completely misunderstanding how the CMake command
> "include_directories" works
> or something in my Windows MinGW/CMake (2.8.8) is not working.
>
> BACKGROUND:
>
> http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:include_directories
> specifies:
>
> "Add the given directories to those the compiler uses to search for include
> files."
>
> I'm working on a project that compiles in Linux and I am trying
> to get it to compile on Windows using MinGW.  The open source project
> is Scribus - a layout program much like Adobe PageMaker and Adobe InDesign.
>
> The Scribus project uses CMake.
>
> I've confirmed that in the topmost CMakeLists.txt file of the Scribus source
> code, there is the dependency project Cairo [graphics]
> and that Cairo has as its destination "include" directory
> "/build32/include/cairo"
> specified.  Moreover, at the end of the CMake Configure, I have a MESSAGE
> statement
> that displays the value of INCLUDE_DIRECTORIES, and indeed
> "/build32/include/cairo"
> is therein.
>
> I added a SET statement, just in case, to the topmost Scribus source
> CMakeLists.txt file:
>
>   MESSAGE("Finding CAIRO...")
>   FIND_PACKAGE(CAIRO)
>   IF(CAIRO_FOUND)
>    MESSAGE("CAIRO Library Found OK")
>   SET(CAIRO_INCLUDE_DIR /local32/include/cairo)
>   MESSAGE("Setting CAIRO_INCLUDE_DIR = ${CAIRO_INCLUDE_DIR}")
>
> and the MESSAGE statement duly produces the expected result
> at Configure time in the CMake GUI (invoked with "mingw32-make edit_cache"):
>
>    Finding CAIRO...
>    CAIRO Library Found OK
>    Setting CAIRO_INCLUDE_DIR = /local32/include/cairo
>
> Near the very end of the Configure session,
> I also print out what the INCLUDE_DIRECTORIES
> has just to make sure something has not altered.  My understanding
> is that INCLUDE_DIRECTORIES is like a hash table that you continue
> to append to and that nothing is deleted from it and that it's values
> will appear (or made available to?) on the compile command line.
>
> Here's the code the shows what the value is near the completion of
> Configure:
>
>    get_property(inc_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
>    message("inc_dirs = ${inc_dirs}")
>
> and here is the result:
>
> inc_dirs =
> C:/QT/4.8.2/include;C:/QT/4.8.2/include/QtOpenGL;C:/QT/4.8.2/include/QtWebKit;C:/QT/4.8.2/include/QtGui;C:/QT/4.8.2/include/QtXml;C:/QT/4.8.2/include/QtNetwork;C:/QT/4.8.2/include/QtCore;/local32/include/freetype2;C:/MinGW1/build32/scribus32;C:/MinGW1/build32/scribus32/scribus;C:/QT/4.8.2/include/ActiveQt;C:/QT/4.8.2/include/ActiveQt;C:/QT/4.8.2/include/QtDesigner;C:/QT/4.8.2/include/ActiveQt;C:/QT/4.8.2/include/ActiveQt;C:/QT/4.8.2/include/QtDeclarative;C:/QT/4.8.2/include/QtScriptTools;C:/QT/4.8.2/include/QtDBus;C:/QT/4.8.2/include/QtDesigner;C:/QT/4.8.2/include/QtXml;C:/QT/4.8.2/include/QtSql;C:/QT/4.8.2/include/QtOpenGL;C:/QT/4.8.2/include/QtMultimedia;C:/QT/4.8.2/include/QtNetwork;C:/QT/4.8.2/include/phonon;C:/QT/4.8.2/include/QtXmlPatterns;C:/QT/4.8.2/include/QtWebKit;C:/QT/4.8.2/include/QtHelp;C:/QT/4.8.2/include/QtUiTools;C:/QT/4.8.2/include/QtTest;C:/QT/4.8.2/include/QtScript;C:/QT/4.8.2/include/QtSvg;C:/QT/4.8.2/include/Qt3Support;C:/QT/4.8.2/include/QtGui;C:/QT/4.8.2/include/QtCore;C:/QT/4.8.2/mkspecs/default;C:/QT/4.8.2/include;C:/QT/4.8.2/include/QtCore;/local32/include/cairo;/local32/include;C:/MinGW1/build32/lcms2-2.3/include;C:/MinGW1/local32/include/libxml2;C:/MinGW1/local32/include;C:/MinGW1/local32/bin
>
> What I am seeing is that although Configure reports the inclusion
> of the Cairo "include" directory, the path, nor any of the paths, does not
> show up in the
> code that ultimately gets compiled.
>
> QUESTION:  How do I specify an include directory path that will appear on
> the command line at compilation time?
>
> EXAMPLES:
> The file C:\MinGW1\build32\scribus32\CMakeFiles\build.make has:
> ========================== START ===========================
> scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.obj:
> C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp
>     $(CMAKE_COMMAND) -E cmake_progress_report
> C:\MinGW1\build32\scribus32\CMakeFiles $(CMAKE_PROGRESS_786)
>     @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green
> "Building CXX object scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.obj"
>     cd /d C:\MinGW1\build32\scribus32\scribus &&
> C:\MinGW1\mingw32\bin\g++.exe   $(CXX_DEFINES) $(CXX_FLAGS)
> -DCOMPILE_SCRIBUS_MAIN_APP -o CMakeFiles\scribusSVN.dir\pageitem.cpp.obj -c
> C:\MinGW1\build32\scribusSVN\scribus\pageitem.cpp
>
> scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.i: cmake_force
>     @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green
> "Preprocessing CXX source to CMakeFiles/scribusSVN.dir/pageitem.cpp.i"
>     cd /d C:\MinGW1\build32\scribus32\scribus &&
> C:\MinGW1\mingw32\bin\g++.exe  $(CXX_DEFINES) $(CXX_FLAGS)
> -DCOMPILE_SCRIBUS_MAIN_APP -E
> C:\MinGW1\build32\scribusSVN\scribus\pageitem.cpp >
> CMakeFiles\scribusSVN.dir\pageitem.cpp.i
>
> scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.s: cmake_force
>     @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green
> "Compiling CXX source to assembly CMakeFiles/scribusSVN.dir/pageitem.cpp.s"
>     cd /d C:\MinGW1\build32\scribus32\scribus &&
> C:\MinGW1\mingw32\bin\g++.exe  $(CXX_DEFINES) $(CXX_FLAGS)
> -DCOMPILE_SCRIBUS_MAIN_APP -S
> C:\MinGW1\build32\scribusSVN\scribus\pageitem.cpp -o
> CMakeFiles\scribusSVN.dir\pageitem.cpp.s
>
> scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.obj.requires:
> .PHONY : scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.obj.requires
>
> scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.obj.provides:
> scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.obj.requires
>     $(MAKE) -f scribus\CMakeFiles\scribusSVN.dir\build.make
> scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.obj.provides.build
> .PHONY : scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.obj.provides
>
> scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.obj.provides.build:
> scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.obj
>
> ========================== END ============================
>
> my execution of " mingw32-make scribusSVN VERBOSE=1" concludes with this
> error:
>
> ========================== START ==========================
> Building CXX object scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.obj
> cd /d C:\MinGW1\build32\scribus32\scribus && C:\MinGW1\mingw32\bin\g++.exe
> -DscribusSVN_EXPORTS -DNDEBUG -DWIN32_LEAN_AND_MEAN -DAVOID_WIN32_FILEIO
> -D_CRT_SECURE_NO_DEPRECATE -D_USE_MATH_DEFINES -DCOMPILE_PLUGIN_AS_DLL
> -DQT_DLL -DQT_OPENGL_LIB -DQT_WEBKIT_LIB -DQT_GUI_LIB -DQT_XML_LIB
> -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB
> -DQT_THREAD_LIB -DQT_XML_LIB -DQT_GL_LIB -DHAVE_UNISTD_H -DHAVE_CONFIG_H
> -DQT_DLL -DQT_NO_DEBUG -I/local32/include -mms-bitfields -mthreads
> -mtune=pentium3  -O2 -Wall -fPIC @CMakeFiles/scribusSVN.dir/includes_CXX.rsp
> -DSHAREDIR=\"D:/ScribusOut/share/scribus/\"
> -DDOCDIR=\"D:/ScribusOut/share/doc/\"
> -DICONDIR=\"D:/ScribusOut/share/icons/\"
> -DSAMPLESDIR=\"D:/ScribusOut/share/scribus/samples/\"
> -DSCRIPTSDIR=\"D:/ScribusOut/share/scribus/scripts/\"
> -DTEMPLATEDIR=\"D:/ScribusOut/share/templates/\"
> -DDESKTOPDIR=\"D:/ScribusOut/share/applications/\"
> -DLIBDIR=\"D:/ScribusOut/lib/scribus/\"
> -DPLUGINDIR=\"D:/ScribusOut/plugins\" -DCOMPILE_SCRIBUS_MAIN_APP -o
> CMakeFiles\scribusSVN.dir\pageitem.cpp.obj -c
> C:\MinGW1\build32\scribusSVN\scribus\pageitem.cpp
> C:\MinGW1\build32\scribusSVN\scribus\pageitem.cpp:1:0: warning: -fPIC
> ignored for target (all code is position independent) [enabled by default]
> C:\MinGW1\build32\scribusSVN\scribus\pageitem.cpp:84:19: fatal error:
> cairo.h: No such file or directory
> compilation terminated.
> mingw32-make[3]: *** [scribus/CMakeFiles/scribusSVN.dir/pageitem.cpp.obj]
> Error 1
> mingw32-make[3]: Leaving directory `C:/MinGW1/build32/scribus32'
> mingw32-make[2]: *** [scribus/CMakeFiles/scribusSVN.dir/all] Error 2
> mingw32-make[2]: Leaving directory `C:/MinGW1/build32/scribus32'
> mingw32-make[1]: *** [scribus/CMakeFiles/scribusSVN.dir/rule] Error 2
> mingw32-make[1]: Leaving directory `C:/MinGW1/build32/scribus32'
> mingw32-make: *** [scribusSVN] Error 2
> jlpoole at jlpoole-PC /build32/scribus32$
> ========================== END ============================
>
> What causes the compilation of pageitem.cpp to work is to have present
> as a command parameter "I/local32/include/cairo".
>
> Here is a slighty modified version (changing the back slash to forward
> slash) confirming
> the failure to compile:
> +++++++++++++++++++++++++ START ++++++++++++++++++++++++++++
> jlpoole at jlpoole-PC /build32/scribus32$ cd /build32/scribus32/scribus &&
> /mingw32/bin/g++.exe -DscribusSVN_EXPORTS -DNDEBUG -DWIN32_LEAN_AND_MEAN
> -DAVOID_WIN32_FILEIO -D_CRT_SECURE_NO_
> DEPRECATE -D_USE_MATH_DEFINES -DCOMPILE_PLUGIN_AS_DLL -DQT_DLL
> -DQT_OPENGL_LIB -DQT_WEBKIT_LIB -DQT_GUI_LIB -DQT_XML_LIB -DQT_NETWORK_LIB
> -DQT_CORE_LIB -DQT_DLL -DQT_C
> ORE_LIB -DQT_GUI_LIB -DQT_THREAD_LIB -DQT_XML_LIB -DQT_GL_LIB
> -DHAVE_UNISTD_H -DHAVE_CONFIG_H -DQT_DLL -DQT_NO_DEBUG -I/local32/include
> -mms-bitfields -mthreads -mtune
> =pentium3  -O2 -Wall -fPIC @CMakeFiles/scribusSVN.dir/includes_CXX.rsp
> -DSHAREDIR=\"D:/ScribusOut/share/scribus/\"
> -DDOCDIR=\"D:/ScribusOut/share/doc/\" -DICONDIR=\"
> D:/ScribusOut/share/icons/\"
> -DSAMPLESDIR=\"D:/ScribusOut/share/scribus/samples/\"
> -DSCRIPTSDIR=\"D:/ScribusOut/share/scribus/scripts/\"
> -DTEMPLATEDIR=\"D:/ScribusOut/
> share/templates/\" -DDESKTOPDIR=\"D:/ScribusOut/share/applications/\"
> -DLIBDIR=\"D:/ScribusOut/lib/scribus/\"
> -DPLUGINDIR=\"D:/ScribusOut/plugins\" -DCOMPILE_SCRIBUS_M
> AIN_APP -o CMakeFiles/scribusSVN.dir/pageitem.cpp.obj -c
> C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp
> C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp:1:0: warning: -fPIC
> ignored for target (all code is position independent) [enabled by default]
> C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp:84:19: fatal error:
> cairo.h: No such file or directory
> compilation terminated.
> ++++++++++++++++++++++++++ END ++++++++++++++++++++++++++++
>
> Here is the same code, but I have added as the first parameter
> "-I/local32/include/cairo":
>
> +++++++++++++++++++++++++ START ++++++++++++++++++++++++++++
> jlpoole at jlpoole-PC /build32/scribus32/scribus$ cd /build32/scribus32/scribus
> && /mingw32/bin/g++.exe -I/local32/include/cairo -DscribusSVN_EXPORTS
> -DNDEBUG -DWIN32_LEAN_AND_MEAN -DAVOID_WIN32
> _FILEIO -D_CRT_SECURE_NO_DEPRECATE -D_USE_MATH_DEFINES
> -DCOMPILE_PLUGIN_AS_DLL -DQT_DLL -DQT_OPENGL_LIB -DQT_WEBKIT_LIB
> -DQT_GUI_LIB -DQT_XML_LIB -DQT_NETWORK_LIB -DQT
> _CORE_LIB -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_THREAD_LIB -DQT_XML_LIB
> -DQT_GL_LIB -DHAVE_UNISTD_H -DHAVE_CONFIG_H -DQT_DLL -DQT_NO_DEBUG
> -I/local32/include -mms-b
> itfields -mthreads -mtune=pentium3  -O2 -Wall -fPIC
> @CMakeFiles/scribusSVN.dir/includes_CXX.rsp
> -DSHAREDIR=\"D:/ScribusOut/share/scribus/\" -DDOCDIR=\"D:/ScribusOut/
> share/doc/\" -DICONDIR=\"D:/ScribusOut/share/icons/\"
> -DSAMPLESDIR=\"D:/ScribusOut/share/scribus/samples/\"
> -DSCRIPTSDIR=\"D:/ScribusOut/share/scribus/scripts/\" -DTEM
> PLATEDIR=\"D:/ScribusOut/share/templates/\"
> -DDESKTOPDIR=\"D:/ScribusOut/share/applications/\"
> -DLIBDIR=\"D:/ScribusOut/lib/scribus/\" -DPLUGINDIR=\"D:/ScribusOut/plug
> ins\" -DCOMPILE_SCRIBUS_MAIN_APP -o
> CMakeFiles/scribusSVN.dir/pageitem.cpp.obj -c
> C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp
> C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp:1:0: warning: -fPIC
> ignored for target (all code is position independent) [enabled by default]
>
> C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp: In member function
> 'virtual void PageItem::restore(UndoState*, bool)':
> C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp:4657:8: warning: unused
> variable 'dummy' [-Wunused-variable]
> C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp: In member function 'void
> PageItem::restorePStyle(SimpleState*, bool)':
> C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp:6458:6: warning: variable
> 'styleid' set but not used [-Wunused-but-set-variable]
> C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp: In member function 'void
> PageItem::restoreGradientMeshColor(SimpleState*, bool)':
> C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp:5747:48: warning: 'mp' may
> be used uninitialized in this function [-Wmaybe-uninitialized]
> In file included from C:/QT/4.8.2/include/QtGui/qcolor.h:1:0,
>                  from
> C:/QT/4.8.2/include/QtGui/../../src/gui/kernel/qpalette.h:46,
>                  from C:/QT/4.8.2/include/QtGui/qpalette.h:1,
>                  from
> C:/QT/4.8.2/include/QtGui/../../src/gui/kernel/qwidget.h:49,
>                  from C:/QT/4.8.2/include/QtGui/qwidget.h:1,
>                  from C:/QT/4.8.2/include/QtGui/QWidget:1,
>                  from C:/MinGW1/build32/scribusSVN/scribus/pageitem.h:28,
>                  from C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp:24:
> C:/QT/4.8.2/include/QtGui/../../src/gui/painting/qcolor.h: In member
> function 'void PageItem::setMeshPointColor(int, int, QString, int, double,
> bool)':
> C:/QT/4.8.2/include/QtGui/../../src/gui/painting/qcolor.h:293:27: warning:
> 'mp' may be used uninitialized in this function [-Wmaybe-uninitialized]
> C:/MinGW1/build32/scribusSVN/scribus/pageitem.cpp:3019:13: note: 'mp' was
> declared here
> jlpoole at jlpoole-PC /build32/scribus32/scribus$
> ++++++++++++++++++++++++++ END ++++++++++++++++++++++++++++
>
> The above demonstrates that the header was resolved, albeit there are some
> warnings, and the
> object file created:
>
> jlpoole at jlpoole-PC /build32/scribus32/scribus$ ls -la
> CMakeFiles/scribusSVN.dir/pageitem.cpp.obj
> -rw-r--r-- 1 jlpoole Administrators 1462256 Aug  2 12:36
> CMakeFiles/scribusSVN.dir/pageitem.cpp.obj
> jlpoole at jlpoole-PC /build32/scribus32/scribus$
>
>
>
>
>
>
>
>
> --
>
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.cmake.org/mailman/listinfo/cmake



Do you actually call:

  include_directories(${CAIRO_INCLUDE_DIR})

somewhere?

Is there a typo in the variable name used in the call?


More information about the CMake mailing list