Skip to content

Commit 7ec99f4

Browse files
committed
uv runs on mxmmake
1 parent fdf503d commit 7ec99f4

File tree

18 files changed

+138
-50
lines changed

18 files changed

+138
-50
lines changed

Makefile

Lines changed: 58 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,20 @@ PRIMARY_PYTHON?=python3
5353
# Default: 3.7
5454
PYTHON_MIN_VERSION?=3.7
5555

56+
# Install packages using the given package installer method.
57+
# Supported are `pip` and `uv`. If uv is used, its global availability is
58+
# checked. Otherwise, is is installed, either in the virtual environment or
59+
# using the `PRIMARY_PYTHON`, dependent on the `VENV_ENABLED` setting. If
60+
# `VENV_ENABLED` and uv is selected, uv is used to create the virtual
61+
# environment.
62+
# Default: pip
63+
PYTHON_PACKAGE_INSTALLER?=uv
64+
65+
# Flag whether to use a global installed 'uv' or install
66+
# it in the virtual environment.
67+
# Default: false
68+
PYTHON_UV_GLOBAL?=true
69+
5670
# Flag whether to use virtual environment. If `false`, the
5771
# interpreter according to `PRIMARY_PYTHON` found in `PATH` is used.
5872
# Default: true
@@ -74,7 +88,7 @@ VENV_FOLDER?=venv
7488

7589
# mxdev to install in virtual environment.
7690
# Default: mxdev
77-
MXDEV?=https://github.com/mxstack/mxdev/archive/main.zip
91+
MXDEV?=mxdev@git+https://github.com/mxstack/mxdev.git
7892

7993
# mxmake to install in virtual environment.
8094
# Default: mxmake
@@ -208,18 +222,43 @@ else
208222
MXENV_PYTHON=$(PRIMARY_PYTHON)
209223
endif
210224

225+
# determine the package installer
226+
ifeq ("$(PYTHON_PACKAGE_INSTALLER)","uv")
227+
# use uv
228+
PYTHON_PACKAGE_COMMAND=uv pip
229+
else
230+
# use/default to pip
231+
PYTHON_PACKAGE_COMMAND=$(MXENV_PYTHON) -m pip
232+
endif # /PYTHON_PACKAGE_INSTALLER
233+
211234
MXENV_TARGET:=$(SENTINEL_FOLDER)/mxenv.sentinel
212235
$(MXENV_TARGET): $(SENTINEL)
213236
ifeq ("$(VENV_ENABLED)", "true")
237+
# Use a venv
214238
ifeq ("$(VENV_CREATE)", "true")
215-
@echo "Setup Python Virtual Environment under '$(VENV_FOLDER)'"
216-
@$(PRIMARY_PYTHON) -m venv $(VENV_FOLDER)
217-
endif
218-
endif
239+
# Create a venv
240+
ifeq ("$(PYTHON_PACKAGE_INSTALLER)$(PYTHON_UV_GLOBAL)", "uvtrue")
241+
# create venv with global uv
242+
@echo "Setup Python Virtual Environment using package 'uv' at '$(VENV_FOLDER)'"
243+
@uv venv -p $(PRIMARY_PYTHON) --seed $(VENV_FOLDER)
244+
else
245+
@echo "Setup Python Virtual Environment using module 'venv' at '$(VENV_FOLDER)'"
246+
@$(MXENV_PYTHON) -m venv $(VENV_FOLDER)
219247
@$(MXENV_PYTHON) -m ensurepip -U
220-
@$(MXENV_PYTHON) -m pip install -U pip setuptools wheel
221-
@$(MXENV_PYTHON) -m pip install -U $(MXDEV)
222-
@$(MXENV_PYTHON) -m pip install -U $(MXMAKE)
248+
endif # /PYTHON_PACKAGE_INSTALLER uv and PYTHON_UV_GLOBAL
249+
250+
ifeq ("$(PYTHON_PACKAGE_INSTALLER)$(PYTHON_UV_GLOBAL)", "uvfalse")
251+
@echo "Install uv"
252+
@$(MXENV_PYTHON) -m pip install uv
253+
endif # /PYTHON_PACKAGE_INSTALLER uv and not PYTHON_UV_GLOBAL
254+
# always update pip, setuptools and wheel
255+
@$(PYTHON_PACKAGE_COMMAND) install -U pip setuptools wheel
256+
endif # /VENV_CREATE
257+
else
258+
@echo "Using system Python interpreter"
259+
endif # /VENV_ENABLED
260+
@echo "Install/Update MXStack Python packages"
261+
@$(PYTHON_PACKAGE_COMMAND) install -U $(MXDEV) $(MXMAKE)
223262
@touch $(MXENV_TARGET)
224263

225264
.PHONY: mxenv
@@ -236,8 +275,8 @@ ifeq ("$(VENV_CREATE)", "true")
236275
@rm -rf $(VENV_FOLDER)
237276
endif
238277
else
239-
@$(MXENV_PYTHON) -m pip uninstall -y $(MXDEV)
240-
@$(MXENV_PYTHON) -m pip uninstall -y $(MXMAKE)
278+
@$(PYTHON_PACKAGE_COMMAND) uninstall -y $(MXDEV)
279+
@$(PYTHON_PACKAGE_COMMAND) uninstall -y $(MXMAKE)
241280
endif
242281

243282
INSTALL_TARGETS+=mxenv
@@ -251,7 +290,7 @@ CLEAN_TARGETS+=mxenv-clean
251290
RUFF_TARGET:=$(SENTINEL_FOLDER)/ruff.sentinel
252291
$(RUFF_TARGET): $(MXENV_TARGET)
253292
@echo "Install Ruff"
254-
@$(MXENV_PYTHON) -m pip install ruff
293+
@$(PYTHON_PACKAGE_COMMAND) install ruff
255294
@touch $(RUFF_TARGET)
256295

257296
.PHONY: ruff-check
@@ -286,7 +325,7 @@ CLEAN_TARGETS+=ruff-clean
286325
ISORT_TARGET:=$(SENTINEL_FOLDER)/isort.sentinel
287326
$(ISORT_TARGET): $(MXENV_TARGET)
288327
@echo "Install isort"
289-
@$(MXENV_PYTHON) -m pip install isort
328+
@$(PYTHON_PACKAGE_COMMAND) install isort
290329
@touch $(ISORT_TARGET)
291330

292331
.PHONY: isort-check
@@ -326,7 +365,7 @@ SPHINX_AUTOBUILD_BIN=sphinx-autobuild
326365
DOCS_TARGET:=$(SENTINEL_FOLDER)/sphinx.sentinel
327366
$(DOCS_TARGET): $(MXENV_TARGET)
328367
@echo "Install Sphinx"
329-
@$(MXENV_PYTHON) -m pip install -U sphinx sphinx-autobuild $(DOCS_REQUIREMENTS)
368+
@$(PYTHON_PACKAGE_COMMAND) install -U sphinx sphinx-autobuild $(DOCS_REQUIREMENTS)
330369
@touch $(DOCS_TARGET)
331370

332371
.PHONY: docs
@@ -420,8 +459,8 @@ INSTALLED_PACKAGES=$(MXMAKE_FILES)/installed.txt
420459
PACKAGES_TARGET:=$(INSTALLED_PACKAGES)
421460
$(PACKAGES_TARGET): $(FILES_TARGET) $(ADDITIONAL_SOURCES_TARGETS)
422461
@echo "Install python packages"
423-
@$(MXENV_PYTHON) -m pip install -r $(FILES_TARGET)
424-
@$(MXENV_PYTHON) -m pip freeze > $(INSTALLED_PACKAGES)
462+
@$(PYTHON_PACKAGE_COMMAND) install -r $(FILES_TARGET)
463+
@$(PYTHON_PACKAGE_COMMAND) freeze > $(INSTALLED_PACKAGES)
425464
@touch $(PACKAGES_TARGET)
426465

427466
.PHONY: packages
@@ -450,7 +489,7 @@ CLEAN_TARGETS+=packages-clean
450489
TEST_TARGET:=$(SENTINEL_FOLDER)/test.sentinel
451490
$(TEST_TARGET): $(MXENV_TARGET)
452491
@echo "Install $(TEST_REQUIREMENTS)"
453-
@$(MXENV_PYTHON) -m pip install $(TEST_REQUIREMENTS)
492+
@$(PYTHON_PACKAGE_COMMAND) install $(TEST_REQUIREMENTS)
454493
@touch $(TEST_TARGET)
455494

456495
.PHONY: test
@@ -479,7 +518,7 @@ DIRTY_TARGETS+=test-dirty
479518
COVERAGE_TARGET:=$(SENTINEL_FOLDER)/coverage.sentinel
480519
$(COVERAGE_TARGET): $(TEST_TARGET)
481520
@echo "Install Coverage"
482-
@$(MXENV_PYTHON) -m pip install -U coverage
521+
@$(PYTHON_PACKAGE_COMMAND) install -U coverage
483522
@touch $(COVERAGE_TARGET)
484523

485524
.PHONY: coverage
@@ -508,7 +547,7 @@ CLEAN_TARGETS+=coverage-clean
508547
MYPY_TARGET:=$(SENTINEL_FOLDER)/mypy.sentinel
509548
$(MYPY_TARGET): $(MXENV_TARGET)
510549
@echo "Install mypy"
511-
@$(MXENV_PYTHON) -m pip install mypy $(MYPY_REQUIREMENTS)
550+
@$(PYTHON_PACKAGE_COMMAND) install mypy $(MYPY_REQUIREMENTS)
512551
@touch $(MYPY_TARGET)
513552

514553
.PHONY: mypy
@@ -537,7 +576,7 @@ DIRTY_TARGETS+=mypy-dirty
537576
ZEST_RELEASER_TARGET:=$(SENTINEL_FOLDER)/zest-releaser.sentinel
538577
$(ZEST_RELEASER_TARGET): $(MXENV_TARGET)
539578
@echo "Install zest.releaser"
540-
@$(MXENV_PYTHON) -m pip install zest.releaser
579+
@$(PYTHON_PACKAGE_COMMAND) install zest.releaser
541580
@touch $(ZEST_RELEASER_TARGET)
542581

543582
.PHONY: zest-releaser-prerelease

src/mxmake/tests/test_templates.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,15 @@ def test_Makefile(self, tempdir):
587587
# Default: 3.7
588588
PYTHON_MIN_VERSION?=3.7
589589
590+
# Install packages using the given package installer method.
591+
# Supported are `pip` and `uv`. If uv is used, its global availability is
592+
# checked. Otherwise, is is installed, either in the virtual environment or
593+
# using the `PRIMARY_PYTHON`, dependent on the `VENV_ENABLED` setting. If
594+
# `VENV_ENABLED` and uv is selected, uv is used to create the virtual
595+
# environment.
596+
# Default: pip
597+
PYTHON_PACKAGE_INSTALLER?=pip
598+
590599
# Flag whether to use virtual environment. If `false`, the
591600
# interpreter according to `PRIMARY_PYTHON` found in `PATH` is used.
592601
# Default: true
@@ -683,9 +692,9 @@ def test_Makefile(self, tempdir):
683692
endif
684693
endif
685694
@$(MXENV_PYTHON) -m ensurepip -U
686-
@$(MXENV_PYTHON) -m pip install -U pip setuptools wheel
687-
@$(MXENV_PYTHON) -m pip install -U $(MXDEV)
688-
@$(MXENV_PYTHON) -m pip install -U $(MXMAKE)
695+
@$(PYTHON_PACKAGE_COMMAND) install -U pip setuptools wheel
696+
@$(PYTHON_PACKAGE_COMMAND) install -U $(MXDEV)
697+
@$(PYTHON_PACKAGE_COMMAND) install -U $(MXMAKE)
689698
@touch $(MXENV_TARGET)
690699
691700
.PHONY: mxenv
@@ -702,8 +711,8 @@ def test_Makefile(self, tempdir):
702711
@rm -rf $(VENV_FOLDER)
703712
endif
704713
else
705-
@$(MXENV_PYTHON) -m pip uninstall -y $(MXDEV)
706-
@$(MXENV_PYTHON) -m pip uninstall -y $(MXMAKE)
714+
@$(PYTHON_PACKAGE_COMMAND) uninstall -y $(MXDEV)
715+
@$(PYTHON_PACKAGE_COMMAND) uninstall -y $(MXMAKE)
707716
endif
708717
709718
INSTALL_TARGETS+=mxenv

src/mxmake/topics/applications/cookiecutter.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
COOKIECUTTER_TARGET:=$(SENTINEL_FOLDER)/cookiecutter.sentinel
2121
$(COOKIECUTTER_TARGET): $(MXENV_TARGET)
2222
@echo "Install cookiecutter"
23-
@$(MXENV_PYTHON) -m pip install "cookiecutter>=2.6.0"
23+
@$(PYTHON_PACKAGE_COMMAND) install "cookiecutter>=2.6.0"
2424
@touch $(COOKIECUTTER_TARGET)
2525

2626
.PHONY: cookiecutter

src/mxmake/topics/applications/twisted.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
TWISTED_TARGET:=$(SENTINEL_FOLDER)/twisted.sentinel
2222
$(TWISTED_TARGET): $(MXENV_TARGET)
2323
@echo "Install twisted"
24-
@$(MXENV_PYTHON) -m pip install Twisted
24+
@$(PYTHON_PACKAGE_COMMAND) install Twisted
2525
@touch $(TWISTED_TARGET)
2626

2727
.PHONY: twisted-start

src/mxmake/topics/applications/zest-releaser.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
ZEST_RELEASER_TARGET:=$(SENTINEL_FOLDER)/zest-releaser.sentinel
3030
$(ZEST_RELEASER_TARGET): $(MXENV_TARGET)
3131
@echo "Install zest.releaser"
32-
@$(MXENV_PYTHON) -m pip install zest.releaser
32+
@$(PYTHON_PACKAGE_COMMAND) install zest.releaser
3333
@touch $(ZEST_RELEASER_TARGET)
3434

3535
.PHONY: zest-releaser-prerelease

src/mxmake/topics/core/mxenv.mk

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,24 @@
3030
#:description = Minimum required Python version.
3131
#:default = 3.7
3232
#:
33+
#:[setting.PYTHON_PACKAGE_INSTALLER]
34+
#:description = Install packages using the given package installer method.
35+
#: Supported are `pip` and `uv`. If uv is used, its global availability is
36+
#: checked. Otherwise, is is installed, either in the virtual environment or
37+
#: using the `PRIMARY_PYTHON`, dependent on the `VENV_ENABLED` setting. If
38+
#: `VENV_ENABLED` and uv is selected, uv is used to create the virtual
39+
#: environment.
40+
#:default = pip
41+
#:
42+
#:[setting.PYTHON_UV_GLOBAL]
43+
#:description = Flag whether to use a global installed 'uv' or install
44+
#: it in the virtual environment.
45+
#:default = false
46+
#:
47+
#:
3348
#:[setting.VENV_ENABLED]
3449
#:description = Flag whether to use virtual environment. If `false`, the
35-
#: interpreter according to `PRIMARY_PYTHON` found in `PATH` is used.
50+
#: interpreter according to `PRIMARY_PYTHON` found in `PATH` is used.
3651
#:default = true
3752
#:
3853
#:[setting.VENV_CREATE]
@@ -86,18 +101,43 @@ else
86101
MXENV_PYTHON=$(PRIMARY_PYTHON)
87102
endif
88103

104+
# determine the package installer
105+
ifeq ("$(PYTHON_PACKAGE_INSTALLER)","uv")
106+
# use uv
107+
PYTHON_PACKAGE_COMMAND=uv pip
108+
else
109+
# use/default to pip
110+
PYTHON_PACKAGE_COMMAND=$(MXENV_PYTHON) -m pip
111+
endif # /PYTHON_PACKAGE_INSTALLER
112+
89113
MXENV_TARGET:=$(SENTINEL_FOLDER)/mxenv.sentinel
90114
$(MXENV_TARGET): $(SENTINEL)
91115
ifeq ("$(VENV_ENABLED)", "true")
116+
# Use a venv
92117
ifeq ("$(VENV_CREATE)", "true")
93-
@echo "Setup Python Virtual Environment under '$(VENV_FOLDER)'"
94-
@$(PRIMARY_PYTHON) -m venv $(VENV_FOLDER)
95-
endif
96-
endif
118+
# Create a venv
119+
ifeq ("$(PYTHON_PACKAGE_INSTALLER)$(PYTHON_UV_GLOBAL)", "uvtrue")
120+
# create venv with global uv
121+
@echo "Setup Python Virtual Environment using package 'uv' at '$(VENV_FOLDER)'"
122+
@uv venv -p $(PRIMARY_PYTHON) --seed $(VENV_FOLDER)
123+
else
124+
@echo "Setup Python Virtual Environment using module 'venv' at '$(VENV_FOLDER)'"
125+
@$(MXENV_PYTHON) -m venv $(VENV_FOLDER)
97126
@$(MXENV_PYTHON) -m ensurepip -U
98-
@$(MXENV_PYTHON) -m pip install -U pip setuptools wheel
99-
@$(MXENV_PYTHON) -m pip install -U $(MXDEV)
100-
@$(MXENV_PYTHON) -m pip install -U $(MXMAKE)
127+
endif # /PYTHON_PACKAGE_INSTALLER uv and PYTHON_UV_GLOBAL
128+
129+
ifeq ("$(PYTHON_PACKAGE_INSTALLER)$(PYTHON_UV_GLOBAL)", "uvfalse")
130+
@echo "Install uv"
131+
@$(MXENV_PYTHON) -m pip install uv
132+
endif # /PYTHON_PACKAGE_INSTALLER uv and not PYTHON_UV_GLOBAL
133+
# always update pip, setuptools and wheel
134+
@$(PYTHON_PACKAGE_COMMAND) install -U pip setuptools wheel
135+
endif # /VENV_CREATE
136+
else
137+
@echo "Using system Python interpreter"
138+
endif # /VENV_ENABLED
139+
@echo "Install/Update MXStack Python packages"
140+
@$(PYTHON_PACKAGE_COMMAND) install -U $(MXDEV) $(MXMAKE)
101141
@touch $(MXENV_TARGET)
102142

103143
.PHONY: mxenv
@@ -114,8 +154,8 @@ ifeq ("$(VENV_CREATE)", "true")
114154
@rm -rf $(VENV_FOLDER)
115155
endif
116156
else
117-
@$(MXENV_PYTHON) -m pip uninstall -y $(MXDEV)
118-
@$(MXENV_PYTHON) -m pip uninstall -y $(MXMAKE)
157+
@$(PYTHON_PACKAGE_COMMAND) uninstall -y $(MXDEV)
158+
@$(PYTHON_PACKAGE_COMMAND) uninstall -y $(MXMAKE)
119159
endif
120160

121161
INSTALL_TARGETS+=mxenv

src/mxmake/topics/core/packages.mk

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ INSTALLED_PACKAGES=$(MXMAKE_FILES)/installed.txt
2626
PACKAGES_TARGET:=$(INSTALLED_PACKAGES)
2727
$(PACKAGES_TARGET): $(FILES_TARGET) $(ADDITIONAL_SOURCES_TARGETS)
2828
@echo "Install python packages"
29-
@$(MXENV_PYTHON) -m pip install -r $(FILES_TARGET)
30-
@$(MXENV_PYTHON) -m pip freeze > $(INSTALLED_PACKAGES)
29+
@$(PYTHON_PACKAGE_COMMAND) install -r $(FILES_TARGET)
30+
@$(PYTHON_PACKAGE_COMMAND) freeze > $(INSTALLED_PACKAGES)
3131
@touch $(PACKAGES_TARGET)
3232

3333
.PHONY: packages

src/mxmake/topics/docs/sphinx.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ SPHINX_AUTOBUILD_BIN=sphinx-autobuild
3939
DOCS_TARGET:=$(SENTINEL_FOLDER)/sphinx.sentinel
4040
$(DOCS_TARGET): $(MXENV_TARGET)
4141
@echo "Install Sphinx"
42-
@$(MXENV_PYTHON) -m pip install -U sphinx sphinx-autobuild $(DOCS_REQUIREMENTS)
42+
@$(PYTHON_PACKAGE_COMMAND) install -U sphinx sphinx-autobuild $(DOCS_REQUIREMENTS)
4343
@touch $(DOCS_TARGET)
4444

4545
.PHONY: docs

src/mxmake/topics/i18n/lingua.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
LINGUA_TARGET:=$(SENTINEL_FOLDER)/lingua.sentinel
2828
$(LINGUA_TARGET): $(MXENV_TARGET)
2929
@echo "Install Lingua"
30-
@$(MXENV_PYTHON) -m pip install chameleon lingua $(LINGUA_PLUGINS)
30+
@$(PYTHON_PACKAGE_COMMAND) install chameleon lingua $(LINGUA_PLUGINS)
3131
@touch $(LINGUA_TARGET)
3232

3333
PHONY: lingua-extract

src/mxmake/topics/ldap/python-ldap.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ SYSTEM_DEPENDENCIES+=python3-dev libldap2-dev libssl-dev libsasl2-dev
2323

2424
PYTHON_LDAP_TARGET:=$(SENTINEL_FOLDER)/python-ldap.sentinel
2525
$(PYTHON_LDAP_TARGET): $(MXENV_TARGET) $(OPENLDAP_TARGET)
26-
@$(MXENV_PYTHON) -m pip install \
26+
@$(PYTHON_PACKAGE_COMMAND) install \
2727
--force-reinstall \
2828
python-ldap
2929
@touch $(PYTHON_LDAP_TARGET)

0 commit comments

Comments
 (0)