[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cmake
Subject:    Re: [CMake] Prefix header for Makefiles
From:       "CHEVRIER, Marc" <marc.chevrier () sap ! com>
Date:       2015-08-26 13:45:40
Message-ID: FE212A4A-0AB5-435C-B987-95E9A708ECBF () sap ! com
[Download RAW message or body]

[Attachment #2 (text/plain)]

Hi,

You are wrong. CMake, during configuration/generation phase generates dependencies \
over C/C++ files. So, the simple approach to handle dependency between Cpp and h \
files is to let CMake handle it:

add_executable (my_exe Main.cpp)

And, that it! By default current source directory is passed to the compiler for \
resolving #include directives. And for adding other directories, use command \
target_include_directories.

Marc

From: CMake on behalf of Jakob van Bethlehem
Date: Wednesday 26 August 2015 15:10
To: "cmake@cmake.org<mailto:cmake@cmake.org>"
Subject: Re: [CMake] Prefix header for Makefiles

Hej Andrew,

CMake does never scan source files (as far as I know), as it is not a compiler. From \
your question it almost seem you are making this assumption, so I just wanted to make \
sure to mention at least this.

Then, for your particular issue: two things that come to my mind:
* I'd imagine you have somewhere a add_executable(main Main.cpp Prefix.h \
DependHeader.h) - as far as I can tell, the only thing that really matters, is that \
the main executable gets recompiled whenever you make a change in any of the headers. \
                To put it differently, I *don't* think you (should) need the \
                OBJECT_DEPENDS.
* If you're worried about scaling, maybe you could have a look at the file(GLOB ) \
command. However, be sure to also carefully read the potential problems with that \
approach. In my current (big) project, we explicitly list each source file for most \
parts of the source tree. In practice you're surely *not* going to add all 50 new \
files at once. It is a very simple thing to add the newly created file to some \
variable in the correct CMakeLists.txt file. You just have to remember to do it, it's \
really not a big deal.

By the way, we're actually using the PrecompiledHeader script - it works flawlessly.

Sincerely, Jakob

On 26 Aug 2015, at 11:48, Andrew Shaitorov \
<andrew.shaitorov@gmail.com<mailto:andrew.shaitorov@gmail.com>> wrote:

Hi All!

I have a very annoying problem with CMake Makefiles generator.

I'm using prefix header (see attached archive for minimized test).

There is one source file named Main.cpp and two header files: Prefix.h and \
DependHeader.h. Prefix.h includes DependHeader.h and Main.cpp includes Prefix.h by \
using prefix header compiler flag (-include for GCC/Clang and /FI for MSVC):

set_source_files_properties(Main.cpp PROPERTIES
COMPILE_FLAGS "-include Prefix.h"
OBJECT_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/Prefix.h)

When I change Prefix.h, then make recompiles Main.cpp as needed. But when I make a \
change in DependHeader.h, then no recompilation happens. Its clear for me that I have \
to specify all depend files in OBJECT_DEPENDS option, but in real project there may \
be a lot of depend files with nested includes. And the most annoying thing is that \
the project compiles without any errors and may just crash because of struct layout \
or other critical changes in depend headers.

I seems like the following script have the same problem when using FORCE_INCLUDE \
option:

https://github.com/larsch/cmake-precompiled-header/blob/master/PrecompiledHeader.cmake


I looked in CMake source code and didn't find a way to add Prefix.h in a list for \
dependency scanning. Also I don't know how to run depend scanner on Prefix.h in CMake \
script to generate a list of all depend files for OBJECT_DEPENDS option.

Any advise?

Best,
Andrew.

<CMakePrefixHeaderTest.zip>--

Powered by www.kitware.com<http://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


[Attachment #3 (text/html)]

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: \
after-white-space; color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, \
sans-serif;"> <div>
<div>Hi,</div>
<div><br>
</div>
<div>You are wrong. CMake, during configuration/generation phase generates \
dependencies over C/C&#43;&#43; files.</div> <div>So, the simple approach to handle \
dependency between Cpp and h files is to let CMake handle it:</div> <div>
<div class="">
<div dir="ltr" class="">
<div class="">
<div class=""><br>
</div>
<div class="">add_executable (my_exe Main.cpp)</div>
<div class=""><span class="" style="white-space: pre;"></span></div>
</div>
</div>
</div>
</div>
</div>
<div><br>
</div>
<div>And, that it! By default current source directory is passed to the compiler for \
resolving #include directives.</div> <div>And for adding other directories, use \
command target_include_directories.</div> <div><br>
</div>
<div>Marc</div>
<div><br>
</div>
<span id="OLK_SRC_BODY_SECTION">
<div style="font-family:Calibri; font-size:12pt; text-align:left; color:black; \
BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; \
PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: \
medium none; PADDING-TOP: 3pt"> <span style="font-weight:bold">From: </span>CMake on \
behalf of Jakob van Bethlehem<br> <span style="font-weight:bold">Date: \
</span>Wednesday 26 August 2015 15:10<br> <span style="font-weight:bold">To: \
</span>&quot;<a href="mailto:cmake@cmake.org">cmake@cmake.org</a>&quot;<br> <span \
style="font-weight:bold">Subject: </span>Re: [CMake] Prefix header for Makefiles<br> \
</div> <div><br>
</div>
<div>
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: \
after-white-space;" class=""> Hej Andrew,
<div class=""><br class="">
</div>
<div class="">CMake does never scan source files (as far as I know), as it is not a \
compiler. From your question it almost seem you are making this assumption, so I just \
wanted to make sure to mention at least this.</div> <div class=""><br class="">
</div>
<div class="">Then, for your particular issue: two things that come to my mind:</div>
<div class="">* I'd imagine you have somewhere a add_executable(main Main.cpp \
Prefix.h DependHeader.h) - as far as I can tell, the only thing that really matters, \
is that the main executable gets recompiled whenever you make a change in any of the \
headers.  To put it differently, I *don't* think you (should) need the \
OBJECT_DEPENDS.</div> <div class="">* If you're worried about scaling, maybe you \
could have a look at the file(GLOB ) command. However, be sure to also carefully read \
the potential problems with that approach. In my current (big) project, we explicitly \
list each source file for  most parts of the source tree. In practice you're surely \
*not* going to add all 50 new files at once. It is a very simple thing to add the \
newly created file to some variable in the correct CMakeLists.txt file. You just have \
to remember to do it, it's really  not a big deal.</div>
<div class=""><br class="">
</div>
<div class="">By the way, we're actually using the PrecompiledHeader script - it \
works flawlessly.</div> <div class=""><br class="">
</div>
<div class="">Sincerely, Jakob&nbsp;</div>
<div class=""><br class="">
<div>
<blockquote type="cite" class="">
<div class="">On 26 Aug 2015, at 11:48, Andrew Shaitorov &lt;<a \
href="mailto:andrew.shaitorov@gmail.com" class="">andrew.shaitorov@gmail.com</a>&gt; \
wrote:</div> <br class="Apple-interchange-newline">
<div class="">
<div dir="ltr" class="">Hi All!
<div class=""><br class="">
</div>
<div class="">I have a very annoying problem with CMake Makefiles generator.</div>
<div class=""><br class="">
</div>
<div class="">I'm using prefix header (see attached archive for minimized \
test).</div> <div class=""><br class="">
</div>
<div class="">There is one source file named Main.cpp and two header files: Prefix.h \
and DependHeader.h. Prefix.h includes DependHeader.h and Main.cpp includes Prefix.h \
by using prefix header compiler flag (-include for GCC/Clang and /FI for MSVC):</div> \
<div class=""><br class=""> </div>
<div class="">
<div class=""><span class="" \
style="white-space:pre"></span>set_source_files_properties(Main.cpp PROPERTIES</div> \
<div class=""><span class="" style="white-space:pre"></span>COMPILE_FLAGS \
&quot;-include Prefix.h&quot;</div> <div class=""><span class="" \
style="white-space:pre"></span>OBJECT_DEPENDS \
${CMAKE_CURRENT_LIST_DIR}/Prefix.h)</div> </div>
<div class=""><br class="">
</div>
<div class="">When I change Prefix.h, then make recompiles Main.cpp as needed. But \
when I make a change in DependHeader.h, then no recompilation happens. Its clear for \
me that I have to specify all depend files in OBJECT_DEPENDS option, but in real \
project  there may be a lot of depend files with nested includes. And the most \
annoying thing is that the project compiles without any errors and may just crash \
because of struct layout or other critical changes in depend headers.</div> <div \
class=""><br class=""> </div>
<div class="">I seems like the following script have the same problem when using \
FORCE_INCLUDE option:</div> <div class=""><br class="">
</div>
<div class=""><a href="https://github.com/larsch/cmake-precompiled-header/blob/master/PrecompiledHeader.cmake" \
class="">https://github.com/larsch/cmake-precompiled-header/blob/master/PrecompiledHeader.cmake</a><br \
class=""> </div>
<div class=""><br class="">
</div>
<div class="">I looked in CMake source code and didn't find a way to add Prefix.h in \
a list for dependency scanning. Also I don't know how to run depend scanner on \
Prefix.h in CMake script to generate a list of all depend files for OBJECT_DEPENDS \
option.</div> <div class=""><br class="">
</div>
<div class="">Any advise?</div>
<div class=""><br class="">
</div>
<div class="">Best,</div>
<div class="">Andrew.<br clear="all" class="">
<div class=""><br class="">
</div>
<div class="gmail_signature">
<div class=""></div>
</div>
</div>
</div>
<span id="cid:50E63A0C-707D-4C5D-9587-756ABEA9C6BC">&lt;CMakePrefixHeaderTest.zip&gt;</span>--
 <br class="">
<br class="">
Powered by <a href="http://www.kitware.com" class="">www.kitware.com</a><br class="">
<br class="">
Please keep messages on-topic and check the CMake FAQ at: <a \
href="http://www.cmake.org/Wiki/CMake_FAQ" class=""> \
http://www.cmake.org/Wiki/CMake_FAQ</a><br class=""> <br class="">
Kitware offers various services to support the CMake community. For more information \
on each offering, please visit:<br class=""> <br class="">
CMake Support: <a href="http://cmake.org/cmake/help/support.html" \
class="">http://cmake.org/cmake/help/support.html</a><br class=""> CMake Consulting: \
<a href="http://cmake.org/cmake/help/consulting.html" class=""> \
http://cmake.org/cmake/help/consulting.html</a><br class=""> CMake Training Courses: \
<a href="http://cmake.org/cmake/help/training.html" class=""> \
http://cmake.org/cmake/help/training.html</a><br class=""> <br class="">
Visit other Kitware open-source projects at <a \
href="http://www.kitware.com/opensource/opensource.html" class=""> \
http://www.kitware.com/opensource/opensource.html</a><br class=""> <br class="">
Follow this link to subscribe/unsubscribe:<br class="">
<a href="http://public.kitware.com/mailman/listinfo/cmake" \
class="">http://public.kitware.com/mailman/listinfo/cmake</a></div> </blockquote>
</div>
<br class="">
</div>
</div>
</div>
</span>
</body>
</html>



-- 

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
--===============1302642359==--



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic