[CMake] How does IMPLICIT_DEPENDS work?

Paul Smith paul at mad-scientist.net
Fri Apr 26 17:26:55 EDT 2019


We're trying to implement precompiled headers (yes, I've seen all the
various github projects around this).  As part of this we need to make
sure the precompiled header is rebuilt whenever any of the headers that
it includes changes: this seems like exactly the job for
add_custom_command's IMPLICIT_DEPENDS.

But, it doesn't seem to be doing anything at all for me so I wonder
what I'm doing wrong.

I'm using CMake 3.13.4 on GNU/Linux with GCC C++ and Makefile
generators (we also will have support for MSVC but I'm not worried
about that here).

I have a function to deal with PCH generation:

  function(add_precompiled_header _target _header)
    ...
      # This is the actual command that does the precompiling
      add_custom_command(
          OUTPUT "${_pch_file}"
          COMMAND "${CMAKE_COMMAND}" -E make_directory "${_pch_dir}"
          COMMAND "${CMAKE_CXX_COMPILER}" "${_flags}" -x c++-header -o
"${_pch_file}" "${_header}"
          COMMAND_EXPAND_LISTS
          IMPLICIT_DEPENDS CXX "${_header}"
          COMMENT "Precompiling ${_header} for ${_target} (C++)")
    ...
      get_property(_sources TARGET ${_target} PROPERTY SOURCES)
      foreach(_source ${_sources})
    ...
          set_property(SOURCE ${_source} APPEND PROPERTY
              OBJECT_DEPENDS "${_pch_file}")
    ...
      endforeach()

Obviously there're a lot of other things here I'm leaving out, but
basically there's a custom command that compiles the header into a PCH
and lists the header as an IMPLICIT_DEPENDS, and adds that PCH as an
OBJECT_DEPENDS to the source files.

When I change the PCH file, the source files are rebuilt so that works.

If I change the header the PCH file is rebuilt so that works too.

But if I change a header file that the PCH includes, the PCH is NOT
rebuilt.  Not only that but if I use "make -d" I can see that the PCH
target never even considers any of the included files when determining
out-of-date-ness of the PCH file.

It seems like IMPLICIT_DEPENDS is behaving identically to DEPENDS here:
only listing the header as a dependency but not trying to determine
what it, itself, depends on.

What am I doing wrong?  Is there some subtlety to IMPLICIT_DEPENDS that
I'm missing?



More information about the CMake mailing list