mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
8ff48201ca
This change takes an entirely new approach to the incremental linking of pkzip executables. The assets created by zipobj.com are now treated like debug data. After a .com.dbg is compiled, fixupobj.com should be run, so it can apply fixups to the offsets and move the zip directory to the end of the file. Since debug data doesn't get objcopy'd, a new tool has been introduced called zipcopy.com which should be run after objcopy whenever a .com file is created. This is all automated by the `cosmocc` toolchain which is rapidly becoming the new recommended approach. This change also introduces the new C23 checked arithmetic macros.
151 lines
4.3 KiB
Bash
Executable file
151 lines
4.3 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# cosmopolitan c compiler
|
|
#
|
|
# we assume you run the following beforehand
|
|
#
|
|
# sudo chmod 1777 /opt
|
|
# cd /opt
|
|
# git clone https://github.com/jart/cosmopolitan cosmo
|
|
# cd cosmo
|
|
# make -j
|
|
#
|
|
# you can then use it to build open source projects, e.g.
|
|
#
|
|
# export CC=cosmocc
|
|
# export CXX=cosmoc++
|
|
# export LD=cosmoc++
|
|
# ./configure --prefix=/opt/cosmos
|
|
# make -j
|
|
# make install
|
|
#
|
|
|
|
MODE=${MODE:-$m}
|
|
COSMO=${COSMO:-/opt/cosmo}
|
|
COSMOS=${COSMOS:-/opt/cosmos}
|
|
|
|
if [ "$1" = "--version" ]; then
|
|
cat <<'EOF'
|
|
x86_64-unknown-cosmo-gcc (GCC) 11.2.0
|
|
Copyright (C) 2019 Free Software Foundation, Inc.
|
|
This is free software; see the source for copying conditions. There is NO
|
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
EOF
|
|
exit 0
|
|
fi
|
|
|
|
PLATFORM="-D__COSMOPOLITAN__"
|
|
PREDEF="-include libc/integral/normalize.inc"
|
|
CCFLAGS="-g -fdata-sections -ffunction-sections -fno-pie -mno-tls-direct-seg-refs -mno-red-zone -fportcosmo"
|
|
CFLAGS=
|
|
CPPFLAGS="-DNDEBUG -nostdinc -iquote /opt/cosmo -isystem $COSMOS/include -isystem $COSMO/libc/isystem"
|
|
LDFLAGS="-static -no-pie -nostdlib -fuse-ld=bfd -Wl,-melf_x86_64 -Wl,--gc-sections -L$COSMOS/lib -Wl,-T,$COSMO/o/$MODE/ape/public/ape.lds $COSMO/o/$MODE/ape/ape-no-modify-self.o $COSMO/o/$MODE/libc/crt/crt.o"
|
|
LDLIBS="$COSMO/o/$MODE/cosmopolitan.a"
|
|
|
|
CC="$COSMO/o/$MODE/third_party/gcc/bin/x86_64-linux-musl-gcc"
|
|
OBJCOPY="$COSMO/o/$MODE/third_party/gcc/bin/x86_64-linux-musl-objcopy"
|
|
FIXUPOBJ="$COSMO/o/$MODE/tool/build/fixupobj.com"
|
|
ZIPCOPY="$COSMO/o/$MODE/tool/build/zipcopy.com"
|
|
|
|
if [ ! -d "$COSMO" ]; then
|
|
echo "you need to checkout cosmopolitan to your $COSMO directory" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -d "$COSMOS" ]; then
|
|
echo "you need to create your $COSMOS directory" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# auto-install some shell libraries
|
|
if [ ! -d "$COSMOS/lib" ]; then
|
|
mkdir "$COSMOS/lib"
|
|
for lib in c dl gcc_s m pthread resolv rt z stdc++; do
|
|
printf '\041\074\141\162\143\150\076\012' >"$COSMOS/lib/lib$lib.a"
|
|
done
|
|
fi
|
|
|
|
OPT=
|
|
FIRST=1
|
|
OUTPUT=
|
|
INTENT=ld
|
|
NEED_OUTPUT=
|
|
FRAME=-fno-omit-frame-pointer
|
|
for x; do
|
|
if [ $FIRST -eq 1 ]; then
|
|
set --
|
|
FIRST=0
|
|
fi
|
|
if [ x"$x" = x"-Werror" ]; then
|
|
# this toolchain is intended for building other people's code
|
|
# elevating warnings into errors, should only be done by devs
|
|
continue
|
|
elif [ x"$x" = x"-pedantic" ]; then
|
|
# this toolchain is intended for building other people's code
|
|
# we don't need the compiler's assistance to be more portable
|
|
continue
|
|
elif [ x"$x" != x"${x#-O}" ]; then
|
|
OPT=$x
|
|
elif [ x"$x" = x"-c" ]; then
|
|
INTENT=cc
|
|
elif [ x"$x" = x"-E" ]; then
|
|
INTENT=cpp
|
|
elif [ x"$x" = x"-o" ]; then
|
|
NEED_OUTPUT=1
|
|
elif [ x"$x" != x"${x#-o}" ]; then
|
|
OUTPUT=${x#-o}
|
|
elif [ -n "$NEED_OUTPUT" ]; then
|
|
NEED_OUTPUT=
|
|
OUTPUT=$x
|
|
elif [ x"$x" = x"-fpic" ]; then
|
|
continue
|
|
elif [ x"$x" = x"-fPIC" ]; then
|
|
continue
|
|
elif [ x"$x" = x"-shared" ]; then
|
|
echo "error: cosmocc -shared isn't supported" >&2
|
|
exit 1
|
|
elif [ x"$x" = x"-fomit-frame-pointer" ] || [ x"$x" = x"-fno-omit-frame-pointer" ]; then
|
|
FRAME=$x
|
|
continue
|
|
fi
|
|
set -- "$@" "$x"
|
|
done
|
|
|
|
if [ x"$OPT" != x"-Os" ] && [ x"$MODE" != x"tiny" ]; then
|
|
# support --ftrace unless optimizing for size
|
|
CFLAGS="$CFLAGS -fpatchable-function-entry=18,16"
|
|
fi
|
|
|
|
if [ $INTENT = cpp ]; then
|
|
set -- $PLATFORM $CCFLAGS $CPPFLAGS "$@"
|
|
elif [ $INTENT = cc ]; then
|
|
set -- $PLATFORM $PREDEF $CCFLAGS $CFLAGS $CPPFLAGS "$@" $FRAME
|
|
else
|
|
set -- $PLATFORM $PREDEF $LDFLAGS $CFLAGS $CPPFLAGS "$@" $LDLIBS -Wl,-z,common-page-size=65536 -Wl,-z,max-page-size=65536 $FRAME
|
|
fi
|
|
|
|
set -- "$CC" "$@"
|
|
printf '(cd %s; %s)\n' "$PWD" "$*" >>/tmp/build.log
|
|
"$@" || exit
|
|
|
|
if [ $INTENT = cc ] && [ -n "$OUTPUT" ]; then
|
|
"$FIXUPOBJ" "$OUTPUT" || exit
|
|
elif [ $INTENT = ld ] && [ -n "$OUTPUT" ]; then
|
|
if [ x"$OUTPUT" != x"${OUTPUT%.com}" ] ||
|
|
[ x"$OUTPUT" != x"${OUTPUT%.exe}" ]; then
|
|
# cosmocc -o foo.com ...
|
|
# -> foo.com (ape)
|
|
# -> foo.com.dbg (elf)
|
|
mv -f "$OUTPUT" "$OUTPUT.dbg" || exit
|
|
"$OBJCOPY" -S -O binary "$OUTPUT.dbg" "$OUTPUT" || exit
|
|
"$ZIPCOPY" "$OUTPUT.dbg" "$OUTPUT" || exit
|
|
else
|
|
# cosmocc -o foo ...
|
|
# -> foo (elf)
|
|
# -> foo.com (ape)
|
|
# -> foo.com.dbg (elf)
|
|
cp -f "$OUTPUT" "$OUTPUT.com.dbg" || exit
|
|
"$OBJCOPY" -S -O binary "$OUTPUT" "$OUTPUT.com" || exit
|
|
"$ZIPCOPY" "$OUTPUT" "$OUTPUT.com" || exit
|
|
fi
|
|
fi
|