The history behind the makefile generator and the custom dependency
tracking logic was that it was written before
the majority of compilers offered a robust way to generate the list of
header dependencies.

As it stands now we want to remove all this custom dependency scanning
logic, not extend it to understand system headers
( As the naive approach would cause CMake to parse system headers, and
slow down even more ). Luckily, C++20 modules
also require us to drop the custom dependency scanning, so when we add
C++20 module support to the Makefile generator
this issue will be fixed as by product.

On Wed, Jul 3, 2019 at 10:51 AM Robert Maynard
<robert.mayn...@kitware.com> wrote:
>
> I completely forgot that the Makefiles based generators in CMake have
> a separate heuristic for determining system headers.
>
> If you use the Ninja generator I see the expected behavior:
> ~/W/t/nbuild $ sudo touch /usr/include/c++/7/array
> ~/W/t/nbuild $ ninja -d explain -v
> ninja explain: output test/CMakeFiles/ProjTest.dir/test.cpp.o older
> than most recent input /usr/include/c++/7/array (1562165327 vs
> 1562165329)
> ninja explain: test/CMakeFiles/ProjTest.dir/test.cpp.o is dirty
> ninja explain: test/ProjTest is dirty
> [1/2] /usr/bin/c++   -I../my_lib/include -std=gnu++1z -MD -MT
> test/CMakeFiles/ProjTest.dir/test.cpp.o -MF
> test/CMakeFiles/ProjTest.dir/test.cpp.o.d -o
> test/CMakeFiles/ProjTest.dir/test.cpp.o -c ../test/test.cpp
> [2/2] : && /usr/bin/c++     test/CMakeFiles/ProjTest.dir/test.cpp.o
> -o test/ProjTest   && :
>
>
> I will need to spend some more time figuring out the extra include
> caching logic for the Makefile based generators, and will report back.
>
> On Thu, Jun 27, 2019 at 8:59 AM jl forums <jlmxyz.for...@gmail.com> wrote:
> >
> > thanks for the anwer....
> > quite not... I'm using cmake 3.14.2 (so, far away from 3.6....) and have a 
> > look, in main.cpp, there is #include <filesystem>:
> >
> > $ find /usr/include/ -name filesystem
> > /usr/include/c++/5/experimental/filesystem
> > /usr/include/c++/7/experimental/filesystem
> > /usr/include/c++/8/filesystem
> > /usr/include/c++/8/experimental/filesystem
> > $ sudo touch /usr/include/c++/5/experimental/filesystem 
> > /usr/include/c++/7/experimental/filesystem /usr/include/c++/8/filesystem 
> > /usr/include/c++/8/experimental/filesystem
> > $ make
> > [100%] Built target FileSync
> > $ touch ../main.cxx
> > $ make
> > Scanning dependencies of target FileSync
> > [ 50%] Building CXX object CMakeFiles/FileSync.dir/main.cxx.o
> > [100%] Linking CXX executable FileSync
> > [100%] Built target FileSync
> >
> >
> > => cmake don't create "full include dependency" which IS a mistake.... 
> > updating system g++ can just assume the target is uptodate and in fact just 
> > create a broken build...
> >
> > in cmake cxx.includecache
> >
> > #IncludeRegexLine: ^[ ]*[#%][ ]*(include|import)[ ]*[<"]([^">]+)([">])
> > #IncludeRegexScan: ^.*$
> > #IncludeRegexComplain: ^$
> > #IncludeRegexTransform:
> > /home/orange/crypt/Devel/projets/FileSync/main.cxx
> > cstdio
> > -
> > io.h
> > -
> > fcntl.h
> > -
> > locale
> > -
> > clocale
> > -
> > fstream
> > -
> > iostream
> > -
> > filesystem
> > -
> >
> > $ /usr/bin/gcc-8 -M ../main.cxx
> > main.o: ../main.cxx /usr/x86_64-linux-gnu/include/stdc-predef.h \
> >  /usr/include/c++/8/cstdio \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/c++config.h \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/os_defines.h \
> >  /usr/x86_64-linux-gnu/include/features.h \
> >  /usr/x86_64-linux-gnu/include/sys/cdefs.h \
> >  /usr/x86_64-linux-gnu/include/bits/wordsize.h \
> >  /usr/x86_64-linux-gnu/include/bits/long-double.h \
> >  /usr/x86_64-linux-gnu/include/gnu/stubs.h \
> >  /usr/x86_64-linux-gnu/include/gnu/stubs-64.h \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/cpu_defines.h \
> >  /usr/x86_64-linux-gnu/include/stdio.h \
> >  /usr/x86_64-linux-gnu/include/bits/libc-header-start.h \
> >  /usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h \
> >  /usr/x86_64-linux-gnu/include/bits/types.h \
> >  /usr/x86_64-linux-gnu/include/bits/typesizes.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/__FILE.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/FILE.h \
> >  /usr/x86_64-linux-gnu/include/bits/libio.h \
> >  /usr/x86_64-linux-gnu/include/bits/_G_config.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/__mbstate_t.h \
> >  /usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h \
> >  /usr/x86_64-linux-gnu/include/bits/stdio_lim.h \
> >  /usr/x86_64-linux-gnu/include/bits/sys_errlist.h \
> >  /usr/include/c++/8/locale /usr/include/c++/8/bits/localefwd.h \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/c++locale.h \
> >  /usr/include/c++/8/clocale /usr/x86_64-linux-gnu/include/locale.h \
> >  /usr/x86_64-linux-gnu/include/bits/locale.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/locale_t.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/__locale_t.h \
> >  /usr/include/c++/8/iosfwd /usr/include/c++/8/bits/stringfwd.h \
> >  /usr/include/c++/8/bits/memoryfwd.h /usr/include/c++/8/bits/postypes.h \
> >  /usr/include/c++/8/cwchar /usr/x86_64-linux-gnu/include/wchar.h \
> >  /usr/x86_64-linux-gnu/include/bits/floatn.h \
> >  /usr/x86_64-linux-gnu/include/bits/floatn-common.h \
> >  /usr/x86_64-linux-gnu/include/bits/wchar.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/wint_t.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/mbstate_t.h \
> >  /usr/include/c++/8/cctype /usr/x86_64-linux-gnu/include/ctype.h \
> >  /usr/x86_64-linux-gnu/include/endian.h \
> >  /usr/x86_64-linux-gnu/include/bits/endian.h \
> >  /usr/x86_64-linux-gnu/include/bits/byteswap.h \
> >  /usr/x86_64-linux-gnu/include/bits/byteswap-16.h \
> >  /usr/x86_64-linux-gnu/include/bits/uintn-identity.h \
> >  /usr/include/c++/8/bits/locale_classes.h /usr/include/c++/8/string \
> >  /usr/include/c++/8/bits/char_traits.h \
> >  /usr/include/c++/8/bits/stl_algobase.h \
> >  /usr/include/c++/8/bits/functexcept.h \
> >  /usr/include/c++/8/bits/exception_defines.h \
> >  /usr/include/c++/8/bits/cpp_type_traits.h \
> >  /usr/include/c++/8/ext/type_traits.h \
> >  /usr/include/c++/8/ext/numeric_traits.h \
> >  /usr/include/c++/8/bits/stl_pair.h /usr/include/c++/8/bits/move.h \
> >  /usr/include/c++/8/bits/concept_check.h /usr/include/c++/8/type_traits \
> >  /usr/include/c++/8/bits/stl_iterator_base_types.h \
> >  /usr/include/c++/8/bits/stl_iterator_base_funcs.h \
> >  /usr/include/c++/8/debug/assertions.h \
> >  /usr/include/c++/8/bits/stl_iterator.h \
> >  /usr/include/c++/8/bits/ptr_traits.h /usr/include/c++/8/debug/debug.h \
> >  /usr/include/c++/8/bits/predefined_ops.h /usr/include/c++/8/cstdint \
> >  /usr/lib/gcc/x86_64-linux-gnu/8/include/stdint.h \
> >  /usr/x86_64-linux-gnu/include/stdint.h \
> >  /usr/x86_64-linux-gnu/include/bits/stdint-intn.h \
> >  /usr/x86_64-linux-gnu/include/bits/stdint-uintn.h \
> >  /usr/include/c++/8/bits/allocator.h \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/c++allocator.h \
> >  /usr/include/c++/8/ext/new_allocator.h /usr/include/c++/8/new \
> >  /usr/include/c++/8/exception /usr/include/c++/8/bits/exception.h \
> >  /usr/include/c++/8/bits/exception_ptr.h \
> >  /usr/include/c++/8/bits/cxxabi_init_exception.h \
> >  /usr/include/c++/8/typeinfo /usr/include/c++/8/bits/hash_bytes.h \
> >  /usr/include/c++/8/bits/nested_exception.h \
> >  /usr/include/c++/8/bits/ostream_insert.h \
> >  /usr/include/c++/8/bits/cxxabi_forced.h \
> >  /usr/include/c++/8/bits/stl_function.h \
> >  /usr/include/c++/8/backward/binders.h \
> >  /usr/include/c++/8/bits/range_access.h \
> >  /usr/include/c++/8/initializer_list \
> >  /usr/include/c++/8/bits/basic_string.h \
> >  /usr/include/c++/8/ext/atomicity.h \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/gthr.h \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/gthr-default.h \
> >  /usr/x86_64-linux-gnu/include/pthread.h \
> >  /usr/x86_64-linux-gnu/include/sched.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/time_t.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/struct_timespec.h \
> >  /usr/x86_64-linux-gnu/include/bits/sched.h \
> >  /usr/x86_64-linux-gnu/include/bits/cpu-set.h \
> >  /usr/x86_64-linux-gnu/include/time.h \
> >  /usr/x86_64-linux-gnu/include/bits/time.h \
> >  /usr/x86_64-linux-gnu/include/bits/timex.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/struct_timeval.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/clock_t.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/struct_tm.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/clockid_t.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/timer_t.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/struct_itimerspec.h \
> >  /usr/x86_64-linux-gnu/include/bits/pthreadtypes.h \
> >  /usr/x86_64-linux-gnu/include/bits/thread-shared-types.h \
> >  /usr/x86_64-linux-gnu/include/bits/pthreadtypes-arch.h \
> >  /usr/x86_64-linux-gnu/include/bits/setjmp.h \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/atomic_word.h \
> >  /usr/include/c++/8/ext/alloc_traits.h \
> >  /usr/include/c++/8/bits/alloc_traits.h \
> >  /usr/include/c++/8/ext/string_conversions.h /usr/include/c++/8/cstdlib \
> >  /usr/x86_64-linux-gnu/include/stdlib.h \
> >  /usr/x86_64-linux-gnu/include/bits/waitflags.h \
> >  /usr/x86_64-linux-gnu/include/bits/waitstatus.h \
> >  /usr/x86_64-linux-gnu/include/sys/types.h \
> >  /usr/x86_64-linux-gnu/include/sys/select.h \
> >  /usr/x86_64-linux-gnu/include/bits/select.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/sigset_t.h \
> >  /usr/x86_64-linux-gnu/include/bits/types/__sigset_t.h \
> >  /usr/x86_64-linux-gnu/include/sys/sysmacros.h \
> >  /usr/x86_64-linux-gnu/include/bits/sysmacros.h \
> >  /usr/x86_64-linux-gnu/include/alloca.h \
> >  /usr/x86_64-linux-gnu/include/bits/stdlib-float.h \
> >  /usr/include/c++/8/bits/std_abs.h /usr/include/c++/8/cerrno \
> >  /usr/x86_64-linux-gnu/include/errno.h \
> >  /usr/x86_64-linux-gnu/include/bits/errno.h \
> >  /usr/x86_64-linux-gnu/include/linux/errno.h \
> >  /usr/x86_64-linux-gnu/include/asm/errno.h \
> >  /usr/x86_64-linux-gnu/include/asm-generic/errno.h \
> >  /usr/x86_64-linux-gnu/include/asm-generic/errno-base.h \
> >  /usr/include/c++/8/bits/functional_hash.h \
> >  /usr/include/c++/8/bits/basic_string.tcc \
> >  /usr/include/c++/8/bits/locale_classes.tcc \
> >  /usr/include/c++/8/bits/locale_facets.h /usr/include/c++/8/cwctype \
> >  /usr/x86_64-linux-gnu/include/wctype.h \
> >  /usr/x86_64-linux-gnu/include/bits/wctype-wchar.h \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/ctype_base.h \
> >  /usr/include/c++/8/bits/ios_base.h /usr/include/c++/8/system_error \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/error_constants.h \
> >  /usr/include/c++/8/stdexcept /usr/include/c++/8/streambuf \
> >  /usr/include/c++/8/bits/streambuf.tcc \
> >  /usr/include/c++/8/bits/streambuf_iterator.h \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/ctype_inline.h \
> >  /usr/include/c++/8/bits/locale_facets.tcc \
> >  /usr/include/c++/8/bits/locale_facets_nonio.h /usr/include/c++/8/ctime \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/time_members.h \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/messages_members.h \
> >  /usr/x86_64-linux-gnu/include/libintl.h \
> >  /usr/include/c++/8/bits/codecvt.h \
> >  /usr/include/c++/8/bits/locale_facets_nonio.tcc \
> >  /usr/include/c++/8/bits/locale_conv.h \
> >  /usr/include/c++/8/bits/unique_ptr.h /usr/include/c++/8/utility \
> >  /usr/include/c++/8/bits/stl_relops.h /usr/include/c++/8/tuple \
> >  /usr/include/c++/8/array /usr/include/c++/8/bits/uses_allocator.h \
> >  /usr/include/c++/8/bits/invoke.h /usr/include/c++/8/fstream \
> >  /usr/include/c++/8/istream /usr/include/c++/8/ios \
> >  /usr/include/c++/8/bits/basic_ios.h \
> >  /usr/include/c++/8/bits/basic_ios.tcc /usr/include/c++/8/ostream \
> >  /usr/include/c++/8/bits/ostream.tcc /usr/include/c++/8/bits/istream.tcc \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/basic_file.h \
> >  /usr/include/x86_64-linux-gnu/c++/8/bits/c++io.h \
> >  /usr/include/c++/8/bits/fstream.tcc /usr/include/c++/8/iostream \
> >  /usr/include/c++/8/filesystem
> >
> >
> > amazing, no? cmake find only 9 dependencies against 100+ real ones (and I 
> > don't even speak of errors that can be caused in parsing if some -D option 
> > is changed....
> >
> > thanks and regards
> > JLM
> >
> >
> > Le lun. 24 juin 2019 à 14:14, Robert Maynard <robert.mayn...@kitware.com> a 
> > écrit :
> >>
> >> It look that starting with CMake 3.6 modification of system headers
> >> will cause CMake to recompile projects. What version of CMake and your
> >> compiler are you using?
> >>
> >> On Mon, Jun 17, 2019 at 9:40 AM jl forums <jlmxyz.for...@gmail.com> wrote:
> >> >
> >> > Hi,
> >> > I want to create a full tag file and for this require to know the 
> >> > compiler full include path...  there is a way to had custom includes 
> >> > path but didn't found any variables for the include path....
> >> > for example :
> >> > $ gcc-8 -v -x c -E /dev/null
> >> > Using built-in specs.
> >> > [....]
> >> > ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
> >> > #include "..." search starts here:
> >> > #include <...> search starts here:
> >> >  /usr/lib/gcc/x86_64-linux-gnu/8/include
> >> >  /usr/local/include
> >> >  /usr/lib/gcc/x86_64-linux-gnu/8/include-fixed
> >> >  /usr/x86_64-linux-gnu/include
> >> >  /usr/include/x86_64-linux-gnu
> >> >  /usr/include
> >> > End of search list.
> >> > [...]
> >> >
> >> > $ gcc -v -x c -E /dev/null
> >> > Using built-in specs.
> >> > [...]
> >> > ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
> >> > #include "..." search starts here:
> >> > #include <...> search starts here:
> >> >  /usr/lib/gcc/x86_64-linux-gnu/7/include
> >> >  /usr/local/include
> >> >  /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
> >> >  /usr/x86_64-linux-gnu/include
> >> >  /usr/include/x86_64-linux-gnu
> >> >  /usr/include
> >> > End of search list.
> >> > [...]
> >> >
> >> > I tried to
> >> >
> >> >
> >> > get_target_property(moggle_interface_includes FileSync 
> >> > INTERFACE_INCLUDE_DIRECTORIES)
> >> > message("Moggle interface includes: ${moggle_interface_includes}")
> >> >
> >> > get_target_property(motor_includes FileSync INCLUDE_DIRECTORIES)
> >> > message("MOTOR includes ${motor_includes}")
> >> >
> >> > but I get
> >> >
> >> > Moggle interface includes: moggle_interface_includes-NOTFOUND
> >> > MOTOR includes motor_includes-NOTFOUND
> >> >
> >> >
> >> > there is also some issue because cmake strip dependencies from system's 
> >> > include, which means that updating a system software won't cause rebuild 
> >> > and consider that the build is uptodate, causing unexpected results
> >> > seems that there is ways to workaround this :  
> >> > https://stackoverflow.com/questions/7461000/handling-header-files-dependencies-with-cmake
> >> >  but this is ugly... would be better to let the user choose with an 
> >> > option
> >> >
> >> > thanks and regards
> >> > JLM
> >> > --
> >> >
> >> > 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:
> >> > https://cmake.org/mailman/listinfo/cmake
-- 

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:
https://cmake.org/mailman/listinfo/cmake

Reply via email to