pybind / pybind/pybind11

Linking is really slow with Ninja CMake generator, but not Unix Makefiles

Open Beginner friendly
#5,223 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

triage
Dominant language
C++
Stars
18k
Forks
2.3k
Avg merge
5d 17h
Merged PRs (30d)
10

Description

Required prerequisites
What version (or hash if on master) of pybind11 are you using?

2.13.1

Problem description

When building a large pybind11 module with GCC+CMake+Ninja, I find that the linking step is serial and takes forever. When the Makefiles generator is specified, linking (LTO) uses all available cpus, and linking is much faster.

environment: Conda-forge, linux x64

GCC 12.3.0
CMake 3.30.0
GNU Make 4.4.1
Ninja 1.12.1

The problem seems related to the fact that Ninja does not support the GNU Make jobserver protocol. Therefore, the -flto flag does serial LTO with Ninja and parallel LTO with Make. You need to explicitly set -flto=auto or -flto=n when you use Ninja for reasonable link times.

It might be a good idea to change set(thin "") to set(thin "=auto") here:
https://github.com/pybind/pybind11/blob/bb05e0810b87e74709d9f4c4545f1f57a1b386f5/tools/pybind11Common.cmake#L327
Clang supports -flto=auto too (with Clang, it means the same as -flto).

Reproducible example code

No response

Is this a regression? Put the last known working version here if it is.

Not a regression

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at tools/pybind11Common.cmake around line 327 and inspect how the LTO flag is selected for CMake builds. Compare large-module link behavior with the Ninja and Unix Makefiles generators, and consider the reported GCC and Clang behavior. Done means Ninja builds no longer perform serial LTO while Makefiles retain their existing behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
cmake, cpp
Domain
build-system, performance
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
62/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.