diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000000..ba8933dbd72 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,38 @@ +name: Linux build + +on: + push: + branches: [ binutils-2_41-mintelf ] + pull_request: + branches: [ binutils-2_41-mintelf ] + +jobs: + build: + runs-on: ubuntu-20.04 + strategy: + matrix: + cross_tool: [ "m68k-atari-mintelf" ] + steps: + - uses: actions/checkout@v3 + - name: Install SSH keys + if: ${{ github.event_name == 'push' }} + env: + SSH_ID: ${{ secrets.SSH_ID }} + run: ./.scripts/install_ssh_id.sh + - name: Setup environment + env: + PROJECT_VERSION: "2.41" + CROSS_TOOL: ${{ matrix.cross_tool }} + run: ./.scripts/setup_env.sh + - name: Install packages + run: | + sudo apt-get update + sudo apt-get install libzstd-dev liblzma-dev zlib1g-dev + - name: build + run: ./.scripts/build.sh + - name: deploy + if: ${{ github.event_name == 'push' }} + env: + COMMITER_NAME: ${{ github.event.commits[0].author.name }} + COMMITER_EMAIL: ${{ github.event.commits[0].author.email }} + run: ./.scripts/deploy.sh diff --git a/.scripts/build.sh b/.scripts/build.sh new file mode 100755 index 00000000000..46237f7b6c3 --- /dev/null +++ b/.scripts/build.sh @@ -0,0 +1,117 @@ +#!/bin/bash -eux +# -e: Exit immediately if a command exits with a non-zero status. +# -u: Treat unset variables as an error when substituting. +# -x: Display expanded script commands + +unset CDPATH +unset LANG LANGUAGE LC_ALL LC_CTYPE LC_TIME LC_NUMERIC LC_COLLATE LC_MONETARY LC_MESSAGES + +VERSIONPATCH=-20230911 +REVISION="GNU Binutils for MiNT ${VERSIONPATCH#-}" + +TARGET=${CROSS_TOOL:-m68k-atari-mintelf} +if test "$TARGET" = m68k-atari-mintelf; then +REVISION="GNU Binutils for MiNT ELF ${VERSIONPATCH#-}" +fi +PREFIX=/usr + +TAR=${TAR-tar} +TAR_OPTS=${TAR_OPTS---owner=0 --group=0} +LN_S=ln +BUILD_EXEEXT= +MAKE=make + +here=`pwd` +srcdir=`pwd` + +host=linux64 +if test -d /usr/lib64 -a $host = linux64; then + BUILD_LIBDIR=${PREFIX}/lib64 +else + BUILD_LIBDIR=${PREFIX}/lib +fi + +enable_plugins=--disable-plugins +enable_lto=--disable-lto + +case "${TARGET}" in + *-*-*elf* | *-*-linux* | *-*-darwin*) + enable_lto=--enable-lto + enable_plugins=--enable-plugins + ;; +esac + +MINT_BUILD_DIR=$here/build + +rm -rf "$MINT_BUILD_DIR" +mkdir -p "$MINT_BUILD_DIR" + +cd "$MINT_BUILD_DIR" + +# Note: gdb is explictly disabled here, because it is not needed for the cross-compiler +../configure \ + --target="${TARGET}" \ + --prefix="${PREFIX}" \ + --libdir="$BUILD_LIBDIR" \ + --bindir="${PREFIX}/bin" \ + --libexecdir='${libdir}' \ + --with-pkgversion="$REVISION" \ + --with-bugurl='https://github.com/freemint/m68k-atari-mint-binutils-gdb/issues' \ + --with-gcc --with-gnu-as --with-gnu-ld \ + --disable-gdb --disable-gdbserver --disable-sim \ + --disable-werror \ + --disable-threads \ + --enable-new-dtags \ + --enable-relro \ + --enable-default-hash-style=both \ + $enable_lto \ + $enable_plugins \ + --disable-nls \ + --with-system-zlib \ + --with-system-readline \ + --disable-bracketed-paste-default \ + --with-sysroot="${PREFIX}/${TARGET}/sys-root" + +${MAKE} || exit 1 + +# INSTALL_DIR is set in setup_env.sh +make DESTDIR="$INSTALL_DIR" install-strip >/dev/null || exit 1 + +mkdir -p "${INSTALL_DIR}/${PREFIX}/${TARGET}/bin" + +cd "${INSTALL_DIR}/${PREFIX}/${TARGET}/bin" + +for i in addr2line ar as nm ld ld.bfd objcopy objdump ranlib strip readelf dlltool dllwrap size strings; do + if test -x ../../bin/${TARGET}-$i; then + rm -f ${i} ${i}${BUILD_EXEEXT} + $LN_S ../../bin/${TARGET}-$i${BUILD_EXEEXT} $i + fi +done + +cd "${INSTALL_DIR}/${PREFIX}/bin" + +rm -f ${TARGET}-ld ${TARGET}-ld${BUILD_EXEEXT} +$LN_S ${TARGET}-ld.bfd${BUILD_EXEEXT} ${TARGET}-ld${BUILD_EXEEXT} +cd "${INSTALL_DIR}" || exit 1 + +rm -f ${BUILD_LIBDIR#/}/libiberty.a + +# do not overwrite the system files +rm -rf ${PREFIX#/}/share/info +rm -rf ${PREFIX#/}/share/man +rm -f ${BUILD_LIBDIR#/}/bfd-plugins/libdep.so +rm -f ${BUILD_LIBDIR#/}/bfd-plugins/*dep.dll +rmdir ${BUILD_LIBDIR#/}/bfd-plugins 2>/dev/null || : +rm -f ${PREFIX#/}/${TARGET}/lib/ldscripts/m68kmintelf.{xbn,xe,xn,xr,xu} + +# remove gdb if it was build; we don't need it for the cross compiler +rm -f ${PREFIX#/}/bin/${TARGET}-gdb* +rm -rf "${PREFIX#/}/share/gdb" +rm -rf "${PREFIX#/}/include/gdb" +rm -rf "${PREFIX#/}/include/sim" + +# archive is created in deploy.sh +# toolsuffix=${TARGET##*-} +# TARNAME=${PROJECT_NAME}-${PROJECT_VERSION}-${toolsuffix} + +# ${TAR} ${TAR_OPTS} -jcf ${DEPLOY_DIR}/${TARNAME}-ubuntu-20.04.tar.bz2 ${PREFIX#/} diff --git a/.scripts/deploy.sh b/.scripts/deploy.sh new file mode 100755 index 00000000000..2ee33ff3d78 --- /dev/null +++ b/.scripts/deploy.sh @@ -0,0 +1,84 @@ +#!/bin/sh -x + +SERVER=web196@server43.webgo24.de +UPLOAD_DIR=$SERVER:/home/www/snapshots + +if [ -z "${DEPLOY_ARCHIVE+x}" ] +then + # zip is default + DEPLOY_ARCHIVE="zip" +fi + +toolsuffix=${CROSS_TOOL##*-} + +ARCHIVE_NAME="${PROJECT_NAME}-${PROJECT_VERSION}-${SHORT_ID}-${toolsuffix}.${DEPLOY_ARCHIVE}" +ARCHIVE_PATH="${DEPLOY_DIR}/${ARCHIVE_NAME}" + +mkdir -p "${DEPLOY_DIR}" + +if [ "${DEPLOY_ARCHIVE}" = "tar.bz2" ] +then + cd ${INSTALL_DIR} && tar cjf ${ARCHIVE_PATH} * +elif [ "${DEPLOY_ARCHIVE}" = "tar.xz" ] +then + cd ${INSTALL_DIR} && tar cJf ${ARCHIVE_PATH} * +elif [ "${DEPLOY_ARCHIVE}" = "tar.gz" ] +then + cd ${INSTALL_DIR} && tar czf ${ARCHIVE_PATH} * +else + cd $(dirname ${INSTALL_DIR}) && zip -r -9 ${ARCHIVE_PATH} $(basename ${INSTALL_DIR}) +fi + +cd - + + +eval "$(ssh-agent -s)" + +PROJECT_DIR="$PROJECT_NAME" +case $PROJECT_DIR in + m68k-atari-mint-gcc) PROJECT_DIR=gcc ;; + m68k-atari-mint-binutils-gdb) PROJECT_DIR=binutils ;; +esac + +upload_file() { + local from="$1" + local to="$2" + for i in 1 2 3 + do + scp -o "StrictHostKeyChecking no" "$from" "$to" + [ $? = 0 ] && return 0 + sleep 1 + done + exit 1 +} + +link_file() { + local from="$1" + local to="$2" + for i in 1 2 3 + do + ssh -o "StrictHostKeyChecking no" $SERVER -- "cd www/snapshots/${PROJECT_DIR}; ln -sf $from $to" + [ $? = 0 ] && return 0 + sleep 1 + done + exit 1 +} + +upload_file "$ARCHIVE_PATH" "${UPLOAD_DIR}/${PROJECT_DIR}/${ARCHIVE_NAME}" + +# +# *-latest links are currently not provided, because we dont +# want to overwrite known-to-work versions that are used for +# other projects with experimental ones +# +#if test -z "${CPU_TARGET}" +#then +# link_file "$ARCHIVE_NAME" "${PROJECT_DIR}-${toolsuffix}-latest.${DEPLOY_ARCHIVE}" +# # traditionally, that link did not contain the cross toolchain suffix +# if test "$toolsuffix" = "mint"; then +# link_file "$ARCHIVE_NAME" "${PROJECT_DIR}-latest.${DEPLOY_ARCHIVE}" +# fi +#fi + +echo ${PROJECT_NAME}-${PROJECT_VERSION}-${SHORT_ID} > .latest_version +upload_file .latest_version "${UPLOAD_DIR}/${PROJECT_DIR}/.latest_version" diff --git a/.scripts/install_ssh_id.sh b/.scripts/install_ssh_id.sh new file mode 100755 index 00000000000..51a14c0af70 --- /dev/null +++ b/.scripts/install_ssh_id.sh @@ -0,0 +1,38 @@ +#!/bin/bash -eu +# -e: Exit immediately if a command exits with a non-zero status. +# -u: Treat unset variables as an error when substituting. + +# This installs an SSH private/public key pair on the build system, +# so ssh can connect to remote servers without password. +# Important: for passwordless connection to succeed, our public key must be +# manually authorized on the remote server. + +# Our private key is the critical security component, it must remain secret. +# We store it in the SSH_ID environment variable in Travis CI project settings. +# As environment variables can only contain text, our key files are transformed +# like this: tar, xz, base64. Then then can be decoded here. This is safe as +# Travis CI never shows the contents of secure variables. + +# To generate the contents of the SSH_ID variable: +# Be sure to be in an empty, temporary directory. +# +# mkdir .ssh +# ssh-keygen -t rsa -b 4096 -C travis-ci.org/$USER/$PROJECT -N '' -f .ssh/id_rsa +# tar Jcvf id.tar.xz .ssh +# base64 -w 0 id.tar.xz +# +# Select the resulting encoded text (several lines) to copy it to the clipboard. +# Then go to the Travis CI project settings: +# https://travis-ci.org/$USER/$PROJECT/settings +# Create a new environment variable named SSH_ID, and paste the value. +# The script below will recreate the key files from that variable contents. + +if [ -z ${SSH_ID+x} ] +then + echo "error: SSH_ID is undefined" >&2 + exit 1 +fi + +echo $SSH_ID | base64 -d | tar -C ~ -Jx + +ls -l ~/.ssh diff --git a/.scripts/setup_env.sh b/.scripts/setup_env.sh new file mode 100755 index 00000000000..2225d635e37 --- /dev/null +++ b/.scripts/setup_env.sh @@ -0,0 +1,40 @@ +#!/bin/sh +# Use as: ". setup_env.sh" + +PROJECT_REPO=$(echo "${GITHUB_REPOSITORY}" | cut -d '/' -f 1) +echo "PROJECT_REPO=${PROJECT_REPO}" >> $GITHUB_ENV +# PROJECT_NAME=$(echo "${GITHUB_REPOSITORY}" | cut -d '/' -f 2) +PROJECT_NAME=binutils +echo "PROJECT_NAME=${PROJECT_NAME}" >> $GITHUB_ENV +# PROJECT_VERSION is defined in the action script +echo "PROJECT_VERSION=${PROJECT_VERSION}" >> $GITHUB_ENV +INSTALL_DIR="/tmp/${PROJECT_NAME}" +echo "INSTALL_DIR=${INSTALL_DIR}" >> $GITHUB_ENV +DEPLOY_DIR="/tmp/${PROJECT_NAME}-deploy" +echo "DEPLOY_DIR=${DEPLOY_DIR}" >> $GITHUB_ENV +DEPLOY_ARCHIVE="tar.bz2" +echo "DEPLOY_ARCHIVE=${DEPLOY_ARCHIVE}" >> $GITHUB_ENV + +SHORT_ID=$(echo ${GITHUB_SHA} | cut -c 1-3) +echo "SHORT_ID=$SHORT_ID" >> $GITHUB_ENV +LONG_ID=$(echo ${GITHUB_SHA} | cut -c 1-8) +echo "LONG_ID=$LONG_ID" >> $GITHUB_ENV +BRANCH=$(echo "${GITHUB_REF}" | cut -d '/' -f 3) + +PROJECT_VERSION=`cat bfd/version.m4 | sed -n 's/.*\([0-9]\.[0-9][0-9]*\).*/\1/p'` +echo "PROJECT_VERSION=$PROJECT_VERSION" >> $GITHUB_ENV + +if test "$CPU_TARGET" != ""; then + echo "CPU_TARGET=$CPU_TARGET" >> $GITHUB_ENV +fi +if test "$CROSS_TOOL" != ""; then + echo "CROSS_TOOL=$CROSS_TOOL" >> $GITHUB_ENV +fi + +# GITHUB_HEAD_REF is only set for pull requests +if [ "${GITHUB_HEAD_REF}" = "" ] +then + COMMIT_MESSAGE="[${PROJECT_NAME}] [${BRANCH}] Commit: https://github.com/${PROJECT_REPO}/${PROJECT_NAME}/commit/${GITHUB_SHA}" +fi + +echo "COMMIT_MESSAGE=$COMMIT_MESSAGE" >> $GITHUB_ENV