@@ -53,6 +53,20 @@ PRIMARY_PYTHON?=python3
5353# Default: 3.7
5454PYTHON_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
208222MXENV_PYTHON =$(PRIMARY_PYTHON )
209223endif
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+
211234MXENV_TARGET: =$(SENTINEL_FOLDER ) /mxenv.sentinel
212235$(MXENV_TARGET ) : $(SENTINEL )
213236ifeq ("$(VENV_ENABLED ) ", "true")
237+ # Use a venv
214238ifeq ("$(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)
237276endif
238277else
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)
241280endif
242281
243282INSTALL_TARGETS+ =mxenv
@@ -251,7 +290,7 @@ CLEAN_TARGETS+=mxenv-clean
251290RUFF_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
286325ISORT_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
326365DOCS_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
420459PACKAGES_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
450489TEST_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
479518COVERAGE_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
508547MYPY_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
537576ZEST_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
0 commit comments