[RFC] meson: replace GNU Make-based build system with Meson#150
[RFC] meson: replace GNU Make-based build system with Meson#150igoropaniuk wants to merge 2 commits intolinux-msm:masterfrom
Conversation
335f648 to
bfe3ebe
Compare
bfe3ebe to
78a6c6e
Compare
|
The changes require some refinement, as I haven't added the checkpatch target yet. Additionally, I need to address an issue with the VERSION option in older versions of Meson (UPDATE: FIXED, old versions of meson require options to be listed in the file The motivation for this change was a @lumag suggestion in #148 @lumag @andersson FYI |
ece3d85 to
5dacf18
Compare
|
Should I just keep a minimal Makefile wrapper for all these meson commands, so users accustomed to the make command can continue using it? |
7a19347 to
ef74bd4
Compare
No need to |
|
Windows build also fails when running in CI; however, it works on my local PC. I probably need more time to investigate and experiment with the CI pipelines here (UPDATE: FIXED) |
10c9107 to
65e4b92
Compare
|
@lumag all issues are fixed, added checkpatch targets |
6f9925d to
57ec45a
Compare
|
Why? What problem does switching to meson solve? |
|
@andersson The motivation for this change originated from another PR, #148, and suggestions there to explore better solutions like Meson |
57ec45a to
a069a7d
Compare
|
Also makes it possible to easily build a static qdl with |
|
I suppose the proposed cleanup of build output, provided by #148, was nice. I don't see the benefit of building debug and release builds in that fashion. I presume meson would handle that better for us - without having "make all" build the project twice. But I'm not convinced about the benefits. Perhaps I just don't know the capabilities of meson well enough? But are we just trading some clutter in the source directory for the addition of two new dependencies? @z3ntu tell me more, when do you use this? Regarding the change itself, it should contain the motivation for the change. It should be possible for someone to look back at this PR, or the git log, and understand why we did choose to completely replace the build system. |
|
@andersson Just some of my observations.:
Given that the project is rapidly growing, meson will help us in future to automate what makes us micromanage |
a069a7d to
50092e0
Compare
|
Rebased onto the latest master |
50092e0 to
0e8c7da
Compare
|
@andersson @lumag If there’s anything else you think should be adjusted or improved, I’m happy to address it - just let me know. |
e5a9ba9 to
33c10c7
Compare
|
Updated PR to include |
9336892 to
06f8e25
Compare
56104b5 to
6624760
Compare
|
@andersson @lumag @z3ntu @konradybcio I've updated PR and added detailed justification for transition to Meson in the context of QDL Let me know what you think |
6624760 to
60915c0
Compare
Replace the existing Makefile-based build system with Meson to improve
build performance, cross-platform support, and maintainability.
Key improvements:
* Build performance: Shared source files (sahara.c, util.c, oscompat.c,
ux.c, sim.c, io.c) are now compiled once and linked into multiple
targets instead of being compiled separately for each executable.
This reduces total compilation units from ~30 to ~20 and speeds up build.
Full build benchmark results below
Before (Make): $ time make
...
real 0m1.668s
user 0m1.424s
sys 0m0.242s
After (Meson): $ time bash -c '
meson setup build
meson compile -C build
'
...
real 0m0.759s
user 0m0.877s
sys 0m0.237s
* Flexible build directory: Unlike Make which builds in-tree, Meson
supports out-of-tree builds with custom build directories.
Example workflows:
meson setup builddir # Default debug build
meson setup build-release --buildtype=release
meson setup build-asan -Db_sanitize=address
meson setup build-arm64 --cross-file=aarch64-linux.txt
This enables:
- Multiple build configurations simultaneously
- Clean source tree (no .o files polluting git status)
- Easy comparison between debug/release builds
- Separate builds for different architectures
* Cross-compilation: Native support for cross-compilation via Meson
cross-files enables building for multiple architectures without
requiring separate build runners for each target platform.
Before (Make): Requires native ARM64 runner in GitHub Actions
runs-on: ubuntu-24.04-arm # Dedicated ARM64 hardware
run: make
After (Meson): Cross-compile from x64 host
runs-on: ubuntu-24.04 # x64 host
run: |
meson setup build-arm64 --cross-file=ci/aarch64-linux.txt
meson compile -C build-arm64
* Automatic dependency tracking: Meson automatically tracks header
dependencies, eliminating the need for manual dependency declarations
and preventing missed recompilation on header changes.
Before (Make): Manual dependency tracking
util.o: version.h # Must be manually maintained
After (Meson): Automatic header scanning
# No manual declarations needed
# Changing qdl.h automatically rebuilds all files that include it
Result: Prevents subtle bugs where changing a header doesn't trigger
necessary recompilation.
* Platform handling: Windows-specific linking (ws2_32) and platform
detection are now handled declaratively without shell conditionals.
* Testing integration: Test suite is now integrated into the build system
with proper dependency tracking and timeout handling.
Before (Make):
make tests # Shells out to bash script
After (Meson):
meson test -C builddir
meson test -C builddir --verbose
meson test -C builddir --wrapper='valgrind --leak-check=full'
Result: Better test output formatting, timeout handling, and ability
to run tests under valgrind or sanitizers.
* Installation: Standard installation paths and packaging support through
Meson's built-in install infrastructure.
Before (Make):
make install prefix=/usr/local DESTDIR=/tmp/package
After (Meson):
meson setup builddir --prefix=/usr/local
DESTDIR=/tmp/package meson install -C builddir
# Correctly installs to:
# - /usr/local/bin/{qdl,qdl-ramdump,ks}
# - /usr/local/share/man/man1/{qdl.1,qdl-ramdump.1,ks.1}
Result: Better integration with distribution packaging (Debian .deb,
RPM) and standard FHS paths.
Migration maintains full feature parity with the existing build system:
- All three executables (qdl, qdl-ramdump, ks) build correctly
- Version string generation from git tags
- Optional man page generation
- Support for Linux, macOS, and Windows (MSYS2/MinGW)
- Recreated tests integration via Meson’s test() function,
including support for script arguments (e.g. --builddir)
Usage:
$ meson setup build
$ meson compile -C build
$ meson test -C build
$ meson compile check -C build
Signed-off-by: Igor Opaniuk <igor.opaniuk@oss.qualcomm.com>
Provide meson instructions instead of GNU-make for building/testing qdl. Signed-off-by: Igor Opaniuk <igor.opaniuk@oss.qualcomm.com>
60915c0 to
a230596
Compare
Replace the existing Makefile-based build system with Meson to improve
build performance, cross-platform support, and maintainability.
Key improvements:
Build performance: Shared source files (sahara.c, util.c, oscompat.c,
ux.c, sim.c, io.c) are now compiled once and linked into multiple
targets instead of being compiled separately for each executable.
This reduces total compilation units from ~30 to ~20 and speeds up build.
Full builds tests benchmark results below
Before (Make):
After (Meson):
Flexible build directory: Unlike Make which builds in-tree, Meson
supports out-of-tree builds with custom build directories.
Example workflows:
This enables:
Cross-compilation: Native support for cross-compilation via Meson
cross-files enables building for multiple architectures without
requiring separate build runners for each target platform.
Before (Make): Requires native ARM64 runner in GitHub Actions
After (Meson): Cross-compile from x64 host
Automatic dependency tracking: Meson automatically tracks header
dependencies, eliminating the need for manual dependency declarations
and preventing missed recompilation on header changes.
Before (Make): Manual dependency tracking
util.o: version.h # Must be manually maintained
After (Meson): Automatic header scanning
No manual declarations needed
Changing qdl.h automatically rebuilds all files that include it
Result: Prevents subtle bugs where changing a header doesn't trigger
necessary recompilation.
Platform handling: Windows-specific linking (ws2_32) and platform
detection are now handled declaratively without shell conditionals.
Testing integration: Test suite is now integrated into the build system
with proper dependency tracking and timeout handling.
Before (Make):
make tests # Shells out to bash scriptAfter (Meson):
Result: Better test output formatting, timeout handling, and ability
to run tests under valgrind or sanitizers.
Installation: Standard installation paths and packaging support through
Meson's built-in install infrastructure.
Before (Make):
make install prefix=/usr/local DESTDIR=/tmp/packageAfter (Meson):
Result: Better integration with distribution packaging (Debian .deb,
RPM) and standard FHS paths.
Migration maintains full feature parity with the existing build system:
including support for script arguments (e.g. --builddir)
Usage: