From 6ab049c6f11e864f8c1ec29d6257b15ccff6c343 Mon Sep 17 00:00:00 2001 From: Florent Valette Date: Mon, 15 Dec 2025 11:02:23 +0000 Subject: [PATCH 1/5] features: add crosstool-ng-devel-apt --- .github/workflows/test.yaml | 2 + .../devcontainer-feature.json | 7 + src/crosstool-ng-devel-apt/install.sh | 22 +++ src/crosstool-ng-devel-apt/library_scripts.sh | 172 ++++++++++++++++++ test/crosstool-ng-devel-apt/test.sh | 16 ++ 5 files changed, 219 insertions(+) create mode 100644 src/crosstool-ng-devel-apt/devcontainer-feature.json create mode 100644 src/crosstool-ng-devel-apt/install.sh create mode 100644 src/crosstool-ng-devel-apt/library_scripts.sh create mode 100644 test/crosstool-ng-devel-apt/test.sh diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 7e25c8f..815847c 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -13,6 +13,7 @@ jobs: strategy: matrix: features: + - crosstool-ng-devel-apt - dtschema baseImage: - debian:latest @@ -33,6 +34,7 @@ jobs: strategy: matrix: features: + - crosstool-ng-devel-apt - dtschema steps: - uses: actions/checkout@v4 diff --git a/src/crosstool-ng-devel-apt/devcontainer-feature.json b/src/crosstool-ng-devel-apt/devcontainer-feature.json new file mode 100644 index 0000000..2b2e0a4 --- /dev/null +++ b/src/crosstool-ng-devel-apt/devcontainer-feature.json @@ -0,0 +1,7 @@ +{ + "id": "crosstool-ng-devel-apt", + "version": "1.0.0", + "name": "crosstool-ng devel dependencies (via pipx)", + "documentationURL": "http://github.com/camelot-os/devcontainer-features/tree/main/src/crosstool-ng-devel-apt", + "description": "Install devel dependencies in order to build crosstool-ng" +} diff --git a/src/crosstool-ng-devel-apt/install.sh b/src/crosstool-ng-devel-apt/install.sh new file mode 100644 index 0000000..a2e1c24 --- /dev/null +++ b/src/crosstool-ng-devel-apt/install.sh @@ -0,0 +1,22 @@ +set -e + +. ./library_scripts.sh + +# nanolayer is a cli utility which keeps container layers as small as possible +# source code: https://github.com/devcontainers-extra/nanolayer +# `ensure_nanolayer` is a bash function that will find any existing nanolayer installations, +# and if missing - will download a temporary copy that automatically get deleted at the end +# of the script +ensure_nanolayer nanolayer_location "v0.5.0" + +crosstool_ng_devel_deps="build-essential,curl,ca-certificates,automake,autoconf,flex,bison,texinfo,help2man,file,gawk,libtool-bin" + +$nanolayer_location \ + install \ + devcontainer-feature \ + "ghcr.io/devcontainers-extra/features/apt-packages:1" \ + --option packages="${crosstool_ng_devel_deps}" \ + --option clean_ppas=true \ + --option preserve_apt_list=true + +echo 'Done!' diff --git a/src/crosstool-ng-devel-apt/library_scripts.sh b/src/crosstool-ng-devel-apt/library_scripts.sh new file mode 100644 index 0000000..9e1072e --- /dev/null +++ b/src/crosstool-ng-devel-apt/library_scripts.sh @@ -0,0 +1,172 @@ + + +clean_download() { + # The purpose of this function is to download a file with minimal impact on container layer size + # this means if no valid downloader is found (curl or wget) then we install a downloader (currently wget) in a + # temporary manner, and making sure to + # 1. uninstall the downloader at the return of the function + # 2. revert back any changes to the package installer database/cache (for example apt-get lists) + # The above steps will minimize the leftovers being created while installing the downloader + # Supported distros: + # debian/ubuntu/alpine + + url=$1 + output_location=$2 + tempdir=$(mktemp -d) + downloader_installed="" + + _apt_get_install() { + tempdir=$1 + + # copy current state of apt list - in order to revert back later (minimize contianer layer size) + cp -p -R /var/lib/apt/lists $tempdir + apt-get update -y + apt-get -y install --no-install-recommends wget ca-certificates + } + + _apt_get_cleanup() { + tempdir=$1 + + echo "removing wget" + apt-get -y purge wget --auto-remove + + echo "revert back apt lists" + rm -rf /var/lib/apt/lists/* + rm -r /var/lib/apt/lists && mv $tempdir/lists /var/lib/apt/lists + } + + _apk_install() { + tempdir=$1 + # copy current state of apk cache - in order to revert back later (minimize contianer layer size) + cp -p -R /var/cache/apk $tempdir + + apk add --no-cache wget + } + + _apk_cleanup() { + tempdir=$1 + + echo "removing wget" + apk del wget + } + # try to use either wget or curl if one of them already installer + if type curl >/dev/null 2>&1; then + downloader=curl + elif type wget >/dev/null 2>&1; then + downloader=wget + else + downloader="" + fi + + # in case none of them is installed, install wget temporarly + if [ -z $downloader ] ; then + if [ -x "/usr/bin/apt-get" ] ; then + _apt_get_install $tempdir + elif [ -x "/sbin/apk" ] ; then + _apk_install $tempdir + else + echo "distro not supported" + exit 1 + fi + downloader="wget" + downloader_installed="true" + fi + + if [ $downloader = "wget" ] ; then + wget -q $url -O $output_location + else + curl -sfL $url -o $output_location + fi + + # NOTE: the cleanup procedure was not implemented using `trap X RETURN` only because + # alpine lack bash, and RETURN is not a valid signal under sh shell + if ! [ -z $downloader_installed ] ; then + if [ -x "/usr/bin/apt-get" ] ; then + _apt_get_cleanup $tempdir + elif [ -x "/sbin/apk" ] ; then + _apk_cleanup $tempdir + else + echo "distro not supported" + exit 1 + fi + fi + +} + + +ensure_nanolayer() { + # Ensure existance of the nanolayer cli program + local variable_name=$1 + + local required_version=$2 + + local __nanolayer_location="" + + # If possible - try to use an already installed nanolayer + if [ -z "${NANOLAYER_FORCE_CLI_INSTALLATION}" ]; then + if [ -z "${NANOLAYER_CLI_LOCATION}" ]; then + if type nanolayer >/dev/null 2>&1; then + echo "Found a pre-existing nanolayer in PATH" + __nanolayer_location=nanolayer + fi + elif [ -f "${NANOLAYER_CLI_LOCATION}" ] && [ -x "${NANOLAYER_CLI_LOCATION}" ] ; then + __nanolayer_location=${NANOLAYER_CLI_LOCATION} + echo "Found a pre-existing nanolayer which were given in env variable: $__nanolayer_location" + fi + + # make sure its of the required version + if ! [ -z "${__nanolayer_location}" ]; then + local current_version + current_version=$($__nanolayer_location --version) + + + if ! [ $current_version == $required_version ]; then + echo "skipping usage of pre-existing nanolayer. (required version $required_version does not match existing version $current_version)" + __nanolayer_location="" + fi + fi + + fi + + # If not previuse installation found, download it temporarly and delete at the end of the script + if [ -z "${__nanolayer_location}" ]; then + + if [ "$(uname -sm)" = 'Linux x86_64' ] || [ "$(uname -sm)" = "Linux aarch64" ]; then + tmp_dir=$(mktemp -d -t nanolayer-XXXXXXXXXX) + + clean_up () { + ARG=$? + rm -rf $tmp_dir + exit $ARG + } + trap clean_up EXIT + + + if [ -x "/sbin/apk" ] ; then + clib_type=musl + else + clib_type=gnu + fi + + tar_filename=nanolayer-"$(uname -m)"-unknown-linux-$clib_type.tgz + + # clean download will minimize leftover in case a downloaderlike wget or curl need to be installed + clean_download https://github.com/devcontainers-extra/nanolayer/releases/download/$required_version/$tar_filename $tmp_dir/$tar_filename + + tar xfzv $tmp_dir/$tar_filename -C "$tmp_dir" + chmod a+x $tmp_dir/nanolayer + __nanolayer_location=$tmp_dir/nanolayer + + + else + echo "No binaries compiled for non-x86-linux architectures yet: $(uname -m)" + exit 1 + fi + fi + + # Expose outside the resolved location + export ${variable_name}=$__nanolayer_location + +} + + diff --git a/test/crosstool-ng-devel-apt/test.sh b/test/crosstool-ng-devel-apt/test.sh new file mode 100644 index 0000000..8c165d3 --- /dev/null +++ b/test/crosstool-ng-devel-apt/test.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +set -e + +source dev-container-features-test-lib + +check "autoconf" bash -c "autoconf --version" +check "autoheader" bash -c "autoheader --version" +check "awk" bash -c "awk --version" +check "bison" bash -c "bison --version" +check "file" bash -c "file --version" +check "flex" bash -c "flex --version" +check "help2man" bash -c "help2man --version" +check "libtool" bash -c "libtool --version" + +reportResults From 8bdd3b95890f674082b3451219c31490a79803c8 Mon Sep 17 00:00:00 2001 From: Florent Valette Date: Mon, 15 Dec 2025 11:18:10 +0000 Subject: [PATCH 2/5] features, dtschema: fix autogenerated test do not check version in autogenerated test as it will be broken at each new release. TODO: add test scenarii w/ differente package version installed. --- test/dtschema/test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/dtschema/test.sh b/test/dtschema/test.sh index 2177aca..0cfca65 100644 --- a/test/dtschema/test.sh +++ b/test/dtschema/test.sh @@ -3,5 +3,5 @@ set -e source dev-container-features-test-lib -check "check dtschema version" bash -c "dt-validate --version | grep '2025.8'" +check "check dtschema version" bash -c "dt-validate --version" reportResults From c6a0c75cd78493d8816136b8343e8d1c14bc8783 Mon Sep 17 00:00:00 2001 From: Florent Valette Date: Fri, 13 Mar 2026 19:55:44 +0000 Subject: [PATCH 3/5] feature: add crosstool-ng feature --- src/crosstool-ng/devcontainer-feature.json | 41 +++++ src/crosstool-ng/install.sh | 29 ++++ src/crosstool-ng/library_scripts.sh | 172 +++++++++++++++++++++ test/crosstool-ng/test.sh | 9 ++ 4 files changed, 251 insertions(+) create mode 100644 src/crosstool-ng/devcontainer-feature.json create mode 100644 src/crosstool-ng/install.sh create mode 100644 src/crosstool-ng/library_scripts.sh create mode 100644 test/crosstool-ng/test.sh diff --git a/src/crosstool-ng/devcontainer-feature.json b/src/crosstool-ng/devcontainer-feature.json new file mode 100644 index 0000000..72b2193 --- /dev/null +++ b/src/crosstool-ng/devcontainer-feature.json @@ -0,0 +1,41 @@ +{ + "id": "crosstool-ng", + "version": "1.0.0", + "name": "crosstool-ng", + "documentationURL": "http://github.com/camelot-os/devcontainer-features/tree/main/src/crosstool-ng", + "description": "Clone, build and install crosstool-ng", + "options": { + "version": { + "default": "master", + "description": "select version to clone", + "proposals": [ + "master" + ], + "type": "string" + }, + "repo_url": { + "default": "https://github.com/crosstool-ng/crosstool-ng.git", + "description": "crosstool-ng source repository", + "type": "string" + } + }, + "dependsOn": { + "ghcr.io/devcontainers/features/python:1": { + "installTools": false, + "version": "os-provided" + }, + "ghcr.io/devcontainers-extra/features/apt-packages:1": { + "clean_ppas": true, + "preserve_apt_list": true, + "packages": "htop,build-essential,curl,ca-certificates,automake,autoconf,flex,bison,texinfo,help2man,file,gawk,libtool-bin,pipx,unzip" + }, + "ghcr.io/devcontainers-extra/features/pipx-package:1.1.8": { + "package": "meson", + "version": "1.10.0" + }, + "ghcr.io/devcontainers-extra/features/pipx-package:1.1.8": { + "package": "ninja", + "version": "latest" + } + } +} diff --git a/src/crosstool-ng/install.sh b/src/crosstool-ng/install.sh new file mode 100644 index 0000000..3a1d5de --- /dev/null +++ b/src/crosstool-ng/install.sh @@ -0,0 +1,29 @@ +set -e + +. ./library_scripts.sh + +# nanolayer is a cli utility which keeps container layers as small as possible +# source code: https://github.com/devcontainers-extra/nanolayer +# `ensure_nanolayer` is a bash function that will find any existing nanolayer installations, +# and if missing - will download a temporary copy that automatically get deleted at the end +# of the script +ensure_nanolayer nanolayer_location "v0.5.0" + +$nanolayer_location \ + install \ + devcontainer-feature \ + "ghcr.io/devcontainers-extra/features/apt-packages:1" \ + --option packages="git" \ + --option clean_ppas=true \ + --option preserve_apt_list=true + +tmpdir=$(mktemp -d) +git clone --branch $VERSION $REPO_URL $tmpdir +cd $tmpdir +./bootstrap +./configure --prefix=/usr/local +make && make install +cd - +rm -rf $tmpdir +apt remove -y git +apt autoremove -y diff --git a/src/crosstool-ng/library_scripts.sh b/src/crosstool-ng/library_scripts.sh new file mode 100644 index 0000000..9e1072e --- /dev/null +++ b/src/crosstool-ng/library_scripts.sh @@ -0,0 +1,172 @@ + + +clean_download() { + # The purpose of this function is to download a file with minimal impact on container layer size + # this means if no valid downloader is found (curl or wget) then we install a downloader (currently wget) in a + # temporary manner, and making sure to + # 1. uninstall the downloader at the return of the function + # 2. revert back any changes to the package installer database/cache (for example apt-get lists) + # The above steps will minimize the leftovers being created while installing the downloader + # Supported distros: + # debian/ubuntu/alpine + + url=$1 + output_location=$2 + tempdir=$(mktemp -d) + downloader_installed="" + + _apt_get_install() { + tempdir=$1 + + # copy current state of apt list - in order to revert back later (minimize contianer layer size) + cp -p -R /var/lib/apt/lists $tempdir + apt-get update -y + apt-get -y install --no-install-recommends wget ca-certificates + } + + _apt_get_cleanup() { + tempdir=$1 + + echo "removing wget" + apt-get -y purge wget --auto-remove + + echo "revert back apt lists" + rm -rf /var/lib/apt/lists/* + rm -r /var/lib/apt/lists && mv $tempdir/lists /var/lib/apt/lists + } + + _apk_install() { + tempdir=$1 + # copy current state of apk cache - in order to revert back later (minimize contianer layer size) + cp -p -R /var/cache/apk $tempdir + + apk add --no-cache wget + } + + _apk_cleanup() { + tempdir=$1 + + echo "removing wget" + apk del wget + } + # try to use either wget or curl if one of them already installer + if type curl >/dev/null 2>&1; then + downloader=curl + elif type wget >/dev/null 2>&1; then + downloader=wget + else + downloader="" + fi + + # in case none of them is installed, install wget temporarly + if [ -z $downloader ] ; then + if [ -x "/usr/bin/apt-get" ] ; then + _apt_get_install $tempdir + elif [ -x "/sbin/apk" ] ; then + _apk_install $tempdir + else + echo "distro not supported" + exit 1 + fi + downloader="wget" + downloader_installed="true" + fi + + if [ $downloader = "wget" ] ; then + wget -q $url -O $output_location + else + curl -sfL $url -o $output_location + fi + + # NOTE: the cleanup procedure was not implemented using `trap X RETURN` only because + # alpine lack bash, and RETURN is not a valid signal under sh shell + if ! [ -z $downloader_installed ] ; then + if [ -x "/usr/bin/apt-get" ] ; then + _apt_get_cleanup $tempdir + elif [ -x "/sbin/apk" ] ; then + _apk_cleanup $tempdir + else + echo "distro not supported" + exit 1 + fi + fi + +} + + +ensure_nanolayer() { + # Ensure existance of the nanolayer cli program + local variable_name=$1 + + local required_version=$2 + + local __nanolayer_location="" + + # If possible - try to use an already installed nanolayer + if [ -z "${NANOLAYER_FORCE_CLI_INSTALLATION}" ]; then + if [ -z "${NANOLAYER_CLI_LOCATION}" ]; then + if type nanolayer >/dev/null 2>&1; then + echo "Found a pre-existing nanolayer in PATH" + __nanolayer_location=nanolayer + fi + elif [ -f "${NANOLAYER_CLI_LOCATION}" ] && [ -x "${NANOLAYER_CLI_LOCATION}" ] ; then + __nanolayer_location=${NANOLAYER_CLI_LOCATION} + echo "Found a pre-existing nanolayer which were given in env variable: $__nanolayer_location" + fi + + # make sure its of the required version + if ! [ -z "${__nanolayer_location}" ]; then + local current_version + current_version=$($__nanolayer_location --version) + + + if ! [ $current_version == $required_version ]; then + echo "skipping usage of pre-existing nanolayer. (required version $required_version does not match existing version $current_version)" + __nanolayer_location="" + fi + fi + + fi + + # If not previuse installation found, download it temporarly and delete at the end of the script + if [ -z "${__nanolayer_location}" ]; then + + if [ "$(uname -sm)" = 'Linux x86_64' ] || [ "$(uname -sm)" = "Linux aarch64" ]; then + tmp_dir=$(mktemp -d -t nanolayer-XXXXXXXXXX) + + clean_up () { + ARG=$? + rm -rf $tmp_dir + exit $ARG + } + trap clean_up EXIT + + + if [ -x "/sbin/apk" ] ; then + clib_type=musl + else + clib_type=gnu + fi + + tar_filename=nanolayer-"$(uname -m)"-unknown-linux-$clib_type.tgz + + # clean download will minimize leftover in case a downloaderlike wget or curl need to be installed + clean_download https://github.com/devcontainers-extra/nanolayer/releases/download/$required_version/$tar_filename $tmp_dir/$tar_filename + + tar xfzv $tmp_dir/$tar_filename -C "$tmp_dir" + chmod a+x $tmp_dir/nanolayer + __nanolayer_location=$tmp_dir/nanolayer + + + else + echo "No binaries compiled for non-x86-linux architectures yet: $(uname -m)" + exit 1 + fi + fi + + # Expose outside the resolved location + export ${variable_name}=$__nanolayer_location + +} + + diff --git a/test/crosstool-ng/test.sh b/test/crosstool-ng/test.sh new file mode 100644 index 0000000..de05c03 --- /dev/null +++ b/test/crosstool-ng/test.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +set -e + +source dev-container-features-test-lib + +check "ct-ng" bash -c "ct-ng version" + +reportResults From dadda5194f62bd345ae274305d5839c699ca2430 Mon Sep 17 00:00:00 2001 From: Florent Valette Date: Fri, 13 Mar 2026 19:59:50 +0000 Subject: [PATCH 4/5] workflow,test: add crosstool-ng feature test --- .github/workflows/test.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 815847c..af71223 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -13,7 +13,7 @@ jobs: strategy: matrix: features: - - crosstool-ng-devel-apt + - crosstool-ng - dtschema baseImage: - debian:latest @@ -34,7 +34,7 @@ jobs: strategy: matrix: features: - - crosstool-ng-devel-apt + - crosstool-ng - dtschema steps: - uses: actions/checkout@v4 From 06988d8c8ff6fd1b11f5d55c077d10f72be72c77 Mon Sep 17 00:00:00 2001 From: Florent Valette Date: Fri, 13 Mar 2026 20:24:45 +0000 Subject: [PATCH 5/5] remove feature crosstool-ng-devel-apt there is no need for a dedicated feature, all deps are in dependsOn node. --- .../devcontainer-feature.json | 7 - src/crosstool-ng-devel-apt/install.sh | 22 --- src/crosstool-ng-devel-apt/library_scripts.sh | 172 ------------------ test/crosstool-ng-devel-apt/test.sh | 16 -- 4 files changed, 217 deletions(-) delete mode 100644 src/crosstool-ng-devel-apt/devcontainer-feature.json delete mode 100644 src/crosstool-ng-devel-apt/install.sh delete mode 100644 src/crosstool-ng-devel-apt/library_scripts.sh delete mode 100644 test/crosstool-ng-devel-apt/test.sh diff --git a/src/crosstool-ng-devel-apt/devcontainer-feature.json b/src/crosstool-ng-devel-apt/devcontainer-feature.json deleted file mode 100644 index 2b2e0a4..0000000 --- a/src/crosstool-ng-devel-apt/devcontainer-feature.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "id": "crosstool-ng-devel-apt", - "version": "1.0.0", - "name": "crosstool-ng devel dependencies (via pipx)", - "documentationURL": "http://github.com/camelot-os/devcontainer-features/tree/main/src/crosstool-ng-devel-apt", - "description": "Install devel dependencies in order to build crosstool-ng" -} diff --git a/src/crosstool-ng-devel-apt/install.sh b/src/crosstool-ng-devel-apt/install.sh deleted file mode 100644 index a2e1c24..0000000 --- a/src/crosstool-ng-devel-apt/install.sh +++ /dev/null @@ -1,22 +0,0 @@ -set -e - -. ./library_scripts.sh - -# nanolayer is a cli utility which keeps container layers as small as possible -# source code: https://github.com/devcontainers-extra/nanolayer -# `ensure_nanolayer` is a bash function that will find any existing nanolayer installations, -# and if missing - will download a temporary copy that automatically get deleted at the end -# of the script -ensure_nanolayer nanolayer_location "v0.5.0" - -crosstool_ng_devel_deps="build-essential,curl,ca-certificates,automake,autoconf,flex,bison,texinfo,help2man,file,gawk,libtool-bin" - -$nanolayer_location \ - install \ - devcontainer-feature \ - "ghcr.io/devcontainers-extra/features/apt-packages:1" \ - --option packages="${crosstool_ng_devel_deps}" \ - --option clean_ppas=true \ - --option preserve_apt_list=true - -echo 'Done!' diff --git a/src/crosstool-ng-devel-apt/library_scripts.sh b/src/crosstool-ng-devel-apt/library_scripts.sh deleted file mode 100644 index 9e1072e..0000000 --- a/src/crosstool-ng-devel-apt/library_scripts.sh +++ /dev/null @@ -1,172 +0,0 @@ - - -clean_download() { - # The purpose of this function is to download a file with minimal impact on container layer size - # this means if no valid downloader is found (curl or wget) then we install a downloader (currently wget) in a - # temporary manner, and making sure to - # 1. uninstall the downloader at the return of the function - # 2. revert back any changes to the package installer database/cache (for example apt-get lists) - # The above steps will minimize the leftovers being created while installing the downloader - # Supported distros: - # debian/ubuntu/alpine - - url=$1 - output_location=$2 - tempdir=$(mktemp -d) - downloader_installed="" - - _apt_get_install() { - tempdir=$1 - - # copy current state of apt list - in order to revert back later (minimize contianer layer size) - cp -p -R /var/lib/apt/lists $tempdir - apt-get update -y - apt-get -y install --no-install-recommends wget ca-certificates - } - - _apt_get_cleanup() { - tempdir=$1 - - echo "removing wget" - apt-get -y purge wget --auto-remove - - echo "revert back apt lists" - rm -rf /var/lib/apt/lists/* - rm -r /var/lib/apt/lists && mv $tempdir/lists /var/lib/apt/lists - } - - _apk_install() { - tempdir=$1 - # copy current state of apk cache - in order to revert back later (minimize contianer layer size) - cp -p -R /var/cache/apk $tempdir - - apk add --no-cache wget - } - - _apk_cleanup() { - tempdir=$1 - - echo "removing wget" - apk del wget - } - # try to use either wget or curl if one of them already installer - if type curl >/dev/null 2>&1; then - downloader=curl - elif type wget >/dev/null 2>&1; then - downloader=wget - else - downloader="" - fi - - # in case none of them is installed, install wget temporarly - if [ -z $downloader ] ; then - if [ -x "/usr/bin/apt-get" ] ; then - _apt_get_install $tempdir - elif [ -x "/sbin/apk" ] ; then - _apk_install $tempdir - else - echo "distro not supported" - exit 1 - fi - downloader="wget" - downloader_installed="true" - fi - - if [ $downloader = "wget" ] ; then - wget -q $url -O $output_location - else - curl -sfL $url -o $output_location - fi - - # NOTE: the cleanup procedure was not implemented using `trap X RETURN` only because - # alpine lack bash, and RETURN is not a valid signal under sh shell - if ! [ -z $downloader_installed ] ; then - if [ -x "/usr/bin/apt-get" ] ; then - _apt_get_cleanup $tempdir - elif [ -x "/sbin/apk" ] ; then - _apk_cleanup $tempdir - else - echo "distro not supported" - exit 1 - fi - fi - -} - - -ensure_nanolayer() { - # Ensure existance of the nanolayer cli program - local variable_name=$1 - - local required_version=$2 - - local __nanolayer_location="" - - # If possible - try to use an already installed nanolayer - if [ -z "${NANOLAYER_FORCE_CLI_INSTALLATION}" ]; then - if [ -z "${NANOLAYER_CLI_LOCATION}" ]; then - if type nanolayer >/dev/null 2>&1; then - echo "Found a pre-existing nanolayer in PATH" - __nanolayer_location=nanolayer - fi - elif [ -f "${NANOLAYER_CLI_LOCATION}" ] && [ -x "${NANOLAYER_CLI_LOCATION}" ] ; then - __nanolayer_location=${NANOLAYER_CLI_LOCATION} - echo "Found a pre-existing nanolayer which were given in env variable: $__nanolayer_location" - fi - - # make sure its of the required version - if ! [ -z "${__nanolayer_location}" ]; then - local current_version - current_version=$($__nanolayer_location --version) - - - if ! [ $current_version == $required_version ]; then - echo "skipping usage of pre-existing nanolayer. (required version $required_version does not match existing version $current_version)" - __nanolayer_location="" - fi - fi - - fi - - # If not previuse installation found, download it temporarly and delete at the end of the script - if [ -z "${__nanolayer_location}" ]; then - - if [ "$(uname -sm)" = 'Linux x86_64' ] || [ "$(uname -sm)" = "Linux aarch64" ]; then - tmp_dir=$(mktemp -d -t nanolayer-XXXXXXXXXX) - - clean_up () { - ARG=$? - rm -rf $tmp_dir - exit $ARG - } - trap clean_up EXIT - - - if [ -x "/sbin/apk" ] ; then - clib_type=musl - else - clib_type=gnu - fi - - tar_filename=nanolayer-"$(uname -m)"-unknown-linux-$clib_type.tgz - - # clean download will minimize leftover in case a downloaderlike wget or curl need to be installed - clean_download https://github.com/devcontainers-extra/nanolayer/releases/download/$required_version/$tar_filename $tmp_dir/$tar_filename - - tar xfzv $tmp_dir/$tar_filename -C "$tmp_dir" - chmod a+x $tmp_dir/nanolayer - __nanolayer_location=$tmp_dir/nanolayer - - - else - echo "No binaries compiled for non-x86-linux architectures yet: $(uname -m)" - exit 1 - fi - fi - - # Expose outside the resolved location - export ${variable_name}=$__nanolayer_location - -} - - diff --git a/test/crosstool-ng-devel-apt/test.sh b/test/crosstool-ng-devel-apt/test.sh deleted file mode 100644 index 8c165d3..0000000 --- a/test/crosstool-ng-devel-apt/test.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -e - -source dev-container-features-test-lib - -check "autoconf" bash -c "autoconf --version" -check "autoheader" bash -c "autoheader --version" -check "awk" bash -c "awk --version" -check "bison" bash -c "bison --version" -check "file" bash -c "file --version" -check "flex" bash -c "flex --version" -check "help2man" bash -c "help2man --version" -check "libtool" bash -c "libtool --version" - -reportResults