Hi, this issue has been discussed here in 2011, but not to my satisfaction (http://www.cmake.org/pipermail/cmake/2011-December/thread.html#48266).
My logging code uses __FILE__ to print the name of the relevant source
file; cmake's absolute-path compiler invocations, combined with gcc's
implementation of __FILE__, cause two issues:
(0.0) The build path ends up being part of the binary
(0.1) The build path is printed for every log message
I've identified several solutions, all of which are unsatisfactory:
(1.0) At the top of every single source and header file, writing
'#line 2 subdir/my_file.cpp'.
(1.1) Using run-time string manipulations to sanitize the filename.
Doesn't solve (0.0) and comes with a run-time cost.
(1.2) Using compile-time string manipulations to sanitize the filename.
Due to limitations of C++, this requires template metaprogramming,
leading to unreasonable complexity and compile times.
(1.3) Storing CMAKE_SOURCE_DIR as an constexpr in configure.h,
and using that to calculate constexpr offsets into the __FILE__
literals. This does not solve (0.0), but it's the solution I've
decided to use for now.
(1.4) Replacing gcc by a wrapper script that sanitizes all
filename arguments and changes the working directory.
The following are not solutions at all:
(2.0) Using '-DFILENAME=subdir/my_file.cpp'. This fails for
included headers.
(2.1) Ignoring the issue. I care about such minor details.
Over the last several decades, at least on the POSIX platform, it has
become common practice to invoke compilers with relative file paths, and
compilers have adopted to act accordingly. While the true culprit is the
C standard's lax definition of __FILE__, I'm blaming cmake's unusual,
absolute-path invocation behavior.
Even in the unlikely event that gcc (and clang) decided to introduce
flags that would modify the behavior of __FILE__, all they could do
would be stripping the entire basename, so 'project_dir/my_file.cpp' and
'project_dir/subdir/my_file.cpp' would have the same value for __FILE__.
I suggest adding an additional, optional parameter to add_executable
that would allow switching on relative gcc invocations from a directory
of the user's choosing.
Thanks for considering this proposal.
~ Michael
signature.asc
Description: OpenPGP digital signature
-- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/cmake-developers
