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