amiga-gcc/sdk/install

196 lines
7.8 KiB
Bash
Executable File

#!/bin/bash
export PATH=$PATH:$3/bin
if [ ! -e "sdk/$2.sdk" ]; then
echo "sdk/$2.sdk not found"
exit 1
fi
case $1 in
install)
while IFS='' read -r line || [[ -n "$line" ]]; do
a=(${line//:/ })
case ${a[0]} in
Short | Version | Author | Uploader | Type | Replaces | Architecture)
echo "$line"
;;
Url)
file=$(basename ${a[2]})
if [ "${a[1]}" == "git" ]; then
if [ ! -e "projects/$file" ]; then
pushd projects
git clone https:${a[2]} || (rm -rf $file; exit 1)
popd;
fi
pushd projects/$file
git pull
popd
rsync projects/$file/* build/$2/
else
if [ ! -e "download/$file" ]; then
echo wget ${a[1]}:${a[2]} -O download/$file
wget ${a[1]}:${a[2]} -O download/$file || (rm download/$file; exit 1)
fi
if [ ! -e "build/$2" ] || [ "$(ls -l build/$2)" == "total 0" ]; then
mkdir -p build/$2
pushd build/$2
lha x "../../download/$file"
find . -type d -exec chmod +x {} \;
popd
fi
fi
;;
fd2sfd)
fd=${a[1]}
proto=${a[2]}
file=$(basename $fd)
name=${file%???}
mkdir -p $3/m68k-amigaos/lib/sfd/
$3/bin/fd2sfd -o $3/m68k-amigaos/lib/sfd/$name.sfd $3/m68k-amigaos/lib/fd/$fd $3/m68k-amigaos/include/$proto || exit 1
;;
clib)
sfd=${a[1]}
file=$(basename $sfd)
name=${file%????}
mkdir -p $3/m68k-amigaos/include/clib/
$3/bin/sfdc --mode=clib --target=m68k-amigaos --output=$3/m68k-amigaos/include/clib/${name}_protos.h $3/m68k-amigaos/lib/sfd/$sfd || exit 1
;;
sfdc)
sfd=${a[1]}
file=$(basename $sfd)
name=${file%????}
mkdir -p $3/m68k-amigaos/include/proto/
rm $3/m68k-amigaos/include/proto/$name.h
$3/bin/sfdc --mode=proto --target=m68k-amigaos --output=$3/m68k-amigaos/include/proto/$name.h $3/m68k-amigaos/lib/sfd/$sfd || exit 1
sed -i.bak -e 's/\(<clib\/.*>\)/\L\1/' -e 's/\(<defines\/.*>\)/\L\1/' -e 's/\(<inline\/.*>\)/\L\1/' -e 's/\(<pragmas\/.*>\)/\L\1/' $3/m68k-amigaos/include/proto/$name.h
rm $3/m68k-amigaos/include/proto/$name.h.bak
mkdir -p $3/m68k-amigaos/include/inline/
$3/bin/sfdc --mode=macros --target=m68k-amigaos --output=$3/m68k-amigaos/include/inline/$name.h $3/m68k-amigaos/lib/sfd/$sfd || exit 1
$3/bin/sfdc --mode=macros --target=m68kvbcc-amigaos --output=$3/m68k-amigaos/include/inline/${name}_protos.h $3/m68k-amigaos/lib/sfd/$sfd || exit 1
mkdir -p $3/m68k-amigaos/include/lvo/
$3/bin/sfdc --mode=lvo --target=m68k-amigaos --output=$3/m68k-amigaos/include/lvo/$name.i $3/m68k-amigaos/lib/sfd/$sfd || exit 1
if [ "${a[2]}" != "" ] && [ "${a[3]}" != "" ]; then
echo fixup names from ${a[2]} to ${a[3]}
echo sed -i.bak -e "s/${a[2]}/${a[3]}/" $3/m68k-amigaos/include/proto/$name.h
sed -i.bak -e "s/${a[2]}/${a[3]}/" $3/m68k-amigaos/include/proto/$name.h
sed -i.bak -e "s/${a[2]}/${a[3]}/" $3/m68k-amigaos/include/lvo/$name.i
sed -i.bak -e "s/${a[2]}/${a[3]}/" $3/m68k-amigaos/include/inline/$name.h
sed -i.bak -e "s/${a[2]}/${a[3]}/" $3/m68k-amigaos/include/inline/${name}_protos.h
rm $3/m68k-amigaos/include/proto/$name.h.bak $3/m68k-amigaos/include/lvo/$name.i.bak $3/m68k-amigaos/include/inline/$name.h.bak $3/m68k-amigaos/include/inline/${name}_protos.h.bak
fi
;;
stubs)
sfd=${a[1]}
file=$(basename $sfd)
name=${file%????}
$3/bin/sfdc --mode=autoopen --target=m68k-amigaos --output=build/$2/$name.c $3/m68k-amigaos/lib/sfd/$name.sfd || exit 1
sed -i.bak -e 's/__inline//g' -e 's/: \"d0\",/:/g' build/$2/$name.c || exit 1
rm build/$2/$name.c.bak
echo $3/bin/m68k-amigaos-gcc -Os -noixemul -fomit-frame-pointer build/$2/$name.c -c
$3/bin/m68k-amigaos-gcc -Os -noixemul -fomit-frame-pointer build/$2/$name.c -c -o build/$2/$name.o || exit 1
echo $3/bin/m68k-amigaos-ar r $3/m68k-amigaos/lib/libstubs.a build/$2/$name.o
(
flock -x 200
$3/bin/m68k-amigaos-ar r $3/m68k-amigaos/lib/libstubs.a build/$2/$name.o || exit 1
) 200>/tmp/amiga-gcc-libstubs-lock
rm -f /tmp/amiga-gcc-libstubs-lock
;;
lib)
sfd=${a[1]}
file=$(basename $sfd)
name=${file%????}
$3/bin/sfdc --mode=stubs --target=m68k-amigaos --output=build/$2/lib$2.c $3/m68k-amigaos/lib/sfd/$name.sfd || exit 1
sed -i.bak -e 's/__inline//g' -e 's/: \"d0\",/:/g' build/$2/lib$2.c || exit 1
rm build/$2/lib$2.c.bak
echo $3/bin/m68k-amigaos-gcc -Os -noixemul -fomit-frame-pointer build/$2/lib$2.c -c
$3/bin/m68k-amigaos-gcc -Os -noixemul -fomit-frame-pointer build/$2/lib$2.c -c -o build/$2/lib$2.o || exit 1
echo $3/bin/m68k-amigaos-ar r $3/m68k-amigaos/lib/lib$2.a build/$2/lib$2.o
$3/bin/m68k-amigaos-ar r $3/m68k-amigaos/lib/lib$2.a build/$2/lib$2.o || exit 1
;;
liba)
sfd=${a[1]}
file=$(basename $sfd)
name=${file%????}
$3/bin/sfdc --mode=stubs --target=m68k-amigaos --output=build/$2/lib$2.c $3/m68k-amigaos/lib/sfd/$name.sfd || exit 1
sed -i.bak -e 's/__inline//g' -e 's/: \"d0\",/:/g' build/$2/lib$2.c || exit 1
rm build/$2/lib$2.c.bak
;;
libc)
echo $3/bin/m68k-amigaos-gcc -Os -noixemul -fomit-frame-pointer build/$2/lib$2.c -c
$3/bin/m68k-amigaos-gcc -Os -noixemul -fomit-frame-pointer build/$2/lib$2.c -c -o build/$2/lib$2.o || exit 1
echo $3/bin/m68k-amigaos-ar r $3/m68k-amigaos/lib/lib$2.a build/$2/lib$2.o
$3/bin/m68k-amigaos-ar r $3/m68k-amigaos/lib/lib$2.a build/$2/lib$2.o || exit 1
;;
redirinc)
echo creating redirecting header $3/m68k-amigaos/include/${a[1]}
echo "#include \"${a[2]}\"" >$3/m68k-amigaos/include/${a[1]}
;;
sed)
x=${a[@]:2}
x=${x##\"}
x=${x%%\"}
echo applying: sed -i.bak -E \""$x"\" $3/${a[1]}
LC_CTYPE=C sed -i.bak -E "$x" $3/${a[1]}
rm $3/${a[1]}.bak
;;
symlink)
echo creating symlink from $3/m68k-amigaos/${a[2]} to $3/m68k-amigaos/${a[1]}
rm -rf $3/m68k-amigaos/${a[2]}
ln -s $3/m68k-amigaos/${a[1]} $3/m68k-amigaos/${a[2]}
;;
stdargs)
echo adding __stdargs to build/$2/${a[1]}
LC_CTYPE=C sed -i.bak -E 's/(.*)__stdargs (.*)/\1\2/g' build/$2/${a[1]}
LC_CTYPE=C sed -i.bak -E 's/([a-zA-Z0-9_]*[[:blank:]]*.*[[:blank:]]+\*?[[:blank:]]*)([a-zA-Z0-9_]+)[[:blank:]]*\(/__stdargs \1\2(/g' build/$2/${a[1]}
rm build/$2/${a[1]}.bak
;;
patch)
patch=patches/$2/${a[1]}
echo applying patch $patch to build/$2
patch -N -p0 -r - -d build/$2 < $patch
;;
*)
if [ "$line" != "" ]; then
if [ "${a[1]}" == "=" ]; then
file=${a[2]}
line=${a[0]}
cp build/$2/$line build/$2/$(dirname $line)/$file
else
file=$(basename $line)
fi
dir=$(basename $(dirname $line))
#lower-case the directory part
outdir=$(echo "$dir" | tr '[:upper:]' '[:lower:]')
if [[ $file == *.h ]] || [[ $file == *.i ]]; then
mkdir -p "$3/m68k-amigaos/include/$outdir"
echo cp "build/$2/$line" "$3/m68k-amigaos/include/$outdir/$file"
cp "build/$2/$line" "$3/m68k-amigaos/include/$outdir/$file"
elif [[ $file == *.guide ]]; then
mkdir -p "$3/m68k-amigaos/guide"
echo cp "build/$2/$line" "$3/m68k-amigaos/guide/$file"
cp "build/$2/$line" "$3/m68k-amigaos/guide/$file"
elif [[ $file == *.doc ]]; then
mkdir -p "$3/m68k-amigaos/doc"
echo cp "build/$2/$line" "$3/m68k-amigaos/doc/$file"
cp "build/$2/$line" "$3/m68k-amigaos/doc/$file"
elif [[ $file == *.sfd ]]; then
mkdir -p "$3/m68k-amigaos/lib/sfd"
echo cp "build/$2/$line" "$3/m68k-amigaos/lib/sfd/$file"
cp "build/$2/$line" "$3/m68k-amigaos/lib/sfd/$file"
elif [[ $file == *.fd ]]; then
mkdir -p "$3/m68k-amigaos/lib/fd"
echo cp "build/$2/$line" "$3/m68k-amigaos/lib/fd/$file"
cp "build/$2/$line" "$3/m68k-amigaos/lib/fd/$file"
elif [[ $file == *.a ]]; then
echo cp "build/$2/$line" "$3/m68k-amigaos/lib/$file"
cp "build/$2/$line" "$3/m68k-amigaos/lib/$file"
fi
fi
;;
esac
done < "sdk/$2.sdk"
;;
clean)
rm -rf build/$2
;;
esac