[cmake-developers] [CMake 0015970]: CMake changes order of include directories when a directory is specified both as a SYSTEM and non-SYSTEM include
Mantis Bug Tracker
mantis at public.kitware.com
Thu Feb 11 13:44:48 EST 2016
The following issue has been SUBMITTED.
======================================================================
https://cmake.org/Bug/view.php?id=15970
======================================================================
Reported By: jbohren
Assigned To:
======================================================================
Project: CMake
Issue ID: 15970
Category: CMake
Reproducibility: always
Severity: major
Priority: normal
Status: new
======================================================================
Date Submitted: 2016-02-11 13:44 EST
Last Modified: 2016-02-11 13:44 EST
======================================================================
Summary: CMake changes order of include directories when a
directory is specified both as a SYSTEM and non-SYSTEM include
Description:
I ran into a problem recently where a package I was building set a SYSTEM
include directory which was already a non-SYSTEM include directory imported from
a dependency. When this happened, CMake dropped the non-SYSTEM directory in
favor of the SYSTEM one, causing my build to fail.
According to GCC [1], it gives precedence to non-SYSTEM include directories, and
specifying both for the same path produces a warning.
[1] https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html
> All directories named by -isystem are searched after all directories named by
-I, no matter what their order was on the command line. If the same directory is
named by both -I and -isystem, the -I option is ignored. GCC provides an
informative message when this occurs if -v is used.
With CMake, if both are specified, it drops the non-SYSTEM include and fails
silently. For example, when building this project with any recent version of
CMake on Linux, the build command is:
```bash
/usr/bin/c++ -isystem /path/to/overlay/devel/include -I/opt/ros/indigo/include
-o CMakeFiles/foo.dir/foo.cpp.o -c /home/jbohren/scratch/isystem/foo.cpp
```
But with the three `incude_directory` options given in `CMakeLists.txt`, I would
expect it to read:
```bash
/usr/bin/c++ -I/path/to/overlay/devel/include -I/opt/ros/indigo/include
-isystem /path/to/overlay/devel/include -o CMakeFiles/foo.dir/foo.cpp.o -c
/home/jbohren/scratch/isystem/foo.cpp
```
Even the following would maintain the order of the search paths, since the
non-SYSTEM directories are all scanned before the SYSTEM ones:
```bash
/usr/bin/c++ -I/path/to/overlay/devel/include -I/opt/ros/indigo/include -o
CMakeFiles/foo.dir/foo.cpp.o -c /home/jbohren/scratch/isystem/foo.cpp
```
Steps to Reproduce:
Build this trivial CMake project to observe the effect:
https://github.com/jbohren/isystem
======================================================================
Issue History
Date Modified Username Field Change
======================================================================
2016-02-11 13:44 jbohren New Issue
======================================================================
More information about the cmake-developers
mailing list