mrrl

Minimal Reliable Reproducible Linux
git clone https://ccx.te2000.cz/git/mrrl
Log | Files | Refs | Submodules | README

gcc (9910B)


      1 #!/usr/bin/env pthbs-build
      2 #@pragma:nofail_digest
      3 #+musl-cross-make.9be7a57aa0035ff26870115e69056e25445f3a96768a7d81251e7073630aadf9
      4 #+gnu-make.05bfcd168c0d3714ecba9e27d84e02bfd2ef8f754c26c162be357882390451fc
      5 #+busybox.23105cf3c52263661c44f7d855ae5dfc7287f5f8b60d6a026dedee24f4cf7a2e
      6 #+nawk.abe3790fd5e321ccd4e1ab7dab56339222e2eee686bc4b2241e7853104a4a500
      7 #+musl.5aea4f44fd4fe9f9dd7c28a6780840121ba82303179f75a034e07f38ae99e513
      8 #+gmp.d9302a6becadcc9ee59a2089e6051e8cf491292e7510e1d696b9f9996249cb07
      9 #+mpc.eec1bd65a87473631b7d73a013a1fe8006e433d139c33ad9dd40b6f036cd58f6
     10 #+mpfr.cc67b8eb2ce766b7020361756991c10c7febb274822ccb73b7721f45b63c4784
     11 #@sha256:b52435d08802378bcd010b2dbb97641a5bbd6b281d86866b320394a106ac7aa3:merged.patch
     12 #@sha256:c84acd325d75a23a74209cf15a184da7663b7eaa40048f4925ebf028ae3e16f1:esysroot.patch
     13 #@untar:-J:sha256:9c4ce6dbb040568fdc545588ac03c5cbc95a8dbf0c7aa490170843afb59ca8f5:.
     14 
     15 
     16 # - build script start -
     17 
     18 build_env_static() {
     19 	export CFLAGS="-ffile-prefix-map=${pthbs_workdir}=builddir $CFLAGS"
     20 	export CXXFLAGS="-ffile-prefix-map=${pthbs_workdir}=builddir $CXXFLAGS"
     21 	export LDFLAGS="-static -L$pthbs_build_environment/library $LDFLAGS"
     22 }
     23 
     24 check_static() {
     25 	local exe || true
     26 	exe=$pthbs_destdir'/home/ccx/versions'/$pthbs_package/$1
     27 	if ! test -f $exe; then
     28 		printf '%s\n' "Error: file '$1' doesn't exist!"
     29 		exit 1
     30 	fi
     31 	local interp_info || true
     32 	interp_info=$(readelf --string-dump=.interp "$exe") || exit $?
     33 	if test x '!=' "x$interp_info"; then
     34 		printf '%s\n' "Error: '$1' is a dynamic binary!"
     35 		exit 1
     36 	fi
     37 }
     38 
     39 prefix=/home/ccx/versions/$pthbs_package
     40 dest=${pthbs_destdir%/}${prefix}
     41 cd 'gcc-13.4.0'
     42 
     43 patch -p1 <../merged.patch
     44 patch -p1 <../esysroot.patch
     45 
     46 
     47 export TZ=UTC
     48 export SOURCE_DATE_EPOCH=1748000928
     49 
     50 mcm=/home/ccx/versions/musl-cross-make.9be7a57aa0035ff26870115e69056e25445f3a96768a7d81251e7073630aadf9
     51 mcm_bin=$mcm/bin/x86_64-linux-musl
     52 binutils_cmd=/home/ccx/versions/binutils.751d98e35ba1d7c5ed7fab86a3bfcd3ee271aae497cb66f47cec9f7fc92dcae7
     53 musl=/home/ccx/versions/musl.5aea4f44fd4fe9f9dd7c28a6780840121ba82303179f75a034e07f38ae99e513
     54 build_env_static
     55 
     56 sysroot="${pthbs_workdir}/sysroot"
     57 objdir="${pthbs_workdir}/objdir"
     58 installdir="${pthbs_workdir}/install"
     59 src="$(realpath .)"
     60 
     61 with_make_vars_inner() {
     62 	"$@" \
     63 	MULTILIB_OSDIRNAMES= \
     64 	INFO_DEPS= \
     65 	infodir= \
     66 	ac_cv_prog_lex_root=lex.yy \
     67 	MAKEINFO=false
     68 }
     69 
     70 with_make_vars() {
     71 	with_make_vars_inner "$@" \
     72 	MAKE="make $(with_make_vars_inner printf '\t%s"' | sed -Ee 's/\t([^"=]+=)/ \1"/g') "
     73 }
     74 
     75 sed -i.orig -e "s|/lib/ld-musl-|$musl/"'library.so'"/ld-musl-|" ./gcc/config/*/linux*.h
     76 for orig in ./gcc/config/*/linux*.h.orig; do
     77 	diff -u "$orig" "${orig%.orig}" || true
     78 	rm "$orig"
     79 done
     80 
     81 env_lib=${pthbs_build_environment}/'library'
     82 env_dynlib=${pthbs_build_environment}/'library.so'
     83 mkdir -p "$sysroot/lib"
     84 find "$pthbs_build_environment/library" "$pthbs_build_environment/library.so" -type l -print | while IFS= read -r lnk; do
     85 	case $(realpath $lnk) in
     86 		($mcm/*) ;;
     87 		(*)
     88 			ldir=${lnk%/*}
     89 			case $ldir in
     90 				(${env_lib})
     91 					ldir=$sysroot/lib ;;
     92 				(${env_lib}/*)
     93 					ldir=$sysroot/lib/${ldir#${env_lib}/}
     94 					mkdir -p "$ldir"
     95 					;;
     96 				(${env_dynlib})
     97 					ldir=$sysroot/lib ;;
     98 				(${env_dynlib}/*)
     99 					ldir=$sysroot/lib/${ldir#${env_dynlib}/}
    100 					mkdir -p "$ldir"
    101 					;;
    102 				(*) printf 'WARNING: unexpected file: %s\n' "$lnk"
    103 					continue ;;
    104 			esac
    105 			cp -a "$lnk" "$ldir/"
    106 			;;
    107 	esac
    108 done
    109 
    110 mkdir -p "$sysroot/${musl%/*}"
    111 ln -s "$musl" "$sysroot/${musl%/*}"
    112 
    113 mkdir "$objdir"
    114 cd "$objdir"
    115 
    116 st='-static --static'
    117 fl="-g -O0"
    118 repro="-ffile-prefix-map=${installdir}="
    119 repro="$repro -ffile-prefix-map=${sysroot}="
    120 repro="$repro -ffile-prefix-map=${src}=builddir"
    121 
    122 "../${src##*/}/configure" \
    123 	--enable-checking \
    124 	--enable-languages=c,c++  \
    125 	--prefix="/" \
    126 	--bindir="/command" \
    127 	--sbindir="/command" \
    128 	--infodir="/info" \
    129 	--localedir="/locale" \
    130 	--mandir="/man" \
    131 	--libdir="/lib" \
    132 	--libexecdir="/libexec" \
    133 	--docdir="/doc/gcc" \
    134 	--datadir="/data" \
    135 	--datarootdir="/data" \
    136 	--localstatedir='/var/pthbs' \
    137 	--disable-bootstrap \
    138 	--disable-assembly \
    139 	--disable-werror \
    140 	--target=x86_64-linux-musl \
    141 	--build=x86_64-pc-linux-muslxx \
    142 	--host=x86_64-pc-linux-muslxx \
    143 	--disable-multilib \
    144 	--enable-tls \
    145 	--disable-libmudflap \
    146 	--disable-libsanitizer \
    147 	--disable-gnu-indirect-function \
    148 	--disable-libmpx \
    149 	--enable-initfini-array \
    150 	--enable-libstdcxx-time=rt \
    151 	--with-native-system-header-dir="$musl/include" \
    152 	--with-build-time-tools="$pthbs_build_environment/command" \
    153 	--with-sysroot=/ \
    154 	FFLAGS="$fl" \
    155 	LDFLAGS="--static $LDFLAGS" \
    156 	AR_FOR_TARGET="$mcm_bin"-ar \
    157 	AS_FOR_TARGET="$mcm_bin"-as \
    158 	LD_FOR_TARGET="$mcm_bin"-ld \
    159 	NM_FOR_TARGET="$mcm_bin"-nm \
    160 	OBJCOPY_FOR_TARGET="$mcm_bin"-objcopy \
    161 	OBJDUMP_FOR_TARGET="$mcm_bin"-objdump \
    162 	RANLIB_FOR_TARGET="$mcm_bin"-ranlib \
    163 	READELF_FOR_TARGET="$mcm_bin"-readelf \
    164 	STRIP_FOR_TARGET="$mcm_bin"-strip \
    165 	REDACT=FROM-HERE \
    166 	--with-build-sysroot="$sysroot" \
    167 	CFLAGS="-std=gnu17 $fl $st $repro" \
    168 	CXXFLAGS="-std=gnu++11 $fl $st $repro" \
    169 
    170 with_make_vars make -j${JOBS:-1} -l$((1+${JOBS:-1})) configure-host
    171 sed -iEe 's/REDACT=FROM-HERE.*";$/# build paths redacted";/' gcc/configargs.h
    172 for tgt in configure-target all-gcc all-target-libgcc; do
    173 	with_make_vars make -j${JOBS:-1} -l$((1+${JOBS:-1})) "$tgt"
    174 done
    175 
    176 with_make_vars make -j${JOBS:-1} -l$((1+${JOBS:-1}))
    177 with_make_vars make "DESTDIR=$dest" install
    178 
    179 cd "$pthbs_workdir"
    180 
    181 mkdir -p "$dest"/'library.so' "$dest"/'library'
    182 
    183 dynlib_to_top="$(printf "%s\n" 'library.so' | sed -Ee "s!^\./!!; s![^/]+!..!g")"
    184 lib_to_top="$(printf "%s\n" 'library' | sed -Ee "s!^\./!!; s![^/]+!..!g")"
    185 
    186 printf >>link_to_dynlib '%s\n' 'ln -s "'$dynlib_to_top'${1#.}" ''library.so'/
    187 printf >>link_to_lib '%s\n' 'ln -s "'$lib_to_top'${1#.}" ''library'/
    188 
    189 ( cd "$dest" && find "./lib" "./x86_64-linux-musl" \
    190 	\( -type f -o -type l \) \( -name '*.so' -o -name '*.so.*' \) \
    191 	-exec sh -xe "$pthbs_workdir/link_to_dynlib" '{}' ';'
    192 )
    193 
    194 ( cd "$dest" && find "./lib" ./x86_64-linux-musl \
    195 	\( -type f -o -type l \) \( -name '*.o' -o -name '*.a' \) \
    196 	-exec sh -xe "$pthbs_workdir/link_to_lib" '{}' ';'
    197 )
    198 
    199 find "$sysroot/lib" -mindepth 1 -maxdepth 1 -exec mv -v '{}' "$dest/lib/gcc/" \;
    200 
    201 #find "$binutils_cmd" -mindepth 1 -maxdepth 1 -exec ln -s -v '{}' "$dest/lib/gcc/x86_64-linux-musl/" \;
    202 for util in addr2line ar as c++filt elfedit gprof ld ld.bfd nm objcopy objdump ranlib readelf size strings strip; do
    203 	ln -s -v "$binutils_cmd/$util" "$dest/lib/gcc/x86_64-linux-musl/" 
    204 done
    205 
    206 
    207 export ESYSROOT=$pthbs_build_environment
    208 # Validate the C compiler
    209 "$dest"/'command'/x86_64-linux-musl-gcc --version
    210 printf '%s\n' 'int main(void) { return 0; }' >true.c
    211 "$dest"/'command'/x86_64-linux-musl-gcc -o true-dl true.c
    212 "$mcm_bin"-readelf --string-dump=.interp true-dl >true.linker
    213 xxd true.linker
    214 grep -F "  $musl/" true.linker
    215 ./true-dl
    216 
    217 "$dest"/'command'/x86_64-linux-musl-gcc -static -o true-sl true.c
    218 ./true-sl
    219 
    220 # Validate the C++ compiler
    221 "$dest"/'command'/x86_64-linux-musl-g++ --version
    222 printf '%s\n' >sort.cpp '
    223 #include <iostream>
    224 #include <vector>
    225 #include <algorithm>
    226 #include <iterator>
    227 int main() {
    228        using namespace std;
    229        istream_iterator<int> first(cin);
    230        istream_iterator<int> last;
    231        vector<int> vec(first, last);
    232        sort(vec.begin(), vec.end());
    233        cout << "Sorted:" << endl;
    234        copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, "\n"));
    235        return 0;
    236 }
    237 '
    238 printf '%s\n' >sort.input 5 3 1 2 4
    239 printf '%s\n' >sort.expected Sorted: 1 2 3 4 5
    240 "$dest"/'command'/x86_64-linux-musl-g++ -o sort-dl sort.cpp
    241 "$mcm_bin"-readelf --string-dump=.interp sort-dl >sort.linker
    242 xxd sort.linker
    243 grep -F "  $musl/" sort.linker
    244 env LD_LIBRARY_PATH="$dest"/'library.so' ./sort-dl <sort.input >sort-dl.out
    245 cmp sort-dl.out sort.expected
    246 
    247 "$dest"/'command'/x86_64-linux-musl-g++ -static -o sort-sl sort.cpp
    248 ./sort-sl <sort.input >sort-sl.out
    249 cmp sort-sl.out sort.expected
    250 
    251 if which dejagnu 2>/dev/null; then
    252 	make -j${JOBS:-1} -l$((1+${JOBS:-1})) -C ../obj_sysroot -k check-gcc
    253 	mkdir "$dest/test-results"
    254 	find ../obj_sysroot -name '*.sum' \
    255 		-exec mv -v '{}' "$dest/test-results/" \;
    256 fi
    257 
    258 cd "$pthbs_destdir/home/ccx/versions/$pthbs_package"
    259 find -type d -o -print | awk -F/ '
    260 BEGIN {
    261 	x["./command/x86_64-linux-musl-g++"]=1
    262 	x["./command/x86_64-linux-musl-gcc"]=1
    263 }
    264 
    265 function r1(s) {
    266 	sub("^[.]/[^/]*", ".", s)
    267 	return s
    268 }
    269 function s1(repl, s) {
    270 	sub("^[.]/[^/]*", "./"repl, s)
    271 	return s
    272 }
    273 function link(src) {
    274 	x[$0]=0
    275 	printf "%s\t%s\n", $0, src
    276 	printf "genlinks >>%s\t%s<<\n", $0, src >>"/dev/stderr"
    277 }
    278 $1!="."{exit 1}
    279 $2 == "command" && $3 ~ /^x86_64-linux-musl-/ { target=$3; sub("x86_64-linux-musl-", "", target); link("./command/" target) }
    280 
    281 $2 == "env" { link($0); next }
    282 $2 == ".env-template" { link($0); next }
    283 
    284 $2 == "command" { link($0); next }
    285 $2 == "command" { link($0); next }
    286 $2 == "bin" { link(s1("command", $0)); next }
    287 $2 == "sbin" { link(s1("command", $0)); next }
    288 
    289 $2 == "library.so" { link($0); next }
    290 $2 == "library" { link($0); next }
    291 $2 == "lib" && $NF ~ /\.l?a$/ { link(s1("library", $0)); next }
    292 $2 == "lib" && $NF ~ /\.so(\..*)?$/ { link(s1("library.so", $0)); next }
    293 
    294 $2 == "share" && $3 == "info" { link(s1("info", r1($0))); next }
    295 $2 == "share" && $3 == "man" { link(s1("man", r1($0))); next }
    296 $2 == "share" && $3 == "doc" { link(s1("doc", r1($0))); next }
    297 
    298 $2 == "config" { link($0); next }
    299 $2 == "man" { link($0); next }
    300 $2 == "info" { link($0); next }
    301 $2 == "doc" { link($0); next }
    302 $2 == "data" { link($0); next }
    303 $2 == "include" { link($0); next }
    304 
    305 
    306 { printf "genlinks ##%s## skipped\n", $0 >>"/dev/stderr" }
    307 
    308 END {
    309 	for(fname in x) { printf "DEBUG: x[\"%s\"]=\"%s\"\n", fname, x[fname] >"/dev/stderr" }
    310 	retcode = 0
    311 	for(fname in x) {
    312 		if(x[fname]) {
    313 			printf "ERROR: missing expected file \"%s\"\n", fname >"/dev/stderr"
    314 			retcode = 3
    315 		}
    316 	}
    317 	exit retcode
    318 }' >.install-links.new
    319 mv .install-links.new .install-links
    320