Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-90539: doc: Expand on what should not go into CFLAGS, LDFLAGS #92754

Merged
merged 7 commits into from
Jun 20, 2022
18 changes: 18 additions & 0 deletions Doc/using/configure.rst
Original file line number Diff line number Diff line change
Expand Up @@ -747,6 +747,17 @@ Compiler flags
extensions. Use it when a compiler flag should *not* be part of the
distutils :envvar:`CFLAGS` once Python is installed (:issue:`21121`).

In particular, :envvar:`CFLAGS` should not contain:

* the compiler flag `-I` (for setting the search path for include files).
The `-I` flags are processed from left to right, and any flags in
:envvar:`CFLAGS` would take precedence over user- and package-supplied `-I`
flags.
mkoeppe marked this conversation as resolved.
Show resolved Hide resolved

* hardening flags such as `-Werror` because distributions cannot control
whether packages installed by users conform to such heightened
standards.

.. versionadded:: 3.5

.. envvar:: EXTRA_CFLAGS
Expand Down Expand Up @@ -859,6 +870,13 @@ Linker flags
:envvar:`CFLAGS_NODIST`. Use it when a linker flag should *not* be part of
the distutils :envvar:`LDFLAGS` once Python is installed (:issue:`35257`).

In particular, :envvar:`LDFLAGS` should not contain:

* the compiler flag `-L` (for setting the search path for libraries).
The `-L` flags are processed from left to right, and any flags in
:envvar:`LDFLAGS` would take precedence over user- and package-supplied `-L`
flags.
Comment on lines +873 to +878
Copy link
Contributor

@native-api native-api Jun 13, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In pyenv/pyenv#2381, we found out that at least one -L flag from LDFLAGS was required when linking against Python to find libintl. We even had to add it to python-config --ldflags via a hack since python-config ignores compile-time LDFLAGS for some reason.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you think we should add guidance here for downstream packagers that informs them of other, more suitable ways to set flags -- namely setting environment variables CFLAGS, LDFLAGS, CPATH, LIBRARY_PATH at the runtime of Python?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setting environment variables CFLAGS, LDFLAGS, CPATH, LIBRARY_PATH at the runtime of Python?

I'm not sure how you expect downstream packagers to do that -- and why they need to do that in the first place since distutils and python-config specifically exist to take care of providing all the necessary flags to link against a specific Python installation.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aren't the pyenv shims already setting environment variables? Specifically, they are setting PATH. https://trac.sagemath.org/ticket/29285#comment:20

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure how you expect downstream packagers to do that

conda and nix use activation scripts for their environments. homebrew provides brew sh for this purpose.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we set the flags in an envvar, they would likely still override package-supplied flags (skimmed through distutils sources, it looks like that). If so, that won't help your original problem.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That may be true for CFLAGS, but definitely not for CPATH. By the way, https://github.com/pypa/setuptools/blob/main/docs/userguide/ext_modules.rst now has some info (from my PR pypa/setuptools#3368); we can expand it to cover all necessary details to resolve this discussion.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is now pypa/setuptools#3387


.. envvar:: CONFIGURE_LDFLAGS_NODIST

Value of :envvar:`LDFLAGS_NODIST` variable passed to the ``./configure``
Expand Down