Skip to content

replace build_bench_env.sh with a Makefile - #243

Open
derSteFfi wants to merge 22 commits into
daanx:masterfrom
derSteFfi:build_with_makefile
Open

derSteFfi wants to merge 22 commits into
daanx:masterfrom
derSteFfi:build_with_makefile

Conversation

@derSteFfi

@derSteFfi derSteFfi commented Aug 7, 2025 •

Copy link
Copy Markdown
Contributor

pushing this draft as a starter to get your opinions - I'll be on vacation the next weeks and won't be working on it anyway. There are a few open tasks, but the general vibe should already come across. Feedback very welcome.

Decisions made:

  • VERSIONS: demand versions instead of reporting them in the end
  • switched from git cloning to grabbing a snapshot of the reqeuested version from github
  • dh: move build directory (dh/src/build -> dh/build)
  • lua: moved to extern benchmarks because it is built in extern/
  • benchmarks: if something is updated, CMakeLists.txt needs to be touched (or replaced with a Makefile longterm)
  • sm: instead of default target, switched to building supermalloc only
  • linux: updated version to LTS series
  • lean: switched to smaller build target

TODO

  • put archives in extra storage after versionizing them (see here) docker caches these already
  • adapt CI-scripts to use Makefile
  • package installation
    • document in README: bazel5 missing, rest is done
    • move to CI instead of build_bench_env.sh
  • bench.sh needs to be adapted in the way it finds 'installed allocators' -- fixed in Detect allocators present and functional #247

open Questions:

  1. partial_checkout
    1. scudo
    2. lp Also, github does not serve archives on that repo. Re-add when solved.
  2. pa: re-add, but smaller? (see here), but: Add partitionalloc #184
  3. sed patches in Makefile: port to proper patch? at least gd, hd, rp are patched with sed right now, we could port that to a patch

@derSteFfi derSteFfi changed the title replace build_bench_env.sh with a Makefile Draft: replace build_bench_env.sh with a Makefile Aug 7, 2025
@derSteFfi
derSteFfi marked this pull request as draft August 7, 2025 13:35
@derSteFfi

Copy link
Copy Markdown
Contributor Author

one ToDo I forgot in notes: tar can exclude files from extraction. The current shell-script does delete a few folders in a few repositories - we could modify the tar call to not extract them in the first place.

@derSteFfi
derSteFfi force-pushed the build_with_makefile branch 2 times, most recently from 1f4928c to ffbdf87 Compare September 25, 2025 14:34
@derSteFfi

Copy link
Copy Markdown
Contributor Author

the remaining CI failures are not specific to the Makefile but actual problems, so marking this ready.

@derSteFfi
derSteFfi marked this pull request as ready for review October 7, 2025 13:01
Comment thread Dockerfile Resolved
Comment thread Makefile Resolved
Comment thread Makefile Resolved
Comment thread Makefile Resolved
@jvoisin
jvoisin requested review from Copilot, daanx and mjp41 October 7, 2025 14:10

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR replaces the build_bench_env.sh script with a Makefile-based build system to improve consistency and maintainability. The change switches from git cloning to downloading versioned archives from GitHub and centralizes version management.

Key changes:

  • Replace shell script with comprehensive Makefile for building allocators and benchmarks
  • Introduce VERSIONS file to centralize version management across all components
  • Move package installation documentation from script to README with per-distribution instructions

Reviewed Changes

Copilot reviewed 7 out of 8 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
build-bench-env.sh Add python-six dependency for ArchLinux package installation
bench.sh Update library paths and remove hardcoded version variables
VERSIONS New file defining versions and sources for all allocators and benchmarks
README.md Replace build script documentation with Makefile usage and detailed dependency lists
Makefile New comprehensive build system with targets for all allocators and benchmarks
Dockerfile Update to use Makefile instead of build script and add package installations
.github/workflows/all.yml Remove Fedora exclusion from CI matrix

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment thread build-bench-env.sh Resolved
Comment thread Makefile Resolved
Comment thread README.md Resolved

@mjp41 mjp41 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is looking pretty tidy. Thanks for working on this.

Comment thread Makefile Resolved
Comment thread Makefile Resolved
Comment thread Makefile Resolved
Comment thread Makefile Resolved
Comment thread Makefile Resolved
Comment thread VERSIONS Resolved
Comment thread Makefile Resolved
Comment thread Makefile Resolved

@mjp41 mjp41 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks for the changes.

@jvoisin, @derSteFfi I don't want to hold these changes holding off on fixing issues for individual allocators/platforms. But I really like to only have a Green CI. Thoughts?

Comment thread Makefile Resolved
Comment thread Makefile Resolved
Comment thread Makefile Resolved
@derSteFfi

Copy link
Copy Markdown
Contributor Author

Absolutely agree. I still have at least scudo and lp on my list and will re-check all comments here afterwards. With that fixed, I would also be pro-merging to make it easier to hunt individual bugs. The branch-switching sometimes takes time, and we would have a clear stand - fixing individual things is much easier than to always have to model the whole process.

@derSteFfi
derSteFfi force-pushed the build_with_makefile branch from 0266c64 to 2d0082e Compare October 13, 2025 13:22
@derSteFfi

Copy link
Copy Markdown
Contributor Author

@jvoisin the MR is up-to-date with master - what do you think about merging?

@jvoisin

jvoisin commented Apr 7, 2026

Copy link
Copy Markdown
Collaborator

~All the tests are failing :/

@derSteFfi

Copy link
Copy Markdown
Contributor Author

sorry, missed a reference to build-bench-env.sh. Should be fixed.

@jvoisin

jvoisin commented Apr 7, 2026

Copy link
Copy Markdown
Collaborator

There are still a bunch of failures it seems

@derSteFfi

Copy link
Copy Markdown
Contributor Author

these are the same we have on master, except that fedora is deactivated in the CI on master (don't remember why). alpine base container and ubuntu/tcg fail with master, too.

@jvoisin

jvoisin commented Apr 7, 2026

Copy link
Copy Markdown
Collaborator

Then it does look good to me. I'll let @daanx hit the merge button as it's his project :)

@derSteFfi
derSteFfi force-pushed the build_with_makefile branch from d0028ed to 90a3c8a Compare July 9, 2026 10:11
@derSteFfi

Copy link
Copy Markdown
Contributor Author

re-synced with master. Also added rmalloc and fixed sc. Would love to not have to resolve merge conflicts like these every few months...

@derSteFfi derSteFfi changed the title Draft: replace build_bench_env.sh with a Makefile replace build_bench_env.sh with a Makefile Jul 9, 2026
@derSteFfi

Copy link
Copy Markdown
Contributor Author

I missed a few bumps in the merge, should be synchronized now.

@derSteFfi
derSteFfi force-pushed the build_with_makefile branch from bc691e3 to c976d1a Compare October 26, 2026 09:39
@derSteFfi

Copy link
Copy Markdown
Contributor Author

rebased onto master, added support for versioned archives.

@jvoisin

jvoisin commented Nov 1, 2026

Copy link
Copy Markdown
Collaborator

@daanx friendly ping on this :)

@derSteFfi
derSteFfi force-pushed the build_with_makefile branch from 9b1b4a3 to 924f37b Compare November 2, 2026 09:44
@derSteFfi

Copy link
Copy Markdown
Contributor Author

re-based again.

@derSteFfi
derSteFfi force-pushed the build_with_makefile branch from 924f37b to 8e6c358 Compare November 5, 2026 11:02
@derSteFfi

Copy link
Copy Markdown
Contributor Author

I've rebased the MR again and included the first fix (8e6c358): ruby was missing on alpine in both the README as well as the Dockerfile. In the README, it was missing for ArchLinux, too.

Problem is: I don't want to fix things in the old shell script, but also do not want to pollute this MR. Fixes that do not touch the building of the suite are trivial, but everything that touches build-bench-env.sh is complicated. Shall I:

  1. include fixes here
  2. wait with fixes until this beast is merged
  3. or put up MRs against this branch somehow? Not sure how well one could review those...

Let me know :)

@derSteFfi
derSteFfi force-pushed the build_with_makefile branch from cbc53bc to e97e0ef Compare November 5, 2026 15:10
@derSteFfi derSteFfi mentioned this pull request Nov 5, 2026
The build was a ~970-line bash script that re-did work on every run and
had to be kept in sync with bench.sh by hand. Replace it with a Makefile
plus a VERSIONS file (one line per project: name, version, commit, url)
that builds each allocator and benchmark as an unpack/configure/build
stamp chain: incremental, parallel via -j, dependency-aware, and usable
for a single allocator (`make je`) as well as everything (`make all`).

Adapt bench.sh to the new layout: allocator and benchmark directories
lose their version suffixes, the working-directory check no longer
references the deleted script, and the rpmalloc, diehard, and mesh
library paths follow the new build outputs. Version pins move from
bench.sh into VERSIONS.
Install the dependencies the new build needs: rust/cargo for smalloc,
bazel via the official package repository (the way build-bench-env.sh
did) for the mesh/nomesh/tcg targets, and the rocksdb/lua/redis build
deps. Pin base images (fedora:44, alpine:3.24, ubuntu:24.04) so builds
reproduce. Adjust the platform workflow's known-failure notes
accordingly (tcg's bazel target is gone upstream; alpine no longer
gets a special bazel case).
Replace the build-bench-env.sh usage sections with make targets
(allocs, benchmarks, individual allocators, -j behaviour), move the
per-distribution package lists to match the Dockerfile, and mention
VERSIONS as the single place to bump allocator versions.
Download each project into archives/<name>-<label>.tar.gz, where the
label is the version tag or a short sha, and unpack from there into
extern/<name>. The version is now visible on disk, and each unpack
stamp records "<label> <sha>": the pin the build tree was made from.

Version bumps were invisible to make before: with unversioned archive
names and empty stamps, an existing extern/<name> tree was never
refreshed after VERSIONS moved. Freshness is now keyed by the pin: the
archive target is named after the pinned version, so editing a pin
gives the project a new prerequisite and make re-fetches, re-unpacks,
and rebuilds exactly that project, while everything else stays put.
The archive targets are declared explicitly (static pattern rules) to
keep make from treating them as intermediate files it may silently
skip or delete.

lp and scudo unpack by sparse git clone instead of using an archive.
Pins are full shas now, and git clone -b only accepts branch names, so
fetch the sha explicitly and check it out detached; a marker file
named after their pin, archives/<name>-<label>.clone, triggers their
re-clone and nothing else. Add a clean-archives target that sweeps
stale archives and markers but keeps the pinned ones, and in the
README point at VERSIONS instead of build-bench-env.sh for the
versions.
The bazel tcmalloc target is a static library, so bench.sh finds no shared
object to preload and runs the job with an empty allocator list. Add a
linkshared cc_binary for it.
hardened_malloc maps guard pages per allocation and sh6bench keeps tens of
thousands of them alive, so it needs over 140000 mappings; at the default
65530 mprotect fails and malloc returns null although memory is free.
libhoard.cpp does not define them but Heap-Layers' wrapper.cpp calls them, so
libhoard.so has undefined symbols and every c++ test dies at its first sized
delete. Define them as weak defaults, as the mac wrapper does.
The exclusion was for a bazel target error that is gone at the pinned version.
Fedora has no bazel installed and alpine does not compile tcmalloc with clang.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants