Generates a Python project-specific Makefile by using an extensible library of configurable Makefile snippets.
Project description
mxmake [mɪks meɪk] generates a project-specific Makefile by using an extensible library of configurable Makefile snippets.
It targets the development environments for Python packages but may be used outside of this playground.
Documentation
The detailed mxmake documentation is available mxstack.github.io/mxmake.
Copyright
- Copyright (c) 2022-2025 mxstack Contributors
- BSD 2-clause license (see below)
Contributors
- Robert Niederreiter
- Jens Klein
Changelog
2.2.0
- Feature: Add optional
ruff check --fixsupport to ruff-format target [jensens, 2025-11-11] - Feature: Add
qa.tydomain for Astral's ty type checker. ty is an extremely fast Python type checker (10-100x faster than mypy). Registers with both CHECK_TARGETS and TYPECHECK_TARGETS for fast feedback. [jensens, 2026-01-28] - Use ty and extended ruff for check, drop isort and mypy from
pyproject.toml. [jensens, 2026-01-28]
2.1.0
-
Enhancement: Use tables in the generated sphinx code for topic/domains. [jensens, 02-11-2025]
-
Feature: Add monorepo support with
PROJECT_PATH_PYTHONsetting. Python projects can now be located in subdirectories while keeping the Makefile at the repository root. Includes auto-detection ofpyproject.tomlin subdirectories on init,--project-path-pythonCLI flag and preseed file support. Useful for monorepos with multiple applications (e.g., frontend + backend). See the "Monorepo Support" section in getting-started.md for details. -
Feature: Add
--version(-v) command line flag to display mxmake version. [jensens, 02-11-2025] -
Fix: All QA tool domains (ruff, isort, mypy, black, zpretty, pyupgrade, pyrefly) now respect the
PROJECT_PATH_PYTHONsetting when using default source paths. WhenPROJECT_PATH_PYTHONis set (e.g., tobackend), the tools automatically look for source code in the correct subdirectory (e.g.,backend/src) instead of justsrc. [jensens, 03-11-2025]
2.0.0 (2025-10-24)
- Breaking: Drop Python 3.9 support. Minimum Python version is now 3.10.
- Feature: Modernize codebase to use Python 3.10+ features (PEP 604 union types, built-in generic types).
- Critical fix:
SOURCES_TARGETused mxdev wrongly with-o(offline) option. The offline option had a bug and was fixed in mxdev #34 and released with mxdev>=5. This fix switches from-oto the correct-f(no fetch from vcs). To update your makefile usemxmake updatein the folder with yourMakefile. - Fix: theme for newer Sphinx 7.x.
- Fix: interactive uv venv, use
--allow-existinginstead. - Fix: The project was using
pytestas the test runner all along (as configured in the Makefile and generated test scripts), butzope.testrunnerwas incorrectly listed as the dependency. - Feature: Add support for Python 3.14.
- Breaking: Removed
MXENV_UV_GLOBALsetting in favor of automatic UV detection. WhenPYTHON_PACKAGE_INSTALLER=uv, mxmake now automatically detects and uses a globally installeduvif available. To force local installation of uv, simply don't install it globally or remove it from PATH. - Feature: Add
UV_PYTHONsetting to specify Python version for UV-managed virtual environments. Defaults toPRIMARY_PYTHONfor backward compatibility. This provides semantic clarity:PRIMARY_PYTHONis the system interpreter path (e.g.,python3.11), whileUV_PYTHONis the version spec for UV (e.g.,3.14,cpython@3.14). - Feature: Automatic detection of global UV installation using simple shell check. No manual configuration required.
- Feature: All UV commands now run with
--quiet --no-progressflags for better CI/CD compatibility and cleaner log output. - Feature: When using global UV, mxmake checks if updates are available using
uv self update --dry-runand displays a helpful non-blocking warning if a newer version is available. - Improvement: Simplified mxenv.mk logic from 3+ nesting levels to 1-2 levels
using computed intermediate variables (
USE_GLOBAL_UV,USE_LOCAL_UV). Code is now more maintainable and easier to extend. - Tests/CI: Add UV-only CI job testing workflow without Python pre-installation.
New
uv-onlyjob in variants workflow verifies thatmake installworks with only UV installed (no Python) on Python 3.10 and 3.14, proving the UV-only team workflow documented in getting-started.md. - Docs: Complete overhaul of installation documentation. Document UV-only workflow requiring no Python pre-installation. Simplify UV configuration examples to show only required settings (PYTHON_PACKAGE_INSTALLER and UV_PYTHON). Add migration guide, FAQ/troubleshooting section, and clarify when PYTHON_MIN_VERSION/PRIMARY_PYTHON settings are needed vs. optional.
- Chore: Migrate to hatch-vcs for automated versioning from git tags.
1.3.0 (2025-09-03)
- Introduce testargs for pytest to have more control over the test and pass it args.
1.2.2 (2025-06-30)
-
Fix
pyreflydomain. -
Fix pytest related test and coverage script generation bugs introduced in 1.2.1.
1.2.1 (2025-06-23)
- Fix test-script to not end with backslash if there is no
testpaths(which is valid). Improve tests to cover more edge cases, i.e. above and multi-line. - Improve test to read large amount of output from file (Makefile template check).
- Fix Python check for global UV and use PRIMARY_PYTHON for UV as version definition.
1.2.0 (2025-06-04)
- add
pyreflytype checker support.
1.1.0 (2025-03-20)
-
Chore: Build-system update and minor cleanups.
-
Feature: Add help system (make help).
-
Feature: Add target
zope-adduserto create an emergency user.
1.0 (2025-02-11)
-
Chore: Add release workflow.
-
Fix
zope.mk, wrong config file was passed to zconsole. Now zope-debug and zope-runscript are functional.
1.0a8 (2024-10-24)
- Fix preseed value reading.
1.0a7 (2024-10-24)
- Add proxy target support.
Breaking changes
- Rename
npmdomain tonodejsand add support for usingpnpmas alternative package manager.
1.0a6 (2024-08-02)
-
Fix bug in
Template.writewhen creating target folders to also create parent folders if not exists. -
Add support for preseeds configuration files.
-
Add
plone-sitetemplate configuration tomx.initemplate. -
More fine grained control over plone site creation and purging.
-
Drop Python 3.8 and set all defaults to a Python 3.9 minimum.
1.0a5 (2024-06-07)
-
Export
OSenvironment variable inmxenvdomain to prevent warning on sub make calls. -
Add
LINGUA_OPTIONSsetting tolinguadomain ini18ntopic. Can be used for passing additional command line options topot-create. -
Perform
mxenvdomain related checks inside target to support setups which install their own python environment. -
Add
Makefileas dependency target forSENTINELtarget to make sure target execution if Makefile changes. -
Depend on
mxdev>=4.0.2, which fixes the deprecation ofpkg_resourcesand use the provided infrastructure of mxdev to handle entry_points in mxmake. -
Add Plone site creation and purging in new
plonedomain.
1.0a4 (2024-03-12)
-
Add experimental windows support.
-
Support
mxmake updatecommand, updating the Makefile without prompting for settings. -
Use importlib.metadata to load entrypoints.
-
Add support for uv as fast alternative to pip #25.
-
Remove Python 3.7 from CI. Still works though.
-
Run test on GH-Actions on platform macos-latest.
-
Use
pathlib.Pathinstead ofos.path. -
Add
EXTRA_PATHsetting tobasedomain incoretopic. Can be used to specify additional directories added to environmentPATH. -
Export
PATHwith virtual environment and node modules bin folders. -
Get rid of
MXENV_PATH. -
Rename
PYTHON_BINtoPRIMARY_PYTHONinmxenvdomain. -
Introduce
MXENV_PYTHON. It defines the Python executable used for mxmake operations. -
Remove ruff cache when running
make ruff-cleantarget. -
Fix #20: make VENV_ENABLED=false test does not work.
-
Add
wtr(Web test runner) domain tojstopic. -
Add pyupgrade based code formatter, see https://pypi.org/project/pyupgrade/.
-
Add
ZOPE_TEMPLATE_CHECKOUToption to zope domain to allow pinning to a tag, branch or revision (uses cookiecutter--checkout). If empty, do not apply--checkoutoption. -
Add phony target
cookiecutterto be able to just install it. -
Add feature to pass options to zest-releaser commands.
-
Change default for venv folder to
.venv, since this is established practice.
1.0a3 (2024-02-06)
-
Add
typechecktarget and use it for mypy instead ofchecktarget. -
Add basic CI config file generation for github actions.
-
Add
ruffdomain toqatopic. -
Fix exporting path in
jsdoctarget.
1.0a2 (2023-07-07)
-
Add support for
pip.conffile. -
Fixes #18: VENV_CREATE is ignored.
-
Fix error when new source package gets added to
mx.iniinHook.generate_additional_sources_targets. -
Add
PROJECT_CONFIGas the dependency target ofSOURCES_TARGETto make sure the target runs when a new source package gets added tomx.ini.
1.0a1 (2023-05-05)
-
Add
zest-releaserdomain toapplicationstopic. -
Support custom makefile include.
-
Support
pytestas a test runner and make it default if not configured otherwise. -
Add
RUN_TARGETsetting tobasedomain and generateruntarget inMakefile. -
Create
twisteddomain inapplicationstopic. -
Test and coverage templates consider
mxmake-test-path,mxmake-source-pathandmxmake-omit-pathinsettingssection ofmx.inito support inclusion of local package inrun-tests.shandrun-coverage.shscripts. -
Create
scssdomain injstopic. -
Create
gettextdomain ini18ntopic. -
Create
linguadomain ini18ntopic. -
Conditional add local [requirement|constraints}.txt to LOCAL_PACKAGE_FILES.
-
Generate one Makefile from snippets instead of including several files from subfolder.
-
Semantic overhaul. "Domains" become "Topics" and "Makefile" becomes "Domain".
-
Use inquirer to configure included domains and targets.
-
Generate initial
mx.iniconfig file. -
Generate "Topic" and "Domain" docs.
-
Change docs format from
rsttomd. -
Rename
_SENTINELto_TARGETin domains. -
generic
installdirtyandcleantargets in main makefile template. -
Rename
.sentinelsfolder to.mxmake-sentinels. -
Provide a set of default targets and a mechanism to extend it's dependency targets in domain make files.
-
Rename
installdomain topackages. -
Rename
filesdomain tomxfiles. -
Rename
venvdomain tomxenv. -
Extend hook to generate
sourcesdependency targets for package reinstall (setup.py, setup.cfg, pyproject.toml, requirements.txt, constraints.txt). -
Move
testsandcoveragedomains toqatopic. -
Create
black,mypy,isortand domains inqatopic. -
Move
system-dependenciestosystemtopic. -
Rename
docsdomain tosphinxand move todocstopic. -
Create
zprettydomains inqatopic. -
Add topic related metadata containing a topic description.
-
Create
npmdomains injstopic. -
Create
jsdocdomain, indocstopic. -
Create
rollupdomains injstopic. -
Create
karmadomain, injstopic. -
Create
zopedomain, inapplicationstopic. -
Add
soft-dependssetting in domains to define conditional order of domain rendering. -
Make
sourcestarget an optional dependency. -
Extend makefile parser to provide multi line settings.
-
Take local package into account to "dirty" if there (pyproject.toml, setup.[cfg|py]
-
Check for the existence of pip in
*-cleantargets before uninstalling a package, to ensure the targets are working when running via the defaultcleantarget, where the entire virtual env gets removed. -
Remove redundant dependencies from
zopedomain. -
sourcesdomain is now a soft dependency ofmxfilesdomain instead of thepackagesdomain. This ensures source package checkout happens before mxmake generates files, because templates might gain information from source packages if present. -
karmaandrolluptargets depend onNPM_TARGETnow.
0.1 (2022-05-19)
- Initial release.
License
Copyright (c) 2022-2025, mxstack Contributors
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mxmake-2.2.0.tar.gz.
File metadata
- Download URL: mxmake-2.2.0.tar.gz
- Upload date:
- Size: 195.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a9c905f19000060dec237433d796a126c07f4d9a33a78a1c56932e4f1c908778
|
|
| MD5 |
099017c882a72375cf65cf9dbdbcb56c
|
|
| BLAKE2b-256 |
b7bc4e0e654dc062e707053de2afaaad5dd75544c7796a90c6ecb8f19f39e460
|
Provenance
The following attestation bundles were made for mxmake-2.2.0.tar.gz:
Publisher:
release.yml on mxstack/mxmake
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mxmake-2.2.0.tar.gz -
Subject digest:
a9c905f19000060dec237433d796a126c07f4d9a33a78a1c56932e4f1c908778 - Sigstore transparency entry: 868558793
- Sigstore integration time:
-
Permalink:
mxstack/mxmake@fb950c186636202dbf5d641365afdca7f43f0d71 -
Branch / Tag:
refs/tags/v2.2.0 - Owner: https://github.com/mxstack
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fb950c186636202dbf5d641365afdca7f43f0d71 -
Trigger Event:
release
-
Statement type:
File details
Details for the file mxmake-2.2.0-py3-none-any.whl.
File metadata
- Download URL: mxmake-2.2.0-py3-none-any.whl
- Upload date:
- Size: 74.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d6aba87951fef05293edf1c5b169d8882fc149687800a4ba1e584d05d457dfb1
|
|
| MD5 |
af8e09142e7d0ac57fe3d477a4211bde
|
|
| BLAKE2b-256 |
aa9e95cedbddaa117a6a220a44410fb96fbd320e0c342e3e3b369d2fec3ae497
|
Provenance
The following attestation bundles were made for mxmake-2.2.0-py3-none-any.whl:
Publisher:
release.yml on mxstack/mxmake
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mxmake-2.2.0-py3-none-any.whl -
Subject digest:
d6aba87951fef05293edf1c5b169d8882fc149687800a4ba1e584d05d457dfb1 - Sigstore transparency entry: 868558845
- Sigstore integration time:
-
Permalink:
mxstack/mxmake@fb950c186636202dbf5d641365afdca7f43f0d71 -
Branch / Tag:
refs/tags/v2.2.0 - Owner: https://github.com/mxstack
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fb950c186636202dbf5d641365afdca7f43f0d71 -
Trigger Event:
release
-
Statement type: