mirror of
https://github.com/cahirwpz/amigaos-cross-toolchain
synced 2026-09-11 19:59:18 +00:00
311 lines
7.0 KiB
Bash
Executable File
311 lines
7.0 KiB
Bash
Executable File
#!/bin/bash -Eeux
|
|
|
|
readonly TOP_DIR="$(pwd)"
|
|
readonly ARCHIVES="${TOP_DIR}/archives"
|
|
readonly PATCHES="${TOP_DIR}/patches"
|
|
readonly SOURCES="${TOP_DIR}/sources"
|
|
readonly BUILD_DIR="${TOP_DIR}/build"
|
|
readonly HOST_DIR="${TOP_DIR}/host"
|
|
readonly TARGET_DIR="${TOP_DIR}/target"
|
|
readonly STAMP="${TOP_DIR}/stamps"
|
|
|
|
source "${TOP_DIR}/bootstrap.conf"
|
|
|
|
function prepare_target {
|
|
mkdir -p "${STAMP}" "${BUILD_DIR}" "${TARGET_DIR}"
|
|
|
|
[ -f "${STAMP}/prepare-target" ] && return 0
|
|
|
|
pushd "${TARGET_DIR}"
|
|
mkdir -p "m68k-amigaos" "lib" "os-include" "os-lib"
|
|
ln -sf "../os-include" "m68k-amigaos/include"
|
|
ln -sf "../lib" "m68k-amigaos/lib"
|
|
popd
|
|
|
|
touch "${STAMP}/prepare-target"
|
|
}
|
|
|
|
function unpack_sources {
|
|
[ -f "${STAMP}/unpack-sources" ] && return 0
|
|
|
|
rm -rf "${SOURCES}"
|
|
mkdir -p "${SOURCES}"
|
|
pushd "${SOURCES}"
|
|
|
|
rm -rf "${BISON}"
|
|
tar -xzf "${ARCHIVES}/${BISON_SRC}"
|
|
|
|
rm -rf "${BINUTILS}"
|
|
tar -xzf "${ARCHIVES}/${BINUTILS_SRC}"
|
|
pushd "${BINUTILS}"
|
|
find "${PATCHES}/${BINUTILS}" -type f -iname '*.diff' | xargs cat | patch -p1
|
|
find "${PATCHES}/${BINUTILS}" -type f \! -name '*.diff' -printf "%p %P\n" | \
|
|
xargs -n 2 cp -v
|
|
popd
|
|
|
|
rm -rf "${GCC}"
|
|
tar -xzf "${ARCHIVES}/${GCC_CORE_SRC}"
|
|
tar -xzf "${ARCHIVES}/${GCC_CPP_SRC}"
|
|
pushd "${GCC}"
|
|
find "${PATCHES}/${GCC}" -type f -iname '*.diff' | xargs cat | patch -p1
|
|
find "${PATCHES}/${GCC}" -type f \! -name '*.diff' -printf "%p %P\n" | \
|
|
xargs -n 2 cp -v
|
|
popd
|
|
|
|
rm -rf "${SFDC}"
|
|
lha -xgq "${ARCHIVES}/${SFDC_SRC}"
|
|
tar -xzf "${SFDC}.tar.gz"
|
|
for file in $(ls -1d sfdc*); do
|
|
[ -f "${file}" ] && rm "${file}"
|
|
done
|
|
|
|
rm -rf "${NDK}"
|
|
lha -xgq "${ARCHIVES}/${NDK_SRC}"
|
|
rm -rf ndk_* *.info
|
|
pushd "${NDK}"
|
|
mkdir Include/include_h/inline
|
|
find "${PATCHES}/${NDK}" -type f -iname '*.diff' | xargs cat | patch -p1
|
|
find "${PATCHES}/${NDK}" -type f \! -name '*.diff' -printf "%p %P\n" | \
|
|
xargs -n 2 cp -v
|
|
popd
|
|
|
|
rm -rf "${IXEMUL}"
|
|
lha -xgq "${ARCHIVES}/${IXEMUL_SRC}"
|
|
mv "ixemul" "${IXEMUL}"
|
|
chmod a+x "${IXEMUL}/configure"
|
|
|
|
rm -rf "${LIBNIX}"
|
|
tar -xzf "${ARCHIVES}/${LIBNIX_SRC}"
|
|
mv "libnix" "${LIBNIX}"
|
|
chmod a+x "${LIBNIX}/mkinstalldirs"
|
|
|
|
rm -rf "${LIBAMIGA}"
|
|
mkdir "${LIBAMIGA}"
|
|
pushd "${LIBAMIGA}"
|
|
tar -xzf "${ARCHIVES}/${LIBAMIGA_SRC}"
|
|
popd
|
|
|
|
popd
|
|
|
|
touch "${STAMP}/unpack-sources"
|
|
}
|
|
|
|
function build_tools {
|
|
[ -f "${STAMP}/build-tools" ] && return 0
|
|
|
|
rm -rf "${HOST_DIR}"
|
|
mkdir -p "${HOST_DIR}"
|
|
|
|
pushd "${BUILD_DIR}"
|
|
rm -rf "${BISON}"
|
|
mkdir -p "${BISON}"
|
|
cd "${BISON}"
|
|
"${SOURCES}/${BISON}/configure" \
|
|
--prefix="${HOST_DIR}"
|
|
make
|
|
make install
|
|
popd
|
|
|
|
touch "${STAMP}/build-tools"
|
|
}
|
|
|
|
function build_binutils {
|
|
[ -f "${STAMP}/build-binutils" ] && return 0
|
|
|
|
pushd "${BUILD_DIR}"
|
|
rm -rf "${BINUTILS}"
|
|
mkdir -p "${BINUTILS}"
|
|
cd "${BINUTILS}"
|
|
"${SOURCES}/${BINUTILS}/configure" \
|
|
--prefix="${TARGET_DIR}" \
|
|
--host="i686-linux-gnu" \
|
|
--target="m68k-amigaos"
|
|
make all
|
|
make install install-info
|
|
popd
|
|
|
|
touch "${STAMP}/build-binutils"
|
|
}
|
|
|
|
readonly FLAGS_FOR_TARGET=( \
|
|
"MAKEINFO=makeinfo" \
|
|
"CFLAGS_FOR_TARGET=-noixemul" \
|
|
"AR_FOR_TARGET=${TARGET_DIR}/bin/m68k-amigaos-ar" \
|
|
"AS_FOR_TARGET=${TARGET_DIR}/bin/m68k-amigaos-as" \
|
|
"LD_FOR_TARGET=${TARGET_DIR}/bin/m68k-amigaos-ld" \
|
|
"NM_FOR_TARGET=${TARGET_DIR}/bin/m68k-amigaos-nm" \
|
|
"OBJCOPY_FOR_TARGET=${TARGET_DIR}/bin/m68k-amigaos-objcopy" \
|
|
"OBJDUMP_FOR_TARGET=${TARGET_DIR}/bin/m68k-amigaos-objdump" \
|
|
"RANLIB_FOR_TARGET=${TARGET_DIR}/bin/m68k-amigaos-ranlib")
|
|
|
|
function build_gcc {
|
|
[ -f "${STAMP}/build-gcc" ] && return 0
|
|
|
|
pushd "${BUILD_DIR}"
|
|
rm -rf "${GCC}"
|
|
mkdir -p "${GCC}"
|
|
cd "${GCC}"
|
|
"${SOURCES}/${GCC}/configure" \
|
|
--prefix="${TARGET_DIR}" \
|
|
--target="m68k-amigaos" \
|
|
--host="i686-linux-gnu" \
|
|
--enable-languages=c \
|
|
--with-headers="${SOURCES}/${IXEMUL}/include"
|
|
make all ${FLAGS_FOR_TARGET[*]}
|
|
make install ${FLAGS_FOR_TARGET[*]}
|
|
popd
|
|
|
|
touch "${STAMP}/build-gcc"
|
|
}
|
|
|
|
function build_gpp {
|
|
[ -f "${STAMP}/build-gpp" ] && return 0
|
|
|
|
pushd "${BUILD_DIR}"
|
|
rm -rf "${GCC}"
|
|
mkdir -p "${GCC}"
|
|
cd "${GCC}"
|
|
"${SOURCES}/${GCC}/configure" \
|
|
--prefix="${TARGET_DIR}" \
|
|
--host="i686-linux-gnu" \
|
|
--target="m68k-amigaos" \
|
|
--enable-languages=c++ \
|
|
--with-headers="${SOURCES}/${IXEMUL}/include"
|
|
make all ${FLAGS_FOR_TARGET[*]}
|
|
make install ${FLAGS_FOR_TARGET[*]}
|
|
popd
|
|
|
|
touch "${STAMP}/build-gpp"
|
|
}
|
|
|
|
function process_headers {
|
|
[ -f "${STAMP}/process-headers" ] && return 0
|
|
|
|
pushd "${BUILD_DIR}"
|
|
rm -rf "${SFDC}"
|
|
cp -a "${SOURCES}/${SFDC}" "${SFDC}"
|
|
cd "${SFDC}"
|
|
./configure \
|
|
--prefix="${TARGET_DIR}"
|
|
make
|
|
make install
|
|
popd
|
|
|
|
pushd "${TARGET_DIR}/include"
|
|
cp -av "${SOURCES}/${NDK}/Include/include_h/"* .
|
|
for file in ${SOURCES}/${NDK}/Include/sfd/*.sfd; do
|
|
base=$(basename ${file%_lib.sfd})
|
|
|
|
sfdc --target=m68k-amigaos --mode=proto \
|
|
--output="proto/${base}.h" $file
|
|
sfdc --target=m68k-amigaos --mode=macros \
|
|
--output="inline/${base}.h" $file
|
|
done
|
|
popd
|
|
|
|
touch "${STAMP}/process-headers"
|
|
}
|
|
|
|
function install_libamiga {
|
|
[ -f "${STAMP}/install-libamiga" ] && return 0
|
|
|
|
pushd "${TARGET_DIR}"
|
|
cp -av "${SOURCES}/${LIBAMIGA}/lib" .
|
|
popd
|
|
|
|
touch "${STAMP}/install-libamiga"
|
|
}
|
|
|
|
function build_libnix {
|
|
[ -f "${STAMP}/build-libnix" ] && return 0
|
|
|
|
pushd "${BUILD_DIR}"
|
|
rm -rf "${LIBNIX}"
|
|
mkdir -p "${LIBNIX}"
|
|
cd "${LIBNIX}"
|
|
"${SOURCES}/${LIBNIX}/configure" \
|
|
--prefix="${TARGET_DIR}" \
|
|
--host="i686-linux-gnu" \
|
|
--target="m68k-amigaos"
|
|
make all \
|
|
CC=m68k-amigaos-gcc \
|
|
CPP="m68k-amigaos-gcc -E" \
|
|
AR=m68k-amigaos-ar \
|
|
AS=m68k-amigaos-as \
|
|
RANLIB=m68k-amigaos-ranlib \
|
|
LD=m68k-amigaos-ld \
|
|
MAKEINFO=:
|
|
[ -f "${TARGET_DIR}/guide" ] && rm -f "${TARGET_DIR}/guide"
|
|
make install MAKEINFO=:
|
|
popd
|
|
|
|
touch "${STAMP}/build-libnix"
|
|
}
|
|
|
|
function build_ixemul {
|
|
[ -f "${STAMP}/build-ixemul" ] && return 0
|
|
|
|
pushd "${BUILD_DIR}"
|
|
rm -rf "${IXEMUL}"
|
|
mkdir -p "${IXEMUL}"
|
|
cd "${IXEMUL}"
|
|
CC=m68k-amigaos-gcc \
|
|
CFLAGS=-noixemul \
|
|
AR=m68k-amigaos-ar \
|
|
RANLIB=m68k-amigaos-ranlib \
|
|
"${SOURCES}/${IXEMUL}/configure" \
|
|
--prefix="${TARGET_DIR}" \
|
|
--host="i686-linux-gnu" \
|
|
--target="m68k-amigaos"
|
|
make MAKEINFO=: all
|
|
make MAKEINFO=: install
|
|
popd
|
|
|
|
touch "${STAMP}/build-ixemul"
|
|
}
|
|
|
|
function build {
|
|
# Strangely enough - this trick is needed in order to make m68k-amigaos-ar
|
|
# not to crash during libgcc compilation. It's difficult to say what exactly
|
|
# is affected by this change. Nevertheless, build succeeds under gcc 4.4.3.
|
|
export CC="gcc"
|
|
|
|
prepare_target
|
|
unpack_sources
|
|
build_tools
|
|
|
|
export PATH="${HOST_DIR}/bin:${PATH}"
|
|
|
|
build_binutils
|
|
build_gcc
|
|
|
|
export PATH="${TARGET_DIR}/bin:${PATH}"
|
|
|
|
process_headers
|
|
install_libamiga
|
|
build_libnix
|
|
#build_ixemul
|
|
build_gpp
|
|
}
|
|
|
|
function main {
|
|
local -r action="${1:-build}"
|
|
|
|
case "${action}" in
|
|
"build")
|
|
build
|
|
;;
|
|
"clean")
|
|
for dir in ${SOURCES} ${BUILD_DIR} ${HOST_DIR} ${TARGET_DIR} ${STAMP}; do
|
|
rm -rf "${dir}"
|
|
done
|
|
;;
|
|
*)
|
|
echo "action '${action}' not supported!"
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
main "$@"
|