Skip to content

Commit d256990

Browse files
committed
unix: templatize per version Makefile variables and targets
This refactor allows targets for each major Python version to be defined simultaneously. This opens the door to a single `make` invocation building multiple versions in parallel.
1 parent 697f695 commit d256990

File tree

2 files changed

+26
-35
lines changed

2 files changed

+26
-35
lines changed

cpython-unix/Makefile

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ BUILD := $(HERE)/build.py
66
NULL :=
77
SPACE := $(subst ,, )
88

9+
ALL_PYTHON_VERSIONS := 3.9 3.10 3.11 3.12 3.13
10+
911
ifndef PYBUILD_TARGET_TRIPLE
1012
$(error PYBUILD_TARGET_TRIPLE not defined)
1113
endif
@@ -68,7 +70,7 @@ PYTHON_DEP_DEPENDS := \
6870
$(TOOLCHAIN_DEPENDS) \
6971
$(NULL)
7072

71-
default: $(OUTDIR)/cpython-$(PYBUILD_PYTHON_VERSION)-$(PACKAGE_SUFFIX).tar
73+
default: $(OUTDIR)/cpython-$(CPYTHON_$(PYTHON_MAJOR_VERSION)_VERSION)-$(PACKAGE_SUFFIX).tar
7274

7375
ifndef PYBUILD_NO_DOCKER
7476
$(OUTDIR)/image-%.tar: $(OUTDIR)/%.Dockerfile
@@ -254,26 +256,15 @@ PYTHON_HOST_DEPENDS := \
254256
$(OUTDIR)/m4-$(M4_VERSION)-$(PACKAGE_SUFFIX).tar \
255257
$(NULL)
256258

257-
$(OUTDIR)/cpython-3.9-$(CPYTHON_3.9_VERSION)-$(HOST_PLATFORM).tar: $(PYTHON_HOST_DEPENDS)
258-
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) cpython-3.9-host
259-
260-
$(OUTDIR)/cpython-3.10-$(CPYTHON_3.10_VERSION)-$(HOST_PLATFORM).tar: $(PYTHON_HOST_DEPENDS)
261-
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) cpython-3.10-host
262-
263-
$(OUTDIR)/cpython-3.11-$(CPYTHON_3.11_VERSION)-$(HOST_PLATFORM).tar: $(PYTHON_HOST_DEPENDS)
264-
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) cpython-3.11-host
265-
266-
$(OUTDIR)/cpython-3.12-$(CPYTHON_3.12_VERSION)-$(HOST_PLATFORM).tar: $(PYTHON_HOST_DEPENDS)
267-
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) cpython-3.12-host
268-
269-
$(OUTDIR)/cpython-3.13-$(CPYTHON_3.13_VERSION)-$(HOST_PLATFORM).tar: $(PYTHON_HOST_DEPENDS)
270-
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) cpython-3.13-host
271-
272-
PYTHON_DEPENDS := \
259+
# Each X.Y Python version has its own set of variables and targets. This independent
260+
# definition allows multiple Python versions to be built using the same Makefile
261+
# invocation.
262+
define python_version_template =
263+
PYTHON_DEPENDS_$(1) := \
273264
$(PYTHON_SUPPORT_FILES) \
274265
$(OUTDIR)/versions/VERSION.pip \
275266
$(OUTDIR)/versions/VERSION.setuptools \
276-
$(OUTDIR)/cpython-$(PYTHON_MAJOR_VERSION)-$(PYBUILD_PYTHON_VERSION)-$(HOST_PLATFORM).tar \
267+
$(OUTDIR)/cpython-$(1)-$$(CPYTHON_$(1)_VERSION)-$(HOST_PLATFORM).tar \
277268
$(if $(NEED_AUTOCONF),$(OUTDIR)/autoconf-$(AUTOCONF_VERSION)-$(PACKAGE_SUFFIX).tar) \
278269
$(if $(NEED_BDB),$(OUTDIR)/bdb-$(BDB_VERSION)-$(PACKAGE_SUFFIX).tar) \
279270
$(if $(NEED_BZIP2),$(OUTDIR)/bzip2-$(BZIP2_VERSION)-$(PACKAGE_SUFFIX).tar) \
@@ -296,23 +287,17 @@ PYTHON_DEPENDS := \
296287
$(if $(NEED_ZLIB),$(OUTDIR)/zlib-$(ZLIB_VERSION)-$(PACKAGE_SUFFIX).tar) \
297288
$(NULL)
298289

299-
ALL_PYTHON_DEPENDS = \
300-
$(PYTHON_DEP_DEPENDS) \
301-
$(HERE)/build-cpython.sh \
302-
$(PYTHON_DEPENDS) \
303-
$(NULL)
304-
305-
$(OUTDIR)/cpython-$(CPYTHON_3.9_VERSION)-$(PACKAGE_SUFFIX).tar: $(ALL_PYTHON_DEPENDS)
306-
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) cpython-3.9
307-
308-
$(OUTDIR)/cpython-$(CPYTHON_3.10_VERSION)-$(PACKAGE_SUFFIX).tar: $(ALL_PYTHON_DEPENDS)
309-
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) cpython-3.10
290+
ALL_PYTHON_DEPENDS_$(1) = \
291+
$$(PYTHON_DEP_DEPENDS) \
292+
$$(HERE)/build-cpython.sh \
293+
$$(PYTHON_DEPENDS_$(1)) \
294+
$$(NULL)
310295

311-
$(OUTDIR)/cpython-$(CPYTHON_3.11_VERSION)-$(PACKAGE_SUFFIX).tar: $(ALL_PYTHON_DEPENDS)
312-
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) cpython-3.11
296+
$$(OUTDIR)/cpython-$(1)-$$(CPYTHON_$(1)_VERSION)-$$(HOST_PLATFORM).tar: $$(PYTHON_HOST_DEPENDS)
297+
$$(RUN_BUILD) --docker-image $$(DOCKER_IMAGE_BUILD) cpython-$(1)-host
313298

314-
$(OUTDIR)/cpython-$(CPYTHON_3.12_VERSION)-$(PACKAGE_SUFFIX).tar: $(ALL_PYTHON_DEPENDS)
315-
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) cpython-3.12
299+
$$(OUTDIR)/cpython-$$(CPYTHON_$(1)_VERSION)-$$(PACKAGE_SUFFIX).tar: $$(ALL_PYTHON_DEPENDS_$(1))
300+
$$(RUN_BUILD) --docker-image $$(DOCKER_IMAGE_BUILD) cpython-$(1)
301+
endef
316302

317-
$(OUTDIR)/cpython-$(CPYTHON_3.13_VERSION)-$(PACKAGE_SUFFIX).tar: $(ALL_PYTHON_DEPENDS)
318-
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) cpython-3.13
303+
$(foreach local_version,$(ALL_PYTHON_VERSIONS),$(eval $(call python_version_template,$(local_version))))

pythonbuild/utils.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,12 @@ def write_triples_makefiles(
141141

142142
for triple, settings in targets.items():
143143
for host_platform in settings["host_platforms"]:
144+
# IMPORTANT: if we ever vary the content of these Makefiles by
145+
# Python versions, the variable names will need add the Python
146+
# version and the Makefile references updated to point to specific
147+
# versions. If we don't do that, multi-version builds will fail
148+
# to work correctly.
149+
144150
makefile_path = dest_dir / ("Makefile.%s.%s" % (host_platform, triple))
145151

146152
lines = []

0 commit comments

Comments
 (0)