-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild-make.bash
More file actions
executable file
·200 lines (180 loc) · 8.83 KB
/
build-make.bash
File metadata and controls
executable file
·200 lines (180 loc) · 8.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#!/usr/bin/env bash
# reactive-firewall/build-make.sh - simple cross/build script for NullForge's Make
# ..................................
# Copyright (c) 2025, Mr. Walls
# ..................................
# Licensed under APACHE-2 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# ..........................................
# https://github.com/reactive-firewall/NullForge?tab=Apache-2.0-1-ov-file
# ..........................................
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Disclaimer of Warranties.
# A. YOU EXPRESSLY ACKNOWLEDGE AND AGREE THAT, TO THE EXTENT PERMITTED BY
# APPLICABLE LAW, USE OF THIS SHELL SCRIPT AND ANY SERVICES PERFORMED
# BY OR ACCESSED THROUGH THIS SHELL SCRIPT IS AT YOUR SOLE RISK AND
# THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND
# EFFORT IS WITH YOU.
#
# B. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SHELL SCRIPT
# AND SERVICES ARE PROVIDED "AS IS" AND "AS AVAILABLE", WITH ALL FAULTS AND
# WITHOUT WARRANTY OF ANY KIND, AND THE AUTHOR OF THIS SHELL SCRIPT'S LICENSORS
# (COLLECTIVELY REFERRED TO AS "THE AUTHOR" FOR THE PURPOSES OF THIS DISCLAIMER)
# HEREBY DISCLAIM ALL WARRANTIES AND CONDITIONS WITH RESPECT TO THIS SHELL SCRIPT
# SOFTWARE AND SERVICES, EITHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
# NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF
# MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE,
# ACCURACY, QUIET ENJOYMENT, AND NON-INFRINGEMENT OF THIRD PARTY RIGHTS.
#
# C. THE AUTHOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE
# THE AUTHOR's SOFTWARE AND SERVICES, THAT THE FUNCTIONS CONTAINED IN, OR
# SERVICES PERFORMED OR PROVIDED BY, THIS SHELL SCRIPT WILL MEET YOUR
# REQUIREMENTS, THAT THE OPERATION OF THIS SHELL SCRIPT OR SERVICES WILL
# BE UNINTERRUPTED OR ERROR-FREE, THAT ANY SERVICES WILL CONTINUE TO BE MADE
# AVAILABLE, THAT THIS SHELL SCRIPT OR SERVICES WILL BE COMPATIBLE OR
# WORK WITH ANY THIRD PARTY SOFTWARE, APPLICATIONS OR THIRD PARTY SERVICES,
# OR THAT DEFECTS IN THIS SHELL SCRIPT OR SERVICES WILL BE CORRECTED.
# INSTALLATION OF THIS THE AUTHOR SOFTWARE MAY AFFECT THE USABILITY OF THIRD
# PARTY SOFTWARE, APPLICATIONS OR THIRD PARTY SERVICES.
#
# D. YOU FURTHER ACKNOWLEDGE THAT THIS SHELL SCRIPT AND SERVICES ARE NOT
# INTENDED OR SUITABLE FOR USE IN SITUATIONS OR ENVIRONMENTS WHERE THE FAILURE
# OR TIME DELAYS OF, OR ERRORS OR INACCURACIES IN, THE CONTENT, DATA OR
# INFORMATION PROVIDED BY THIS SHELL SCRIPT OR SERVICES COULD LEAD TO
# DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE,
# INCLUDING WITHOUT LIMITATION THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
# NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, LIFE SUPPORT OR
# WEAPONS SYSTEMS.
#
# E. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY THE AUTHOR
# SHALL CREATE A WARRANTY. SHOULD THIS SHELL SCRIPT OR SERVICES PROVE DEFECTIVE,
# YOU ASSUME THE ENTIRE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
#
# Limitation of Liability.
# F. TO THE EXTENT NOT PROHIBITED BY APPLICABLE LAW, IN NO EVENT SHALL THE AUTHOR
# BE LIABLE FOR PERSONAL INJURY, OR ANY INCIDENTAL, SPECIAL, INDIRECT OR
# CONSEQUENTIAL DAMAGES WHATSOEVER, INCLUDING, WITHOUT LIMITATION, DAMAGES
# FOR LOSS OF PROFITS, CORRUPTION OR LOSS OF DATA, FAILURE TO TRANSMIT OR
# RECEIVE ANY DATA OR INFORMATION, BUSINESS INTERRUPTION OR ANY OTHER
# COMMERCIAL DAMAGES OR LOSSES, ARISING OUT OF OR RELATED TO YOUR USE OR
# INABILITY TO USE THIS SHELL SCRIPT OR SERVICES OR ANY THIRD PARTY
# SOFTWARE OR APPLICATIONS IN CONJUNCTION WITH THIS SHELL SCRIPT OR
# SERVICES, HOWEVER CAUSED, REGARDLESS OF THE THEORY OF LIABILITY (CONTRACT,
# TORT OR OTHERWISE) AND EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION
# OR LIMITATION OF LIABILITY FOR PERSONAL INJURY, OR OF INCIDENTAL OR
# CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event
# shall THE AUTHOR's total liability to you for all damages (other than as may
# be required by applicable law in cases involving personal injury) exceed
# the amount of five dollars ($5.00). The foregoing limitations will apply
# even if the above stated remedy fails of its essential purpose.
################################################################################
# PATH=${PATH:-"/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"} ;
# hermetic build/install for NullForge make0 (no mktemp)
# Usage: ./build-make0.sh [CC] [CFLAGS] [DESTDIR]
set -euo pipefail
# --- Configuration / defaults ---
CC_ARG="${1:-}"
CFLAGS_ARG="${2:-}"
DESTDIR_ARG="${3:-}"
# Tools (can be overridden via environment)
: "${CC:=${CC_ARG:-clang}}"
: "${AR:=ar}"
: "${STRIP:=strip}"
# Build flags (can be overridden by env)
: "${CFLAGS:=${CFLAGS_ARG:--O2 -ffunction-sections -fdata-sections -fPIC -Wall -Wextra -Werror}}"
: "${LDFLAGS:=}"
# Paths (internal)
SRCDIR="Make"
SRC="${SRCDIR}/make0.c"
HDR="${SRCDIR}/make0.h"
PREFIX="/usr/bin"
BINNAME="make"
# DESTDIR safety: default to ./out if not provided
DESTDIR="${DESTDIR_ARG:-./out}"
# Normalize DESTDIR to an absolute path to avoid surprises
DESTDIR="$(cd "$(dirname "$DESTDIR")" && mkdir -p "$(basename "$DESTDIR")" && cd "$(pwd)/$(basename "$DESTDIR")" >/dev/null 2>&1 || true; printf '%s' "$(pwd)" )"
# Internal layout under DESTDIR
OBJDIR="${DESTDIR}/obj"
BINDIR="${DESTDIR}/bin"
INCLUDEDIR="${DESTDIR}/include"
OUT_BIN_PATH="${DESTDIR}${PREFIX}/${BINNAME}"
TMPOBJ="${OBJDIR}/${BINNAME}.o"
STAGED_BIN="${DESTDIR}${PREFIX}/${BINNAME}"
# --- Helpers ---
err() { printf 'ERROR: %s\n' "$*" >&2; exit 1; }
warn() { printf 'Warning: %s\n' "$*" >&2; }
command_exists() { command -v "$1" >/dev/null 2>&1; }
# Require exact interpreter location
# command -v /stage0/bin/bash >/dev/null 2>&1 || err "Require /stage0/bin/bash as interpreter"
# Validate compiler presence (warn but continue so environment can provide)
if ! command_exists "$CC"; then
warn "compiler '$CC' not found in PATH; build will likely fail"
fi
# Prevent accidental destructive rm -rf on unusual DESTDIR: only allow if DESTDIR is under current dir or explicit './' used
case "$DESTDIR" in
/*) ;; # absolute allowed (already normalized)
./*) ;; # explicit relative allowed
*) ;;
esac
# Create deterministic dirs (safe removal only within DESTDIR)
if [ -d "$DESTDIR" ] && [ -n "${DESTDIR_ARG:-}" ]; then
# If user explicitly provided DESTDIR, remove previous contents to ensure hermetic build
rm -rf -- "$DESTDIR"
fi
mkdir -p -- "$OBJDIR" "$BINDIR" "$INCLUDEDIR"
# Copy header if present (optional)
if [ -f "$HDR" ]; then
cp -- "$HDR" "$INCLUDEDIR/" || err "failed copying header"
fi
# Source check
[ -f "$SRC" ] || err "source $SRC not found"
# Compile: explicit include path ensures hermetic headers
printf 'Compiling %s -> %s\n' "$SRC" "$TMPOBJ"
# Split flags safely
# shellcheck disable=SC2086
$CC $CFLAGS -I"$INCLUDEDIR" -c -o "$TMPOBJ" "$SRC" || err "compilation failed"
# Link: attempt static then fallback to dynamic; keep hermetic LDFLAGS if provided
printf 'Linking -> %s\n' "${BINDIR}/${BINNAME}"
mkdir -p -- "$BINDIR"
# Try static link first
set +e
# shellcheck disable=SC2086
$CC $TMPOBJ -o "${BINDIR}/${BINNAME}" -static $LDFLAGS
link_status=$?
set -e
if [ "$link_status" -ne 0 ]; then
printf 'Static link failed (status %d), retrying dynamic link...\n' "$link_status"
# shellcheck disable=SC2086
$CC $TMPOBJ -o "${BINDIR}/${BINNAME}" $LDFLAGS || err "link failed"
fi
# Optionally strip if available
if command_exists "$STRIP"; then
printf 'Stripping binary...\n'
if ! "$STRIP" "${BINDIR}/${BINNAME}" >/dev/null 2>&1; then
warn "strip failed; continuing"
fi
fi
# Stage install into DESTDIR + PREFIX
mkdir -p -- "$(dirname "$OUT_BIN_PATH")"
mv -- "${BINDIR}/${BINNAME}" "$OUT_BIN_PATH" || err "install move failed"
chmod 0755 "$OUT_BIN_PATH"
# Verification: run binary with -q or --help if they exist, but do not modify host PATH.
printf 'Verifying built make...\n'
# Try -q then --help; ignore non-zero from the binary, only check it executes
if "$OUT_BIN_PATH" -q >/dev/null 2>&1; then
printf 'Verification: OK (accepted -q)\n'
elif "$OUT_BIN_PATH" --help >/dev/null 2>&1; then
printf 'Verification: OK (accepted --help)\n'
else
warn "built binary did not accept -q or --help; installed at $OUT_BIN_PATH"
fi
printf 'Build/install complete.\n'
printf 'Staged install path: %s\n' "$OUT_BIN_PATH"
printf 'To finalize install, copy %s to %s on the target system.\n' "$OUT_BIN_PATH" "${PREFIX}/${BINNAME}"