This guide documents breaking changes between mxmake versions and how to migrate your projects.
New Feature: Python projects can now be located in a subdirectory relative to the Makefile.
Purpose: Support monorepo setups with multiple applications (e.g., frontend + backend) in one repository.
New Setting: PROJECT_PATH_PYTHON in the core.base domain.
Example Configuration:
# In your Makefile
PROJECT_PATH_PYTHON?=backend# In your mx.ini (specify full paths from repo root)
[settings]
mxmake-test-path = backend/tests
mxmake-source-path = backend/srcSetup Methods:
-
Auto-detection (recommended):
uvx mxmake init # Prompts if pyproject.toml found in subdirectory -
CLI flag:
uvx mxmake init --project-path-python backend
-
Preseed file:
topics: core: base: PROJECT_PATH_PYTHON: backend
What Changes:
- Makefile references:
backend/pyproject.tomlinstead of./pyproject.toml - mx.ini paths: Specify full paths from repository root (e.g.,
mxmake-test-path = backend/tests) - GitHub Actions: Cache uses
backend/pyproject.tomlfor dependency tracking
Migration: None required. This is an opt-in feature with no impact on existing projects.
See Also: Monorepo Support in Getting Started guide.
Breaking Change: Minimum Python version increased from 3.9 to 3.10.
Migration:
- Ensure your system has Python 3.10 or later installed
- Run
mxmake updateto regenerate Makefile (automatically updatesPYTHON_MIN_VERSIONto 3.10) - If needed, customize Python version settings:
- Using UV: Set
UV_PYTHONto desired version:UV_PYTHON?=3.10 # or 3.11, 3.12, 3.13, 3.14
- Using pip: Ensure
PRIMARY_PYTHONpoints to Python 3.10+:PRIMARY_PYTHON?=python3.10
- Using UV: Set
Breaking Change: The MXENV_UV_GLOBAL setting has been removed. UV is now automatically detected.
Before (1.x):
PYTHON_PACKAGE_INSTALLER?=uv
MXENV_UV_GLOBAL?=trueAfter (2.0+):
PYTHON_PACKAGE_INSTALLER?=uv
UV_PYTHON?=3.14 # Optional: specify Python versionMigration:
- Run
mxmake update(automatically removesMXENV_UV_GLOBALsetting) - UV will be automatically detected if installed globally
- If needed, add
UV_PYTHONsetting to specify Python version:UV_PYTHON?=3.14 - To force local UV installation, ensure UV is not in your PATH before running
make install
Critical Fix: SOURCES_TARGET incorrectly used mxdev's -o (offline) flag instead of -f (no fetch).
Impact: This affects projects using mxdev with source checkouts. The -o flag had a bug (fixed in mxdev 5.0).
Migration:
- Update mxdev to version 5.0 or later:
pip install -U mxdev>=5 - Run
mxmake update(automatically regenerates Makefile with correct-fflag)
New Feature: Introduced UV_PYTHON setting for semantic clarity.
Purpose:
PRIMARY_PYTHON: System interpreter path (e.g.,python3,/usr/bin/python3.11)UV_PYTHON: Python version spec for UV (e.g.,3.14,[email protected])
Migration (optional but recommended):
# Old approach (still works)
PYTHON_PACKAGE_INSTALLER?=uv
PRIMARY_PYTHON?=3.14
# New approach (clearer semantics)
PYTHON_PACKAGE_INSTALLER?=uv
UV_PYTHON?=3.14No breaking changes
No breaking changes
No breaking changes
No breaking changes
No breaking changes
No breaking changes
No breaking changes
Breaking Change: The npm domain was renamed to nodejs to better reflect its purpose (Node.js tooling, supporting both npm and pnpm).
Before:
# preseed.yaml or mx.ini
topics:
js:
npm:After:
# preseed.yaml or mx.ini
topics:
js:
nodejs:Migration:
- Run
mxmake update(automatically uses newnodejsdomain name) - If using preseed files, update them to use
nodejsinstead ofnpm - The domain now supports both npm and pnpm package managers
Breaking Change: Minimum Python version increased from 3.8 to 3.9.
Migration:
- Ensure your project uses Python 3.9 or later
- Run
mxmake update(automatically updatesPYTHON_MIN_VERSIONto 3.9)
Note: This change was superseded by version 2.0.0 which requires Python 3.10+.
No breaking changes
Breaking Change: Default virtual environment folder changed from venv to .venv.
Before:
VENV_FOLDER?=venvAfter:
VENV_FOLDER?=.venvMigration:
- Run
mxmake update(automatically updates default to.venv) - Choose one option:
- Option A (Use new default): Delete old
venvfolder, runmake installto create.venv - Option B (Keep old folder): Edit Makefile to set
VENV_FOLDER=venv
- Option A (Use new default): Delete old
- Update
.gitignore:# Old venv/ # New .venv/
Breaking Change: PYTHON_BIN setting renamed to PRIMARY_PYTHON.
Before:
PYTHON_BIN?=python3After:
PRIMARY_PYTHON?=python3Migration:
- Run
mxmake update(automatically renamesPYTHON_BINtoPRIMARY_PYTHON) - If you have custom scripts referencing
PYTHON_BIN, update them to usePRIMARY_PYTHON
Breaking Change: MXENV_PATH variable has been removed. Use $(MXENV_PYTHON) directly.
Before:
$(MXENV_PATH)pip install something
$(MXENV_PATH)pytest tests/After:
$(MXENV_PYTHON) -m pip install something
$(MXENV_PYTHON) -m pytest tests/Migration:
- Run
mxmake update(automatically removesMXENV_PATH) - If you have custom Makefile targets using
MXENV_PATH, update them manually:$(MXENV_PATH)pip→$(MXENV_PYTHON) -m pip$(MXENV_PATH)pytest→$(MXENV_PYTHON) -m pytest$(MXENV_PATH)black→$(MXENV_PYTHON) -m black
No breaking changes (added typecheck target, CI config generation, ruff domain)
No breaking changes (fixes and pip.conf support)
Breaking Change: Major terminology changes in custom domain development.
Changes:
- "Domains" are now called "Topics"
- "Makefile" is now called "Domain"
_SENTINELvariables renamed to_TARGET.sentinelsfolder renamed to.mxmake-sentinels
Impact: Only affects custom domain/plugin authors, not regular users.
Migration (for plugin developers):
- Update custom domain files to use new terminology
- Rename
*_SENTINELvariables to*_TARGET:# Before MYDOM_SENTINEL?=.sentinels/mydom # After MYDOM_TARGET?=.mxmake-sentinels/mydom
Breaking Changes: Several domains renamed for clarity.
| Old Name | New Name |
|---|---|
install |
packages |
files |
mxfiles |
venv |
mxenv |
docs |
sphinx |
Migration:
- Run
mxmake update(automatically uses new domain names) - If using preseed files with old domain names, update them to use new names
Initial release - no migration needed.
- Read Release Notes: Check CHANGES.md for your target version
- Backup: Commit your current Makefile to version control
- Test: If possible, test the upgrade in a separate branch
-
Upgrade mxmake:
pip install -U mxmake # or with UV: uv pip install -U mxmake -
Update Makefile:
mxmake update
-
Review Changes: Check the diff to ensure settings are preserved
-
Test: Run
make installandmake testto verify functionality
If you encounter issues:
git checkout Makefile # Restore previous version
pip install mxmake==<previous-version> # Downgrade mxmake- Documentation: https://mxmake.readthedocs.io
- Issues: https://github.com/mxstack/mxmake/issues
- Changelog: https://github.com/mxstack/mxmake/blob/main/CHANGES.md