[Boost-bugs] [Boost C++ Libraries] #11516: boost include directives use double quotes incorrectly

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