Subject: [Boost-bugs] [Boost C++ Libraries] #11516: boost include directives use double quotes incorrectly
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2015-07-28 14:34:28
#11516: boost include directives use double quotes incorrectly
----------------------------+-------------------------------------
Reporter: joerg.walter@⦠| Type: Bugs
Status: new | Milestone: To Be Determined
Component: None | Version: Boost Development Trunk
Severity: Problem | Keywords:
----------------------------+-------------------------------------
Many Boost headers use double-quoted include directives with paths that
are not relative to the current header file. For example, this is an
excerpt from `boost/aligned_storage.hpp`:
{{{
#include "boost/config.hpp"
#include "boost/detail/workaround.hpp"
}}}
This will cause the full search path to be searched for the given files,
even the directories supposedly local to the application (set via
`-iquote` option on GCC/Clang), which can make local files interfere with
Boost, especially if there's some part in the local project that is also
called "boost"...
See a full list of offending directives via:
{{{
find /usr/include/boost -type f -exec grep '^#.*"boost/' {} +
}}}
As can be seen in `boost/any.hpp`, this might even be intentional for
`boost/config.hpp`, but this is surely not intended for any other file.
Handling of `boost/config.hpp` is not uniform, however; see for example
`boost/limits.h`, which includes config.hpp via angle-quotes.
This bug report does ''not'' address double-quoted include directives with
header-relative paths, as used copiously by Boost Spirit, for example.
These work fine on GCC/Clang and do not interact with local code (but see
#3762).
I suggest to change all include directives to a uniform style in order to
eliminate interference of local files. The easiest and least-invasive
solution would be to change double quotes to angle brackets, something
along the lines of
{{{
find /usr/include/boost -type f -exec sed -i~ -e 's/^\(#.*
\)"\(boost\/.*\)"/\1<\2>/' {} +
}}}
(warning: search-and-destroy capability; this also updates `#define`s that
are used later in `#include` directives)
After applying this command, my code still compiles and passes all unit
tests, but strace confirms that project-local include directories are no
longer searched, except for `boost/mpl/aux_/preprocessed/gcc/*.hpp`, which
is due to some stringification macro magic in
`boost/mpl/aux_/include_preprocessed.hpp`. That's probably obscure enough
to not matter in practice.
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/11516> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:18 UTC