Commit Graph

558 Commits

Author SHA1 Message Date
Evan Wilde 579472d877 Swift: Ninja: Remove module dependency for executables
We shouldn't include the swiftmodule in the ninja dependency graph
unless that target emits a swiftmodule.

Fixes: #25869
2024-04-08 18:07:13 -07:00
Brad King 0287208bbf Merge topic 'ninja-fortran-include' into release-3.29
36dc8d6d50 Ninja: Fix Fortran module deps in files INCLUDEd by preprocessed sources

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !9351
2024-03-20 09:55:47 -04:00
Brad King 36dc8d6d50 Ninja: Fix Fortran module deps in files INCLUDEd by preprocessed sources
If a preprocessed source also uses the Fortran `INCLUDE` directive,
search the original source file's directory.

Fixes: #25792
2024-03-19 07:56:13 -04:00
Evan Wilde f292e28b84 Swift: Ninja: Pass module name to all swift builds
Executables that don't export a public API should not emit a
swiftmodule, but the swift modulename is observable from within the
program, so we should still set the module name on executable builds.

Fixes: #25710
2024-02-23 11:12:05 -05:00
Brad King 273463aaa9 Merge topic 'cxxmodules-collation-restat' into release-3.29
a7424b636b Ninja: make the collator rule use `restat = 1`
e24eecfc33 Tests/CXXModules: add a test to ensure that `restat` works for collation

Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !9259
2024-02-16 09:32:15 -05:00
Brad King 00fcb1dc81 Merge topic 'cxxmodules-visibility-change-rebuild' into release-3.29
60a8736378 cmNinjaTargetGenerator: scanning depends on the module metadata
52036ce090 Tests/CXXModules: test that objects depend on dependent modules json files
9a45c9fbd5 cmNinjaTargetGenerator: use `emplace_back` for scanning deps

Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !9247
2024-02-16 09:26:49 -05:00
Brad King 97132612f6 Merge topic 'cxxmodules-depend-on-modmap-file' into release-3.29
363300ace5 cxxmodules: depend on the modmap contents
940628d48d Tests/CXXModules: test that objects depend on their modmap files
681ee92030 Tests/CXXModules: support testing rebuild conditions

Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !9248
2024-02-16 09:20:52 -05:00
Ben Boeckel a7424b636b Ninja: make the collator rule use restat = 1
This avoids rebuilds when the module metadata does not change.
2024-02-14 23:01:25 -05:00
Ben Boeckel 60a8736378 cmNinjaTargetGenerator: scanning depends on the module metadata
Fixes: #25531
2024-02-14 22:36:37 -05:00
Ben Boeckel 9a45c9fbd5 cmNinjaTargetGenerator: use emplace_back for scanning deps 2024-02-14 20:38:06 -05:00
Ben Boeckel 363300ace5 cxxmodules: depend on the modmap contents
If the modmap changes, we need to recompile. It is not just a file that
needs to exist to compile.

Fixes: #25511
2024-02-14 20:36:47 -05:00
Brad King eee631bb8a Merge topic 'ewilde/swift-escapism'
9950a69f26 Swift/Ninja: Fix compile commands output file path

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !9150
2024-01-16 11:44:58 -05:00
Brad King e315d7cb19 Merge topic 'swift-sources-in-resp-file'
b767917ebb Swift/Ninja: Include sources in response file

Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !9143
2024-01-12 08:53:10 -05:00
Evan Wilde 9950a69f26 Swift/Ninja: Fix compile commands output file path
The exported compile commands did not use the proper file path separator
for Windows in the output field for Swift files. This patch adds the
appropriate filepath fix-ups to the output-field.

Fixes: #25580
2024-01-11 20:31:40 -08:00
Evan Wilde b767917ebb Swift/Ninja: Include sources in response file
Unlike C/C++, Swift compiles all sources in a module at once. This can
quickly overwhelm the commandline length limit on Windows, so it is
useful to place the source files in the response file.

Issue: #25572
2024-01-10 16:08:16 -08:00
Saleem Abdulrasool 9e829779f2 Swift: preserve -static for static library swiftmodules
The `-static` is important for the emission of the module as it is
serialized into the swiftmodule which then is used by the Swift frontend
to decide how to link to the symbol (via the GOT or not, or the IAT on
Windows). This repairs building static libraries with Swift on Windows.
2024-01-09 09:13:34 -08:00
Brad King 7557a722a5 Merge topic 'ewilde/swift-ninja-response-files'
a6a5c43300 Swift/Ninja: Add support for response files

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !9098
2024-01-09 10:53:59 -05:00
Brad King 1c97c57455 Merge topic 'ninja-always-make-object-dirs'
de3dc16b64 cmNinjaTargetGenerator: use `.` for the needed phony order-only dependency
1aa28f3b92 cmNinjaTargetGenerator: ensure that the object output directory exists
4a9613ff9b cmNinjaTargetGenerator: add a method to compute the object directory

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !9105
2024-01-09 10:52:42 -05:00
Evan Wilde a6a5c43300 Swift/Ninja: Add support for response files
Adding support for `CMAKE_NINJA_FORCE_RESPONSE_FILE` with Swift.

Issue: #25490
Fixes: #25563
2024-01-08 09:11:27 -08:00
Ben Boeckel de3dc16b64 cmNinjaTargetGenerator: use . for the needed phony order-only dependency
It is only required for Ninja < 1.7 though.
2024-01-06 11:07:52 -05:00
Ben Boeckel 1aa28f3b92 cmNinjaTargetGenerator: ensure that the object output directory exists
If a target has no object compilations within it, nothing ensures that
the directory exists yet it is still mentioned as an order-only
dependency within the build files. While `ninja` is OK with this,
`samu`, an alternate `ninja` implementation, is not. Make sure the
directory always exists for consistency.

Fixes: #25526
2024-01-06 09:56:40 -05:00
Brad King ac9fd4f009 Merge topic 'swift-always-restat'
1161ad76ac Swift/Ninja: Always restat swift build commands

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !9076
2024-01-05 13:31:09 -05:00
Ben Boeckel 4a9613ff9b cmNinjaTargetGenerator: add a method to compute the object directory 2024-01-05 05:06:33 -05:00
Jeremy Day 1161ad76ac Swift/Ninja: Always restat swift build commands
The swift toolchain leaves output files untouched
if there are no meaningful input changes; without
restat, this causes ninja to needlessly rebuild
targets that are not actually out-of-date

Fixes: #25496
2024-01-04 13:20:05 -08:00
Evan Wilde 44f29a4291 Swift/Ninja: Fix multifile module compile commands
Swift compile commands need to have all source files in the module
specified in the compile command or LSP systems will report errors on
missing types that are defined in other source files in the same module.

Issue: #25491
2024-01-03 14:57:46 -08:00
Ben Boeckel eebf239d9c Merge branch 'cxxmodules-no-compile-commands-modmap-release' into cxxmodules-no-compile-commands-modmap
* cxxmodules-no-compile-commands-modmap-release:
  cmNinjaTargetGenerator: use scan flag for modmap usage in exported commands
2023-12-28 10:58:35 -05:00
Ben Boeckel 73fbad3d93 cmNinjaTargetGenerator: use scan flag for modmap usage in exported commands
See: https://discourse.cmake.org/t/how-to-control-the-location-of-the-c-20-binary-module-interface-bmi-output-directory/7968
2023-12-22 16:18:18 -05:00
Evan Wilde d31b48816c Swift/Ninja: Fix missing OFM in CMP0157 OLD behavior
The CMP0157 old behavior omitted the output-file-map after the Swift
build split because we stopped calling `EmitSwiftDependencyInfo` when we
could not split the build because we didn't call
`WriteObjectBuildStatement`. If we can't split the build, then we still
need to include the OFM information to not break incremental builds.
2023-12-18 19:42:53 -08:00
Brad King ba41ca758a Merge topic 'swift-split-compilation-model'
9bed4f4d81 Swift/Ninja: Split compilation model
64b3367845 cmGlobalGenerator: Allow passing language to GetLangaugeOutputExtension

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !8907
2023-12-16 07:15:41 -05:00
Evan Wilde 9bed4f4d81 Swift/Ninja: Split compilation model
Splitting the Swift build into an object build and a separate link step,
instead of building and linking in one step. The immediate benefit is
LSP support because we are able to emit compile-commands for Swift files
now. Additionally, it is possible to specify flags to the compile step,
enabling folks to emit C and C++ headers from their Swift builds for
C/C++ interop, without needing custom commands. Eventually, this gives
us a path toward working object libraries.

Object Libraries:
 - Object libraries don't work today because CMake doesn't emit targets
   for object libraries into the Ninja build file.
 - tl;dr: Object libraries work if they aren't WMO. Still need work to
   make WMO'd object libraries work.

   Object libraries still don't completely work with this patch because,
   while we emit the targets, the `TARGET_OBJECTS` generator expression
   expansion has a separate mechanism for determining what the names of
   the objects are based on the input source files, so targets that
   depend on an object library built with a whole-module optimization
   will depend on objects based on the name of the source file instead
   of the actual emitted object file.

These features require being able to accurately model wholemodule builds
though, because we actually need to track object files and WMO affects
what objects are emitted. For that, we require CMP0157 use the NEW
policy. When it's OLD, we have to fall back on the old behavior and
cannot provide object libraries or the compile-commands for LSP.

Issue: #25308
2023-12-15 05:51:13 -08:00
Brad King e05cd2871d Merge topic 'cxxmodules-pch'
40dc13b242 cmNinjaTargetGenerator: PCH files do not need dyndep
f61c64cd1c cmLocalGenerator: prevent scanning of PCH source files
ea8c37b759 Tests/CXXModules: add a test which scans a PCH-using source

Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !9032
2023-12-05 09:25:51 -05:00
Ben Boeckel 40dc13b242 cmNinjaTargetGenerator: PCH files do not need dyndep
Fixes: #24209
2023-12-04 08:43:45 -05:00
Brad King c2bd158712 Merge topic 'fortran-objects-as-sources-fix'
beb1393f8f Merge branch 'revert-exact-collation-depends-3.27' into fortran-objects-as-sources-fix
a033dce326 Makefiles: provide, but do not consume, "forward linked" target dirs
7cd0adab1b cmCommonTargetGenerator: use modules from linked object-referenced targets
1175f1c874 LinkItem: track `cmSourceFile` instances for external objects
d2fa56772f Ninja: support "forwarding" modules from other targets
ec1e589bec Ninja: Revert exact collation dependencies for 3.27
06df59b930 cmCommonTargetGenerator: return forward linked target dirs too
f8729ab366 cmLocalUnixMakefileGenerator3: handle object-referencing Fortran modules
...

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !8989
2023-11-27 08:36:45 -05:00
Ben Boeckel d2fa56772f Ninja: support "forwarding" modules from other targets
When a target uses objects from another target which provides modules as
sources, the modules provided by the referenced target must also be
treated as if they were provided by the referencing target. Add the
concept of "forwarding" modules so that consumers can use modules
created by these sources as well.

Note that this is only sensible for Fortran where module usages are
implicit as far as CMake's visibility model is concerned. C++ modules
have their own concept of visibility which does not require or support
such `$<TARGET_OBJECTS>` reuse in this way.
2023-11-23 14:25:09 -05:00
Ben Boeckel 06df59b930 cmCommonTargetGenerator: return forward linked target dirs too
This will be used for module forwarding in order to support
`$<TARGET_OBJECTS>` usage in source and link libraries calls.
2023-11-21 09:44:39 -05:00
Ben Boeckel 6afe841e62 cmNinjaTargetGenerator: handle object-referencing Fortran modules
Targets only using Fortran modules via `$<TARGET_OBJECTS>` also need a
collation step to be performed. Check for this case and trigger the
collation rule to be added and used.
2023-11-21 09:43:47 -05:00
Brad King 728646434f Merge topic 'cxxmodules-ninja-forced-rsp-files'
09c962a6a4 Tests/CXXModules: test forced rsp files with ninja

Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !8926
2023-10-30 08:26:09 -04:00
Ben Boeckel 09c962a6a4 Tests/CXXModules: test forced rsp files with ninja
Fixes: #25367
2023-10-27 23:55:39 -04:00
Brad King e93ad8eecd Merge topic 'ninja-better-order-depends'
ed45432571 cmNinjaTargetGenerator: do not order-depend on C++ module sources
0973cd6702 cmNinjaTargetGenerator: use the file set visibility API
4625170925 cmFileSet: add a query for includeable file set types
51f9d9f0a2 cmNinjaTargetGenerator: avoid traversing old outputs repeatedly

Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !8902
2023-10-23 09:39:23 -04:00
Ben Boeckel ed45432571 cmNinjaTargetGenerator: do not order-depend on C++ module sources
C++ module sources should not be included by any other TUs, so their
presence cannot matter for order-only dependencies of the entire target.
Exclude them.

Update CMP0154 to take this into consideration and add tests to the
`CXXModules` suite (which already deals with module support detection).
2023-10-20 07:18:33 -04:00
Ben Boeckel 0973cd6702 cmNinjaTargetGenerator: use the file set visibility API 2023-10-19 23:09:33 -04:00
Ben Boeckel 51f9d9f0a2 cmNinjaTargetGenerator: avoid traversing old outputs repeatedly
We actually only need to look at outputs just added to the vector, not
all outputs that have been detected so far.
2023-10-19 23:09:33 -04:00
Sebastian Theophil 67ddca187c Ninja: Set TARGET_COMPILE_PDB correctly for compile_commands.json
Previously the Ninja target generator did not set the TARGET_COMPILE_PDB
before writing a compiler command to `compile_commands.json`.

Fixes: #25214
2023-10-18 09:55:28 -04:00
Ben Boeckel 3cddd11649 Ninja: message about not compiled sources explicitly
With CMP0155, filesets with only non-compiled sources do not go through
the collation path that detects it. Detect it explicitly like the Visual
Studio generator does.
2023-10-02 10:17:31 -04:00
Ben Boeckel ff18acc301 CXXModules: remove EXPERIMENTAL from C++ module variable names 2023-10-02 10:17:31 -04:00
Martin Duffy ec2ba29ac5 Ninja: Allow compilation before generation of dependencies' private sources
This requires knowing when a generated header is public, which we can
model using file sets.  Add policy CMP0154 to treat generated sources
as private by default in targets with file sets.  Generated public
headers can be specified in public file sets.

Fixes: #24959
Issue: #15555
2023-09-20 10:25:24 -04:00
Brad King 0f16ebf333 cmNinjaTargetGenerator: Reduce lifetime of custom command list
Since commit 2583eff6fe (ninja: Factor out custom command order-only
depends, 2014-03-10, v3.1.0-rc1~559^2) we can store the list of custom
commands in a local variable rather than a member.
2023-09-12 15:04:15 -04:00
Ben Boeckel 9b9ec70b54 Ninja: generate scanning and build rules for C++20 module synthetic targets 2023-08-17 14:42:54 -04:00
Brad King d8b6a750a0 Merge topic 'windows-tidy-cmstrcat'
d58253d155 clang-tidy: fix `performance-faster-string-find` lints
a19ec77200 clang-tidy: fix `readability-static-accessed-through-instance` lints
3d03629f20 cmWIXRichTextFormatWriter: remove identity cast
1df29567ac clang-tidy: fix `modernize-use-equals-default` lints
32fe862b8c clang-tidy: fix `readability-container-size-empty` lints
7eaab9a957 clang-tidy: fix `modernize-raw-string-literal` lints
ffa49c23aa clang-tidy: fix `readability-else-after-return` lints
4489e9a85c clang-tidy: fix `modernize-use-auto` lints
...

Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !8668
2023-08-01 09:31:45 -04:00
Brad King 241ee252ce IWYU: Update for Debian 12 CI job
`include-what-you-use` diagnostics, in practice, are specific to
the environment's compiler and standard library.  Update includes
to satisfy IWYU for our CI job under Debian 12.
2023-07-28 09:14:08 -04:00