[CMake] "include_directories" help

John L. Poole jlpoole56 at gmail.com
Thu Aug 2 16:09:44 EDT 2012


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$







-------------- next part --------------
A non-text attachment was scrubbed...
Name: jlpoole56.vcf
Type: text/x-vcard
Size: 164 bytes
Desc: not available
URL: <http://www.cmake.org/pipermail/cmake/attachments/20120802/40bf7639/attachment.vcf>


More information about the CMake mailing list