* [gentoo-dev] [PATCH 0/5] distutils-r1.eclass: DISTUTILS_EXT to enable features specific to building extensions
@ 2023-04-20 14:29 Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 1/5] distutils-r1.eclass: Add DISTUTILS_EXT control variable Michał Górny
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Michał Górny @ 2023-04-20 14:29 UTC (permalink / raw
To: gentoo-dev; +Cc: Michał Górny
Hi,
Here's a patch series that adds a DISTUTILS_EXT variable that indicates
that the package in question builds Python extensions (i.e. loadable
.so modules) and enables a few related features:
1. adds DEPEND=${PYTHON_DEPS} to fix cross-compiling
2. adds IUSE=debug that controls passing -DNDEBUG/-UNDEBUG to builds
(right now unlike most distros out there we are always building
with assertions enabled)
3. limits our parallel build_ext optimization to DISTUTILS_EXT ebuilds
(i.e. eliminates the few false positives triggering it right now)
The patches also include logic to automatically detect and report
(as a QA warning) missing DISTUTILS_EXT if a package is installing .so
files into site-packages.
Note that technically none of the above applies to ebuilds building Rust
extensions rather than C/Cython. However, there's no trivial way to
distinguish one from the other for the purpose of QA check and none
of the above points do any real harm. Especially that cargo.eclass
adds IUSE=debug anyway.
DISTUTILS_EXT should also be set if the extensions are built
conditionally to USE flags. The only ill effect of doing that is that
PYTHON_DEPS are added unconditionally (unless you're using
DISTUTILS_OPTIONAL) rather than conditionally to the flag responsible
for the extension but that's a minor point anyway.
--
Best regards,
Michał Górny
Michał Górny (5):
distutils-r1.eclass: Add DISTUTILS_EXT control variable
distutils-r1.eclass: Add PYTHON_DEPS to DEPEND when DISTUTILS_EXT
distutils-r1.eclass: Support IUSE=debug for DISTUTILS_EXT
distutils-r1.eclass: Issue build_ext only w/ DISTUTILS_EXT
distutils-r1.eclass: Detect missing DISTUTILS_EXT
eclass/distutils-r1.eclass | 50 +++++++++++++++++++++++++++++++++-----
1 file changed, 44 insertions(+), 6 deletions(-)
--
2.40.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [gentoo-dev] [PATCH 1/5] distutils-r1.eclass: Add DISTUTILS_EXT control variable
2023-04-20 14:29 [gentoo-dev] [PATCH 0/5] distutils-r1.eclass: DISTUTILS_EXT to enable features specific to building extensions Michał Górny
@ 2023-04-20 14:29 ` Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 2/5] distutils-r1.eclass: Add PYTHON_DEPS to DEPEND when DISTUTILS_EXT Michał Górny
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Michał Górny @ 2023-04-20 14:29 UTC (permalink / raw
To: gentoo-dev; +Cc: Michał Górny
Add a control variable that should be set in ebuilds that build
C, Cython, Rust extensions, etc.
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
eclass/distutils-r1.eclass | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/eclass/distutils-r1.eclass b/eclass/distutils-r1.eclass
index 09684781de2a..f283aa90cfaa 100644
--- a/eclass/distutils-r1.eclass
+++ b/eclass/distutils-r1.eclass
@@ -49,6 +49,13 @@ case ${EAPI} in
*) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
esac
+# @ECLASS_VARIABLE: DISTUTILS_EXT
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# Set this variable to a non-null value if the package (possibly
+# optionally) builds Python extensions (loadable modules written in C,
+# Cython, Rust, etc.).
+
# @ECLASS_VARIABLE: DISTUTILS_OPTIONAL
# @DEFAULT_UNSET
# @DESCRIPTION:
--
2.40.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [gentoo-dev] [PATCH 2/5] distutils-r1.eclass: Add PYTHON_DEPS to DEPEND when DISTUTILS_EXT
2023-04-20 14:29 [gentoo-dev] [PATCH 0/5] distutils-r1.eclass: DISTUTILS_EXT to enable features specific to building extensions Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 1/5] distutils-r1.eclass: Add DISTUTILS_EXT control variable Michał Górny
@ 2023-04-20 14:29 ` Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 3/5] distutils-r1.eclass: Support IUSE=debug for DISTUTILS_EXT Michał Górny
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Michał Górny @ 2023-04-20 14:29 UTC (permalink / raw
To: gentoo-dev; +Cc: Michał Górny
Add `${PYTHON_DEPS}` to `DEPEND` (i.e. `SYSROOT` dependencies) when
building extensions. This is necessary to support cross-compilations
correctly.
Originally proposed by Raul E Rangel <rrangel@chromium.org>.
Closes: https://github.com/gentoo/gentoo/pull/30469
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
eclass/distutils-r1.eclass | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/eclass/distutils-r1.eclass b/eclass/distutils-r1.eclass
index f283aa90cfaa..f56fa5a51efa 100644
--- a/eclass/distutils-r1.eclass
+++ b/eclass/distutils-r1.eclass
@@ -55,6 +55,11 @@ esac
# Set this variable to a non-null value if the package (possibly
# optionally) builds Python extensions (loadable modules written in C,
# Cython, Rust, etc.).
+#
+# When enabled, the eclass:
+#
+# - adds PYTHON_DEPS to DEPEND (for cross-compilation support), unless
+# DISTUTILS_OPTIONAL is used
# @ECLASS_VARIABLE: DISTUTILS_OPTIONAL
# @DEFAULT_UNSET
@@ -317,6 +322,10 @@ _distutils_set_globals() {
RDEPEND="${PYTHON_DEPS} ${rdep}"
BDEPEND="${PYTHON_DEPS} ${bdep}"
REQUIRED_USE=${PYTHON_REQUIRED_USE}
+
+ if [[ ${DISTUTILS_EXT} ]]; then
+ DEPEND="${PYTHON_DEPS}"
+ fi
fi
}
_distutils_set_globals
--
2.40.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [gentoo-dev] [PATCH 3/5] distutils-r1.eclass: Support IUSE=debug for DISTUTILS_EXT
2023-04-20 14:29 [gentoo-dev] [PATCH 0/5] distutils-r1.eclass: DISTUTILS_EXT to enable features specific to building extensions Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 1/5] distutils-r1.eclass: Add DISTUTILS_EXT control variable Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 2/5] distutils-r1.eclass: Add PYTHON_DEPS to DEPEND when DISTUTILS_EXT Michał Górny
@ 2023-04-20 14:29 ` Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 4/5] distutils-r1.eclass: Issue build_ext only w/ DISTUTILS_EXT Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 5/5] distutils-r1.eclass: Detect missing DISTUTILS_EXT Michał Górny
4 siblings, 0 replies; 6+ messages in thread
From: Michał Górny @ 2023-04-20 14:29 UTC (permalink / raw
To: gentoo-dev; +Cc: Michał Górny
Add IUSE=debug when DISTUTILS_EXT is set, and use it to control
assertions via appending -DNDEBUG or -UNDEBUG to CPPFLAGS.
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
eclass/distutils-r1.eclass | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/eclass/distutils-r1.eclass b/eclass/distutils-r1.eclass
index f56fa5a51efa..257e032a6c83 100644
--- a/eclass/distutils-r1.eclass
+++ b/eclass/distutils-r1.eclass
@@ -60,6 +60,8 @@ esac
#
# - adds PYTHON_DEPS to DEPEND (for cross-compilation support), unless
# DISTUTILS_OPTIONAL is used
+#
+# - adds debug flag to IUSE that controls assertions (i.e. -DNDEBUG)
# @ECLASS_VARIABLE: DISTUTILS_OPTIONAL
# @DEFAULT_UNSET
@@ -325,6 +327,7 @@ _distutils_set_globals() {
if [[ ${DISTUTILS_EXT} ]]; then
DEPEND="${PYTHON_DEPS}"
+ IUSE="debug"
fi
fi
}
@@ -1766,6 +1769,10 @@ distutils-r1_run_phase() {
local -x AR=${AR} CC=${CC} CPP=${CPP} CXX=${CXX}
tc-export AR CC CPP CXX
+ if [[ ${DISTUTILS_EXT} ]]; then
+ local -x CPPFLAGS="${CPPFLAGS} $(usex debug '-UNDEBUG' '-DNDEBUG')"
+ fi
+
# How to build Python modules in different worlds...
local ldopts
case "${CHOST}" in
--
2.40.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [gentoo-dev] [PATCH 4/5] distutils-r1.eclass: Issue build_ext only w/ DISTUTILS_EXT
2023-04-20 14:29 [gentoo-dev] [PATCH 0/5] distutils-r1.eclass: DISTUTILS_EXT to enable features specific to building extensions Michał Górny
` (2 preceding siblings ...)
2023-04-20 14:29 ` [gentoo-dev] [PATCH 3/5] distutils-r1.eclass: Support IUSE=debug for DISTUTILS_EXT Michał Górny
@ 2023-04-20 14:29 ` Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 5/5] distutils-r1.eclass: Detect missing DISTUTILS_EXT Michał Górny
4 siblings, 0 replies; 6+ messages in thread
From: Michał Górny @ 2023-04-20 14:29 UTC (permalink / raw
To: gentoo-dev; +Cc: Michał Górny
Issue the explicit `build_ext` command call only if `DISTUTILS_EXT`
is set. This should avoid a few false positives where the command
was called due to irrelevant .c files being present in the source tree.
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
eclass/distutils-r1.eclass | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/eclass/distutils-r1.eclass b/eclass/distutils-r1.eclass
index 257e032a6c83..f7510a4640cb 100644
--- a/eclass/distutils-r1.eclass
+++ b/eclass/distutils-r1.eclass
@@ -62,6 +62,9 @@ esac
# DISTUTILS_OPTIONAL is used
#
# - adds debug flag to IUSE that controls assertions (i.e. -DNDEBUG)
+#
+# - calls `build_ext` command if setuptools build backend is used
+# and there is potential benefit from parallel builds
# @ECLASS_VARIABLE: DISTUTILS_OPTIONAL
# @DEFAULT_UNSET
@@ -1452,12 +1455,14 @@ distutils-r1_python_compile() {
# .pyx is added for Cython
#
# esetup.py does not respect SYSROOT, so skip it there
- if [[ -z ${SYSROOT} && 1 -ne ${jobs} && 2 -eq $(
- find '(' -name '*.c' -o -name '*.cc' -o -name '*.cpp' \
- -o -name '*.cxx' -o -name '*.c++' -o -name '*.m' \
- -o -name '*.mm' -o -name '*.pyx' ')' -printf '\n' |
- head -n 2 | wc -l
- ) ]]; then
+ if [[ -z ${SYSROOT} && ${DISTUTILS_EXT} && 1 -ne ${jobs}
+ && 2 -eq $(
+ find '(' -name '*.c' -o -name '*.cc' -o -name '*.cpp' \
+ -o -name '*.cxx' -o -name '*.c++' -o -name '*.m' \
+ -o -name '*.mm' -o -name '*.pyx' ')' -printf '\n' |
+ head -n 2 | wc -l
+ )
+ ]]; then
esetup.py build_ext -j "${jobs}" "${@}"
fi
else
--
2.40.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [gentoo-dev] [PATCH 5/5] distutils-r1.eclass: Detect missing DISTUTILS_EXT
2023-04-20 14:29 [gentoo-dev] [PATCH 0/5] distutils-r1.eclass: DISTUTILS_EXT to enable features specific to building extensions Michał Górny
` (3 preceding siblings ...)
2023-04-20 14:29 ` [gentoo-dev] [PATCH 4/5] distutils-r1.eclass: Issue build_ext only w/ DISTUTILS_EXT Michał Górny
@ 2023-04-20 14:29 ` Michał Górny
4 siblings, 0 replies; 6+ messages in thread
From: Michał Górny @ 2023-04-20 14:29 UTC (permalink / raw
To: gentoo-dev; +Cc: Michał Górny
Detect when Python packages install extensions and warn about missing
DISTUTILS_EXT appropriately.
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
eclass/distutils-r1.eclass | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/eclass/distutils-r1.eclass b/eclass/distutils-r1.eclass
index f7510a4640cb..9b31e5db0d2f 100644
--- a/eclass/distutils-r1.eclass
+++ b/eclass/distutils-r1.eclass
@@ -2069,6 +2069,16 @@ _distutils-r1_post_python_install() {
eerror "https://projects.gentoo.org/python/guide/qawarn.html#stray-top-level-files-in-site-packages"
die "Failing install because of stray top-level files in site-packages"
fi
+
+ if [[ ! ${DISTUTILS_EXT} && ! ${_DISTUTILS_EXT_WARNED} ]]; then
+ if [[ $(find "${sitedir}" -name "*$(get_modname)" | head -n 1) ]]
+ then
+ eqawarn "Python extension modules (*$(get_modname)) found installed. Please set:"
+ eqawarn " DISTUTILS_EXT=1"
+ eqawarn "in the ebuild."
+ _DISTUTILS_EXT_WARNED=1
+ fi
+ fi
fi
}
--
2.40.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-04-20 14:31 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-20 14:29 [gentoo-dev] [PATCH 0/5] distutils-r1.eclass: DISTUTILS_EXT to enable features specific to building extensions Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 1/5] distutils-r1.eclass: Add DISTUTILS_EXT control variable Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 2/5] distutils-r1.eclass: Add PYTHON_DEPS to DEPEND when DISTUTILS_EXT Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 3/5] distutils-r1.eclass: Support IUSE=debug for DISTUTILS_EXT Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 4/5] distutils-r1.eclass: Issue build_ext only w/ DISTUTILS_EXT Michał Górny
2023-04-20 14:29 ` [gentoo-dev] [PATCH 5/5] distutils-r1.eclass: Detect missing DISTUTILS_EXT Michał Górny
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox