22# THIS FILE IS GENERATED BY MXMAKE
33#
44# DOMAINS:
5+ # : applications.zest-releaser
56# : core.base
67# : core.mxenv
78# : core.mxfiles
89# : core.packages
10+ # : core.sources
911# : qa.coverage
1012# : qa.test
1113#
@@ -37,30 +39,41 @@ INCLUDE_MAKEFILE?=include.mk
3739# No default value.
3840EXTRA_PATH? =
3941
42+ # Path to Python project relative to Makefile (repository root).
43+ # Leave empty if Python project is in the same directory as Makefile.
44+ # For monorepo setups, set to subdirectory name (e.g., `backend`).
45+ # Future-proofed for multi-language monorepos (e.g., PROJECT_PATH_NODEJS).
46+ # No default value.
47+ PROJECT_PATH_PYTHON? =
48+
4049# # core.mxenv
4150
4251# Primary Python interpreter to use. It is used to create the
4352# virtual environment if `VENV_ENABLED` and `VENV_CREATE` are set to `true`.
53+ # If global `uv` is used, this value is passed as `--python VALUE` to the venv creation.
54+ # uv then downloads the Python interpreter if it is not available.
55+ # for more on this feature read the [uv python documentation](https://docs.astral.sh/uv/concepts/python-versions/)
4456# Default: python3
4557PRIMARY_PYTHON? =python3
4658
4759# Minimum required Python version.
48- # Default: 3.9
49- PYTHON_MIN_VERSION? =3.9
60+ # Default: 3.10
61+ PYTHON_MIN_VERSION? =3.10
5062
5163# Install packages using the given package installer method.
52- # Supported are `pip` and `uv`. If uv is used, its global availability is
53- # checked. Otherwise, it is installed, either in the virtual environment or
54- # using the `PRIMARY_PYTHON`, dependent on the `VENV_ENABLED` setting. If
55- # `VENV_ENABLED` and uv is selected, uv is used to create the virtual
56- # environment.
64+ # Supported are `pip` and `uv`. When `uv` is selected, a global installation
65+ # is auto-detected and used if available. Otherwise, uv is installed in the
66+ # virtual environment or using `PRIMARY_PYTHON`, depending on the
67+ # `VENV_ENABLED` setting.
5768# Default: pip
5869PYTHON_PACKAGE_INSTALLER? =uv
5970
60- # Flag whether to use a global installed 'uv' or install
61- # it in the virtual environment.
62- # Default: false
63- MXENV_UV_GLOBAL? =false
71+ # Python version for UV to install/use when creating virtual
72+ # environments with global UV. Passed to `uv venv -p VALUE`. Supports version
73+ # specs like `3.11`, `3.14`, `cpython@3.14`. Defaults to PRIMARY_PYTHON value
74+ # for backward compatibility.
75+ # Default: $(PRIMARY_PYTHON)
76+ UV_PYTHON? =$(PRIMARY_PYTHON )
6477
6578# Flag whether to use virtual environment. If `false`, the
6679# interpreter according to `PRIMARY_PYTHON` found in `PATH` is used.
@@ -107,7 +120,7 @@ PACKAGES_ALLOW_PRERELEASES?=false
107120# The command which gets executed. Defaults to the location the
108121# :ref:`run-tests` template gets rendered to if configured.
109122# Default: .mxmake/files/run-tests.sh
110- TEST_COMMAND? =$( VENV_FOLDER ) /bin/pytest src/node/ tests
123+ TEST_COMMAND? =.mxmake/files/run- tests.sh
111124
112125# Additional Python requirements for running tests to be
113126# installed (via pip).
@@ -123,12 +136,25 @@ TEST_DEPENDENCY_TARGETS?=
123136# The command which gets executed. Defaults to the location the
124137# :ref:`run-coverage` template gets rendered to if configured.
125138# Default: .mxmake/files/run-coverage.sh
126- COVERAGE_COMMAND? =\
127- $(VENV_FOLDER ) /bin/coverage run \
128- --source=src/node \
129- --omit=src/node/testing/profiling.py \
130- -m pytest src/node/tests \
131- && $(VENV_FOLDER ) /bin/coverage report --fail-under=100
139+ COVERAGE_COMMAND? =.mxmake/files/run-coverage.sh
140+
141+ # # applications.zest-releaser
142+
143+ # Options to pass to zest.releaser prerelease command.
144+ # No default value.
145+ ZEST_RELEASER_PRERELEASE_OPTIONS? =
146+
147+ # Options to pass to zest.releaser release command.
148+ # No default value.
149+ ZEST_RELEASER_RELEASE_OPTIONS? =
150+
151+ # Options to pass to zest.releaser postrelease command.
152+ # No default value.
153+ ZEST_RELEASER_POSTRELEASE_OPTIONS? =
154+
155+ # Options to pass to zest.releaser fullrelease command.
156+ # No default value.
157+ ZEST_RELEASER_FULLRELEASE_OPTIONS? =
132158
133159# #############################################################################
134160# END SETTINGS - DO NOT EDIT BELOW THIS LINE
@@ -144,6 +170,9 @@ FORMAT_TARGETS?=
144170
145171export PATH: =$(if $(EXTRA_PATH ) ,$(EXTRA_PATH ) :,)$(PATH )
146172
173+ # Helper variable: adds trailing slash to PROJECT_PATH_PYTHON only if non-empty
174+ PYTHON_PROJECT_PREFIX =$(if $(PROJECT_PATH_PYTHON ) ,$(PROJECT_PATH_PYTHON ) /,)
175+
147176# Defensive settings for make: https://tech.davis-hansson.com/p/make/
148177SHELL: =bash
149178.ONESHELL :
@@ -168,7 +197,7 @@ $(SENTINEL): $(firstword $(MAKEFILE_LIST))
168197# mxenv
169198# #############################################################################
170199
171- export OS: = $( OS )
200+ OS? =
172201
173202# Determine the executable path
174203ifeq ("$(VENV_ENABLED ) ", "true")
@@ -184,26 +213,61 @@ else
184213MXENV_PYTHON =$(PRIMARY_PYTHON )
185214endif
186215
187- # Determine the package installer
216+ # Determine the package installer with non-interactive flags
188217ifeq ("$(PYTHON_PACKAGE_INSTALLER ) ","uv")
189- PYTHON_PACKAGE_COMMAND =uv pip
218+ PYTHON_PACKAGE_COMMAND =uv pip --no-progress
190219else
191220PYTHON_PACKAGE_COMMAND =$(MXENV_PYTHON ) -m pip
192221endif
193222
223+ # Auto-detect global uv availability (simple existence check)
224+ ifeq ("$(PYTHON_PACKAGE_INSTALLER ) ","uv")
225+ UV_AVAILABLE: =$(shell command -v uv >/dev/null 2>&1 && echo "true" || echo "false")
226+ else
227+ UV_AVAILABLE: =false
228+ endif
229+
230+ # Determine installation strategy
231+ # depending on the PYTHON_PACKAGE_INSTALLER and UV_AVAILABLE
232+ # - both vars can be false or
233+ # - one of them can be true,
234+ # - but never boths.
235+ USE_GLOBAL_UV: =$(shell [[ "$(PYTHON_PACKAGE_INSTALLER ) " == "uv" && "$(UV_AVAILABLE ) " == "true" ]] && echo "true" || echo "false")
236+ USE_LOCAL_UV: =$(shell [[ "$(PYTHON_PACKAGE_INSTALLER ) " == "uv" && "$(UV_AVAILABLE ) " == "false" ]] && echo "true" || echo "false")
237+
238+ # Check if global UV is outdated (non-blocking warning)
239+ ifeq ("$(USE_GLOBAL_UV ) ","true")
240+ UV_OUTDATED: =$(shell uv self update --dry-run 2>&1 | grep -q "Would update" && echo "true" || echo "false")
241+ else
242+ UV_OUTDATED: =false
243+ endif
244+
194245MXENV_TARGET: =$(SENTINEL_FOLDER ) /mxenv.sentinel
195246$(MXENV_TARGET ) : $(SENTINEL )
247+ # Validation: Check Python version if not using global uv
248+ ifneq ("$(USE_GLOBAL_UV ) ","true")
196249 @$(PRIMARY_PYTHON) -c "import sys; vi = sys.version_info; sys.exit(1 if (int(vi[0]), int(vi[1])) >= tuple(map(int, '$(PYTHON_MIN_VERSION)'.split('.'))) else 0)" \
197250 && echo "Need Python >= $(PYTHON_MIN_VERSION)" && exit 1 || :
251+ else
252+ @echo "Using global uv for Python $(UV_PYTHON)"
253+ endif
254+ # Validation: Check VENV_FOLDER is set if venv enabled
198255 @[[ "$(VENV_ENABLED)" == "true" && "$(VENV_FOLDER)" == "" ]] \
199256 && echo "VENV_FOLDER must be configured if VENV_ENABLED is true" && exit 1 || :
200- @[[ " $( VENV_ENABLED) $( PYTHON_PACKAGE_INSTALLER) " == " falseuv" ]] \
257+ # Validation: Check uv not used with system Python
258+ @[[ "$(VENV_ENABLED)" == "false" && "$(PYTHON_PACKAGE_INSTALLER)" == "uv" ]] \
201259 && echo "Package installer uv does not work with a global Python interpreter." && exit 1 || :
260+ # Warning: Notify if global UV is outdated
261+ ifeq ("$(UV_OUTDATED ) ","true")
262+ @echo "WARNING: A newer version of uv is available. Run 'uv self update' to upgrade."
263+ endif
264+
265+ # Create virtual environment
202266ifeq ("$(VENV_ENABLED ) ", "true")
203267ifeq ("$(VENV_CREATE ) ", "true")
204- ifeq ("$(PYTHON_PACKAGE_INSTALLER )$( MXENV_UV_GLOBAL ) ","uvtrue ")
205- @echo "Setup Python Virtual Environment using package 'uv' at '$(VENV_FOLDER)'"
206- @uv venv -p $(PRIMARY_PYTHON ) --seed $(VENV_FOLDER)
268+ ifeq ("$(USE_GLOBAL_UV ) ","true ")
269+ @echo "Setup Python Virtual Environment using global uv at '$(VENV_FOLDER)'"
270+ @uv venv --allow-existing --no-progress - p $(UV_PYTHON ) --seed $(VENV_FOLDER)
207271else
208272 @echo "Setup Python Virtual Environment using module 'venv' at '$(VENV_FOLDER)'"
209273 @$(PRIMARY_PYTHON) -m venv $(VENV_FOLDER)
@@ -213,10 +277,14 @@ endif
213277else
214278 @echo "Using system Python interpreter"
215279endif
216- ifeq ("$(PYTHON_PACKAGE_INSTALLER )$(MXENV_UV_GLOBAL ) ","uvfalse")
217- @echo "Install uv"
280+
281+ # Install uv locally if needed
282+ ifeq ("$(USE_LOCAL_UV ) ","true")
283+ @echo "Install uv in virtual environment"
218284 @$(MXENV_PYTHON) -m pip install uv
219285endif
286+
287+ # Install/upgrade core packages
220288 @$(PYTHON_PACKAGE_COMMAND) install -U pip setuptools wheel
221289 @echo "Install/Update MXStack Python packages"
222290 @$(PYTHON_PACKAGE_COMMAND) install -U $(MXDEV) $(MXMAKE)
@@ -244,6 +312,31 @@ INSTALL_TARGETS+=mxenv
244312DIRTY_TARGETS+ =mxenv-dirty
245313CLEAN_TARGETS+ =mxenv-clean
246314
315+ # #############################################################################
316+ # sources
317+ # #############################################################################
318+
319+ SOURCES_TARGET: =$(SENTINEL_FOLDER ) /sources.sentinel
320+ $(SOURCES_TARGET ) : $(PROJECT_CONFIG ) $(MXENV_TARGET )
321+ @echo " Checkout project sources"
322+ @mxdev -f -c $(PROJECT_CONFIG )
323+ @touch $(SOURCES_TARGET )
324+
325+ .PHONY : sources
326+ sources : $(SOURCES_TARGET )
327+
328+ .PHONY : sources-dirty
329+ sources-dirty :
330+ @rm -f $(SOURCES_TARGET )
331+
332+ .PHONY : sources-purge
333+ sources-purge : sources-dirty
334+ @rm -rf sources
335+
336+ INSTALL_TARGETS+ =sources
337+ DIRTY_TARGETS+ =sources-dirty
338+ PURGE_TARGETS+ =sources-purge
339+
247340# #############################################################################
248341# mxfiles
249342# #############################################################################
271364 @echo "[settings]" > $(PROJECT_CONFIG)
272365endif
273366
274- LOCAL_PACKAGE_FILES: =$(wildcard pyproject.toml setup.cfg setup.py requirements.txt constraints.txt)
367+ LOCAL_PACKAGE_FILES: =$(wildcard $( PYTHON_PROJECT_PREFIX ) pyproject.toml $( PYTHON_PROJECT_PREFIX ) setup.cfg $( PYTHON_PROJECT_PREFIX ) setup.py $( PYTHON_PROJECT_PREFIX ) requirements.txt $( PYTHON_PROJECT_PREFIX ) constraints.txt)
275368
276369FILES_TARGET: =requirements-mxdev.txt
277370$(FILES_TARGET ) : $(PROJECT_CONFIG ) $(MXENV_TARGET ) $(SOURCES_TARGET ) $(LOCAL_PACKAGE_FILES )
@@ -402,6 +495,48 @@ INSTALL_TARGETS+=$(COVERAGE_TARGET)
402495DIRTY_TARGETS+ =coverage-dirty
403496CLEAN_TARGETS+ =coverage-clean
404497
498+ # #############################################################################
499+ # zest-releaser
500+ # #############################################################################
501+
502+ ZEST_RELEASER_TARGET: =$(SENTINEL_FOLDER ) /zest-releaser.sentinel
503+ $(ZEST_RELEASER_TARGET ) : $(MXENV_TARGET )
504+ @echo " Install zest.releaser"
505+ @$(PYTHON_PACKAGE_COMMAND ) install zest.releaser
506+ @touch $(ZEST_RELEASER_TARGET )
507+
508+ .PHONY : zest-releaser-prerelease
509+ zest-releaser-prerelease : $(ZEST_RELEASER_TARGET )
510+ @echo " Run prerelease"
511+ @prerelease $(ZEST_RELEASER_PRERELEASE_OPTIONS )
512+
513+ .PHONY : zest-releaser-release
514+ zest-releaser-release : $(ZEST_RELEASER_TARGET )
515+ @echo " Run release"
516+ @release $(ZEST_RELEASER_RELEASE_OPTIONS )
517+
518+ .PHONY : zest-releaser-postrelease
519+ zest-releaser-postrelease : $(ZEST_RELEASER_TARGET )
520+ @echo " Run postrelease"
521+ @postrelease $(ZEST_RELEASER_POSTRELEASE_OPTIONS )
522+
523+ .PHONY : zest-releaser-fullrelease
524+ zest-releaser-fullrelease : $(ZEST_RELEASER_TARGET )
525+ @echo " Run fullrelease"
526+ @fullrelease $(ZEST_RELEASER_FULLRELEASE_OPTIONS )
527+
528+ .PHONY : zest-releaser-dirty
529+ zest-releaser-dirty :
530+ @rm -f $(ZEST_RELEASER_TARGET )
531+
532+ .PHONY : zest-releaser-clean
533+ zest-releaser-clean : zest-releaser-dirty
534+ @test -e $(MXENV_PYTHON ) && $(MXENV_PYTHON ) -m pip uninstall -y zest.releaser || :
535+
536+ INSTALL_TARGETS+ =$(ZEST_RELEASER_TARGET )
537+ DIRTY_TARGETS+ =zest-releaser-dirty
538+ CLEAN_TARGETS+ =zest-releaser-clean
539+
405540# #############################################################################
406541# Custom includes
407542# #############################################################################
0 commit comments