Docker: Add dockerfile for Linux build environment.
- Dockerfile with getDependencies.sh
- Pipeline stages for Docker lint, build and promote
diff --git a/.gitignore b/.gitignore
index 1cd4dec..fc26914 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@
CMSIS/CoreValidation/Tests/bootloader/build
*.uvguix.*
*.uvmpw.uvgui.*
+docker/dependenciesFiles
diff --git a/Jenkinsfile b/Jenkinsfile
index c0890b5..87cf291 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -1,48 +1,38 @@
@Library("cmsis")
DOCKERINFO = [
- 'linux_staging': [
+ 'staging': [
'registryUrl': 'mcu--docker-staging.eu-west-1.artifactory.aws.arm.com',
'registryCredentialsId': 'artifactory',
'k8sPullSecret': 'artifactory-mcu-docker-staging',
'namespace': 'mcu--docker-staging',
- 'image': 'cmsis_fusa/linux',
+ 'image': 'cmsis/linux',
'label': "${JENKINS_ENV}-${JOB_BASE_NAME}-${BUILD_NUMBER}"
],
- 'linux_production': [
+ 'production': [
'registryUrl': 'mcu--docker.eu-west-1.artifactory.aws.arm.com',
'registryCredentialsId': 'artifactory',
'namespace': 'mcu--docker',
'k8sPullSecret': 'artifactory-mcu-docker',
- 'image': 'cmsis_fusa/linux',
- 'label': 'aws'
- ],
- 'windows_staging': [
- 'registryUrl': 'mcu--docker-staging.eu-west-1.artifactory.aws.arm.com',
- 'registryCredentialsId': 'artifactory',
- 'namespace': 'mcu--docker-staging',
- 'image': 'cmsis_fusa/windows',
- 'label': "${JENKINS_ENV}-${JOB_BASE_NAME}-${BUILD_NUMBER}"
- ],
- 'windows_production': [
- 'registryUrl': 'mcu--docker.eu-west-1.artifactory.aws.arm.com',
- 'registryCredentialsId': 'artifactory',
- 'namespace': 'mcu--docker',
- 'image': 'cmsis_fusa/windows',
- 'label': 'aws'
+ 'image': 'cmsis/linux',
+ 'label': 'latest'
]
]
-dockerinfo_linux = DOCKERINFO['linux_production']
-dockerinfo_windows = DOCKERINFO['windows_production']
+dockerinfo = DOCKERINFO['production']
isPrecommit = (JOB_BASE_NAME == 'pre_commit')
+isPostcommit = (JOB_BASE_NAME == 'post_commit')
isNightly = (JOB_BASE_NAME == 'nightly')
patternGlobal = [
'^Jenkinsfile'
]
+patternDocker = [
+ '^docker/.*'
+]
+
patternCoreM = [
'^CMSIS/Core/Include/.*',
'^Device/ARM/ARMCM.*'
@@ -63,8 +53,22 @@
'adevices': ['CA7', 'CA9neon'],
'devices' : [],
'configs' : [
+ 'AC5': ['low', 'tiny'],
'AC6': ['low', 'tiny'],
- 'AC6LTM': ['low', 'tiny']
+ 'AC6LTM': ['low', 'tiny'],
+ 'GCC': ['low', 'tiny']
+ ]
+ ],
+ 'post_commit': [
+ 'devices' : ['CM0', 'CM0plus', 'CM3', 'CM4', 'CM4FP', 'CM7', 'CM7SP', 'CM7DP',
+ 'CM23', 'CM23S', 'CM23NS', 'CM33', 'CM33S', 'CM33NS',
+ 'CM35P', 'CM35PS', 'CM35PNS',
+ 'CA5', 'CA5neon', 'CA7', 'CA7neon', 'CA9', 'CA9neon'],
+ 'configs' : [
+ 'AC5': ['low', 'tiny'],
+ 'AC6': ['low', 'tiny'],
+ 'AC6LTM': ['low', 'tiny'],
+ 'GCC': ['low', 'tiny']
]
],
'nightly':[
@@ -73,8 +77,10 @@
'CM35P', 'CM35PS', 'CM35PNS',
'CA5', 'CA5neon', 'CA7', 'CA7neon', 'CA9', 'CA9neon'],
'configs' : [
+ 'AC5': ['low', 'mid', 'high', 'size', 'tiny'],
'AC6': ['low', 'mid', 'high', 'size', 'tiny'],
- 'AC6LTM': ['low', 'mid', 'high', 'size', 'tiny']
+ 'AC6LTM': ['low', 'mid', 'high', 'size', 'tiny'],
+ 'GCC': ['low', 'mid', 'high', 'size', 'tiny']
]
]
]
@@ -94,18 +100,26 @@
}
FORCE_BUILD = false
+DOCKER_BUILD = true
CORE_VALIDATION = true
COMMIT = null
VERSION = null
pipeline {
+ agent { label 'master' }
options {
timestamps()
timeout(time: 1, unit: 'HOURS')
ansiColor('xterm')
skipDefaultCheckout()
}
- agent { label 'master' }
+ environment {
+ CI_ACCOUNT = credentials('grasci')
+ ARTIFACTORY = credentials('artifactory')
+ USER = "${CI_ACCOUNT_USR}"
+ PASS = "${CI_ACCOUNT_PSW}"
+ ARTIFACTORY_API_KEY = "${ARTIFACTORY_PSW}"
+ }
stages {
stage('Checkout') {
steps {
@@ -115,45 +129,156 @@
VERSION = (sh(returnStdout: true, script: 'git describe --always')).trim()
echo "VERSION: '${VERSION}'"
}
+
+ dir('docker') {
+ stash name: 'dockerfile', includes: '**'
+ }
}
}
stage('Analyse') {
when {
- expression { return isPrecommit }
+ expression { return isPrecommit || isPostcommit }
beforeOptions true
}
steps {
script {
def fileset = changeset
def hasGlobal = fileSetMatches(fileset, patternGlobal)
+ def hasDocker = fileSetMatches(fileset, patternDocker)
def hasCoreM = fileSetMatches(fileset, patternCoreM)
def hasCoreA = fileSetMatches(fileset, patternCoreA)
def hasCoreValidation = fileSetMatches(fileset, patternCoreValidation)
echo """Change analysis:
- hasGlobal = ${hasGlobal}
+- hasDocker = ${hasDocker}
- hasCoreM = ${hasCoreM}
- hasCoreA = ${hasCoreA}
- hasCoreValidation = ${hasCoreValidation}
"""
- if (hasGlobal || hasCoreM || hasCoreValidation) {
- CONFIGURATION['devices'] += CONFIGURATION['mdevices']
- }
- if (hasGlobal || hasCoreA || hasCoreValidation) {
- CONFIGURATION['devices'] += CONFIGURATION['adevices']
+ if (isPrecommit) {
+ if (hasGlobal || hasDocker || hasCoreM || hasCoreValidation) {
+ CONFIGURATION['devices'] += CONFIGURATION['mdevices']
+ }
+ if (hasGlobal || hasDocker || hasCoreA || hasCoreValidation) {
+ CONFIGURATION['devices'] += CONFIGURATION['adevices']
+ }
}
- CORE_VALIDATION &= hasGlobal || hasCoreM || hasCoreA || hasCoreValidation
-
+ DOCKER_BUILD &= hasDocker
+ CORE_VALIDATION &= hasGlobal || hasDocker || hasCoreM || hasCoreA || hasCoreValidation
+
echo """Stage schedule:
+- DOCKER_BUILD = ${DOCKER_BUILD}
- CORE_VALIDATION = ${CORE_VALIDATION}
"""
}
}
}
+ stage('Docker Lint') {
+ when {
+ expression { return DOCKER_BUILD }
+ beforeOptions true
+ }
+ agent {
+ kubernetes {
+ defaultContainer 'hadolint'
+ slaveConnectTimeout 600
+ yaml """\
+ apiVersion: v1
+ kind: Pod
+ securityContext:
+ runAsUser: 1000
+ runAsGroup: 1000
+ spec:
+ imagePullSecrets:
+ - name: artifactory-mcu-docker
+ securityContext:
+ runAsUser: 1000
+ runAsGroup: 1000
+ containers:
+ - name: hadolint
+ image: mcu--docker.eu-west-1.artifactory.aws.arm.com/hadolint/hadolint:v1.19.0-alpine
+ alwaysPullImage: true
+ imagePullPolicy: Always
+ command:
+ - sleep
+ args:
+ - infinity
+ resources:
+ requests:
+ cpu: 2
+ memory: 2Gi
+ """.stripIndent()
+ }
+ }
+ steps {
+ dir('docker') {
+ unstash 'dockerfile'
+
+ sh 'hadolint --format json dockerfile | tee hadolint.log'
+
+ recordIssues tools: [hadoLint(id: 'hadolint', pattern: 'hadolint.log')],
+ qualityGates: [[threshold: 1, type: 'DELTA', unstable: true]],
+ referenceJobName: 'nightly', ignoreQualityGate: true
+ }
+ }
+ }
+
+ stage('Docker Build') {
+ when {
+ expression { return (isPrecommit || isPostcommit) && DOCKER_BUILD }
+ beforeOptions true
+ }
+ agent {
+ kubernetes {
+ defaultContainer 'docker-dind'
+ slaveConnectTimeout 600
+ yaml """\
+ apiVersion: v1
+ kind: Pod
+ spec:
+ imagePullSecrets:
+ - name: artifactory-mcu-docker
+ containers:
+ - name: docker-dind
+ image: docker:dind
+ securityContext:
+ privileged: true
+ volumeMounts:
+ - name: dind-storage
+ mountPath: /var/lib/docker
+ volumes:
+ - name: dind-storage
+ emptyDir: {}
+ """.stripIndent()
+ }
+ }
+ steps {
+ sh('apk add bash curl git')
+ script {
+ dir('docker') {
+ unstash 'dockerfile'
+
+ dockerinfo = DOCKERINFO['staging']
+ withCredentials([sshUserPrivateKey(credentialsId: 'grasci_with_pk',
+ keyFileVariable: 'grasciPk',
+ passphraseVariable: '',
+ usernameVariable: 'grasciUsername')]) {
+ sh("GIT_SSH_COMMAND='ssh -i $grasciPk -o StrictHostKeyChecking=no' ./getDependencies.sh")
+ }
+ docker.withRegistry("https://${dockerinfo['registryUrl']}", dockerinfo['registryCredentialsId']) {
+ def image = docker.build("${dockerinfo['registryUrl']}/${dockerinfo['image']}:${dockerinfo['label']}", "--build-arg DOCKER_REGISTRY=${dockerinfo['registryUrl']} .")
+ image.push()
+ }
+ }
+ }
+ }
+ }
+
stage('CoreValidation') {
when {
expression { return CORE_VALIDATION }
@@ -184,13 +309,13 @@
kind: Pod
spec:
imagePullSecrets:
- - name: ${dockerinfo_linux['k8sPullSecret']}
+ - name: ${dockerinfo['k8sPullSecret']}
securityContext:
runAsUser: 1000
runAsGroup: 1000
containers:
- name: cmsis
- image: ${dockerinfo_linux['registryUrl']}/${dockerinfo_linux['image']}:${dockerinfo_linux['label']}
+ image: ${dockerinfo['registryUrl']}/${dockerinfo['image']}:${dockerinfo['label']}
alwaysPullImage: true
imagePullPolicy: Always
command:
@@ -243,5 +368,54 @@
}
}
+
+ stage('Docker Promote') {
+ when {
+ expression { return isPostcommit && DOCKER_BUILD }
+ beforeOptions true
+ }
+ agent {
+ kubernetes {
+ defaultContainer 'docker-dind'
+ slaveConnectTimeout 600
+ yaml """\
+ apiVersion: v1
+ kind: Pod
+ spec:
+ imagePullSecrets:
+ - name: artifactory-mcu-docker
+ containers:
+ - name: docker-dind
+ image: docker:dind
+ securityContext:
+ privileged: true
+ volumeMounts:
+ - name: dind-storage
+ mountPath: /var/lib/docker
+ volumes:
+ - name: dind-storage
+ emptyDir: {}
+ """.stripIndent()
+ }
+ }
+ steps {
+ script {
+ String postCommitTag = "${dockerinfo['registryUrl']}/${dockerinfo['image']}:${dockerinfo['label']}"
+ String prodCommitTag = "${DOCKERINFO['production']['registryUrl']}/${DOCKERINFO['production']['image']}:${DOCKERINFO['production']['label']}"
+
+ // Pull & retag Docker Staging Container to Production
+ docker.withRegistry("https://${dockerinfo['registryUrl']}", dockerinfo['registryCredentialsId']) {
+ def image = docker.image("$postCommitTag")
+ image.pull()
+ sh "docker tag $postCommitTag $prodCommitTag"
+ }
+ // Push to Docker Production
+ docker.withRegistry("https://${DOCKERINFO['production']['registryUrl']}", DOCKERINFO['production']['registryCredentialsId']) {
+ def image = docker.image("$prodCommitTag")
+ image.push()
+ }
+ }
+ }
+ }
}
}
diff --git a/docker/dockerfile b/docker/dockerfile
new file mode 100644
index 0000000..4ea6a2b
--- /dev/null
+++ b/docker/dockerfile
@@ -0,0 +1,106 @@
+# Due to bandwidth limitation, we need to keep the base image into our
+# Artifactory Docker Registry. Because we have more than one registry,
+# we need to set during build time which Artifactory Docker Registry to use.
+ARG DOCKER_REGISTRY
+FROM ${DOCKER_REGISTRY}/ubuntu:focal
+
+# jenkins user needs to be present to work on CI
+# User 1000 for Kubernetes
+RUN useradd -u 1000 -U -m -c Jenkins jenkins
+
+# install packages from official Ubuntu repo
+ENV DEBIAN_FRONTEND=noninteractive
+RUN apt-get update && \
+ apt-get install --no-install-recommends -y \
+ bc=1.07.1-2build1 \
+ build-essential=12.8ubuntu1.1 \
+ curl=7.68.0-1ubuntu2.5 \
+ dos2unix=7.4.0-2 \
+ git=1:2.25.1-1ubuntu3.1 \
+ lib32stdc++6=10.2.0-5ubuntu1~20.04 \
+ mscgen=0.20-12 \
+ p7zip-full=16.02+dfsg-7build1 \
+ python3=3.8.2-0ubuntu2 \
+ python3-pip=20.0.2-5ubuntu1.3 \
+ tar=1.30+dfsg-7ubuntu0.20.04.1 \
+ unzip=6.0-25ubuntu1 \
+ wget=1.20.3-1ubuntu1 \
+ libxml2-utils=2.9.10+dfsg-5 \
+ zip=3.0-11build1 && \
+ apt-get autoremove -y && \
+ apt-get autoclean -y && \
+ rm -rf /var/lib/apt/lists/*
+
+# Create build ARGs for installer files & versions
+ARG ARMCC=ArmCompiler-5.06u7-linux.sh
+ARG ARMCLANG=ArmCompiler-6.16-linux-x86_64.sh
+ARG ARMCLANGLTM=ArmCompiler-6.6.4-linux-x86_64.sh
+ARG GCC=gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
+ARG DOXYGEN=doxygen_1.8.6-2_amd64.deb
+ARG FASTMODELS=fvp-11.12-linux-x86_64.tar.gz
+
+# Including dependency folder
+ARG DEPENDENCIESFOLDER=dependenciesFiles
+ARG TOOLS_PATH=/opt
+ARG INSTALLER_PATH=/tmp/dependenciesFiles
+RUN mkdir -p ${INSTALLER_PATH}
+COPY dependenciesFiles/ ${INSTALLER_PATH}
+
+# install & setup armcc
+RUN ${INSTALLER_PATH}/${ARMCC} --i-agree-to-the-contained-eula --no-interactive -v -d ${TOOLS_PATH}/armcc
+ENV PATH=${PATH}:${TOOLS_PATH}/armcc/bin
+ENV CI_ARMCC5_TOOLCHAIN_ROOT=${TOOLS_PATH}/armclang/bin
+
+# install & setup armclang
+RUN ${INSTALLER_PATH}/${ARMCLANG} --i-agree-to-the-contained-eula --no-interactive -v -d ${TOOLS_PATH}/armclang
+ENV PATH=${PATH}:${TOOLS_PATH}/armclang/bin
+ENV CI_ARMCC6_TOOLCHAIN_ROOT=${TOOLS_PATH}/armclang/bin
+
+# install & setup armclang ltm
+RUN ${INSTALLER_PATH}/${ARMCLANGLTM} --i-agree-to-the-contained-eula --no-interactive -v -d ${TOOLS_PATH}/armclangltm
+ENV CI_ARMCC6LTM_TOOLCHAIN_ROOT=${TOOLS_PATH}/armclangltm/bin
+
+# install & setup gcc
+RUN mkdir -p ${TOOLS_PATH}
+WORKDIR ${TOOLS_PATH}
+RUN tar -xvf ${INSTALLER_PATH}/${GCC}
+ENV PATH=${PATH}:${TOOLS_PATH}/gcc-arm-none-eabi-10-2020-q4-major/bin
+ENV CI_GCC_TOOLCHAIN_ROOT=${TOOLS_PATH}/gcc-arm-none-eabi-10-2020-q4-major/bin
+WORKDIR /
+
+# install fast models 11.12
+RUN mkdir -p ${TOOLS_PATH}/fvp/
+WORKDIR ${TOOLS_PATH}/fvp/
+RUN tar -xvf ${INSTALLER_PATH}/${FASTMODELS}
+ENV PATH=${PATH}:${TOOLS_PATH}/fvp
+WORKDIR /
+
+# install doxygen
+RUN dpkg -i ${INSTALLER_PATH}/${DOXYGEN}
+
+# install PackChk
+RUN cp ${INSTALLER_PATH}/PackChk /usr/local/bin/PackChk
+RUN chmod +x /usr/local/bin/PackChk
+
+# install Python requirements
+COPY requirements.txt ${INSTALLER_PATH}/
+RUN python3 -m pip install --no-cache-dir -r ${INSTALLER_PATH}/requirements.txt
+
+# install buildtools
+RUN python3 -m pip install --no-cache-dir -r ${INSTALLER_PATH}/buildtools/requirements.txt
+RUN mv ${INSTALLER_PATH}/buildtools ${TOOLS_PATH}
+COPY rtebuild /home/jenkins/.rtebuild
+COPY rtebuild /root/.rtebuild
+ENV PATH=${PATH}:${TOOLS_PATH}/buildtools
+
+# install python-matrix-runner
+# hadolint disable=DL3013
+RUN python3 -m pip install ${INSTALLER_PATH}/python-matrix-runner
+
+# set ARMLMD_LICENSE_FILE for ARM compilers
+ENV ARMLMD_LICENSE_FILE="7010@euhpc-lic-armlmd.euhpc.arm.com:7010@euhpc-lic03.euhpc.arm.com:7010@euhpc-lic05.euhpc.arm.com:7010@euhpc-lic07.euhpc.arm.com"
+
+# remove dependency folder
+RUN rm -rf ${INSTALLER_PATH}
+
+CMD ["bash"]
\ No newline at end of file
diff --git a/docker/getDependencies.sh b/docker/getDependencies.sh
new file mode 100755
index 0000000..9e52cff
--- /dev/null
+++ b/docker/getDependencies.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+# local variables
+DEPENDENCIES_FOLDER=dependenciesFiles
+ARTIFACTORY_URL=https://eu-west-1.artifactory.aws.arm.com:443/artifactory
+ARTIFACTORY_DEPOT=mcu.depot/ci/depot
+PACKCHK_VERSION=1.3.93
+
+if [ -z "$ARTIFACTORY_API_KEY" ]; then
+ echo "Please set your Artifactory ARTIFACTORY_API_KEY"
+ exit 1
+fi
+
+if [ -z "$USER" ]; then
+ echo "Please set your short ARM user e.g. sampel01"
+ exit 1
+fi
+
+function downloadFromArtifactory {
+ filename=$(basename $1)
+ echo "Fetching ${filename} ..."
+ if [[ -f "${filename}" ]]; then
+ sha256sum=$(curl -s -I -H "X-JFrog-Art-Api:$ARTIFACTORY_API_KEY" "${ARTIFACTORY_URL}/${1}" | grep "X-Checksum-Sha256" | cut -d" " -f2)
+ if echo "${sha256sum} *${filename}" | sha256sum -c --status; then
+ echo " ... already up to date"
+ else
+ rm ${filename}
+ fi
+ fi
+ if [[ ! -f "${filename}" ]]; then
+ curl -C - -H "X-JFrog-Art-Api:$ARTIFACTORY_API_KEY" -O "${ARTIFACTORY_URL}/${1}"
+ chmod +x ${filename}
+ fi
+}
+
+function downloadFromDepot {
+ downloadFromArtifactory "${ARTIFACTORY_DEPOT}/${1}"
+}
+
+function gitClone {
+ echo "Cloning/updating ${2} ..."
+ if [[ ! -d "${2}" ]]; then
+ git clone -b $3 $1 $2
+ else
+ pushd $2
+ git clean -fdx
+ git checkout -f $3
+ git pull origin $3
+ popd
+ fi
+}
+
+mkdir -p $DEPENDENCIES_FOLDER
+pushd $DEPENDENCIES_FOLDER || exit
+
+downloadFromDepot "doxygen_1.8.6-2_amd64.deb"
+downloadFromDepot "ArmCompiler-5.06u7-linux.sh"
+downloadFromDepot "ArmCompiler-6.16-linux-x86_64.sh"
+downloadFromDepot "ArmCompiler-6.6.4-linux-x86_64.sh"
+downloadFromDepot "gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2"
+downloadFromDepot "fvp-11.12-linux-x86_64.tar.gz"
+downloadFromArtifactory "mcu.promoted/staging/devtools/tools/packchk/${PACKCHK_VERSION}/linux64/PackChk"
+
+gitClone "ssh://${USER}@eu-gerrit-1.euhpc.arm.com:29418/dsg/cmsis/buildtools" "buildtools" "master"
+gitClone "ssh://${USER}@eu-gerrit-1.euhpc.arm.com:29418/scratch/jonant01/python-matrix-runner" "python-matrix-runner" "master"
+
+popd || exit
diff --git a/docker/requirements.txt b/docker/requirements.txt
new file mode 100644
index 0000000..7fc77dd
--- /dev/null
+++ b/docker/requirements.txt
@@ -0,0 +1,5 @@
+gcovr~=4.2
+junit-xml~=1.9
+jira~=2.0
+junitparser~=1.4
+Jinja2~=2.11
diff --git a/docker/rtebuild/armcc.rtebuild b/docker/rtebuild/armcc.rtebuild
new file mode 100644
index 0000000..a18f15d
--- /dev/null
+++ b/docker/rtebuild/armcc.rtebuild
@@ -0,0 +1,27 @@
+toolchain:
+ ARMCC5:
+ env:
+ PATH : [ "/opt/armcc/bin" ]
+ rte:
+ Tcompiler: "ARMCC"
+ Toptions : "AC5"
+ ccompiler:
+ cmd : "armcc"
+ cmdfile : "--via \""
+ input : "\""
+ output : "-o \""
+ include : "-I\""
+ define : "-D"
+ assembler:
+ cmd : "armasm"
+ cmdfile : "--via \""
+ input : "\""
+ output : "-o \""
+ include : "-I\""
+ define : "--pd \"%{str.join(' SETA ', (str.split(value, '=') + [ '1' ])[0:2])}\""
+ linker:
+ cmd : "armlink"
+ cmdfile : "--via \""
+ input : "\""
+ output : "-o \""
+ script : "--scatter=\""
diff --git a/docker/rtebuild/armclang.rtebuild b/docker/rtebuild/armclang.rtebuild
new file mode 100644
index 0000000..948191d
--- /dev/null
+++ b/docker/rtebuild/armclang.rtebuild
@@ -0,0 +1,63 @@
+toolchain:
+ ARMCC6:
+ env:
+ PATH : [ "/opt/armclang/bin" ]
+ rte:
+ Tcompiler: "ARMCC"
+ Toptions : "AC6"
+ ccompiler:
+ cmd : "armclang"
+ cmdfile : "@\""
+ input : "\""
+ output : "-o \""
+ include : "-I\""
+ define : "-D"
+ assembler:
+ cmd : "armclang"
+ cmdfile : "@\""
+ input : "\""
+ output : "-o \""
+ include : "-I\""
+ define : "-D"
+ linker:
+ cmd : "armclang"
+ cmdfile : "@\""
+ input : "\""
+ output : "-o \""
+ script : "-Wl,--scatter=\""
+ librarian:
+ cmd : "armar"
+ cmdfile : "--Via \""
+ input : "\""
+ output : "--create \""
+ ARMCC6_MDK:
+ env:
+ PATH : [ "/opt/armclang/bin" ]
+ rte:
+ Tcompiler: "ARMCC"
+ Toptions : "AC6"
+ ccompiler:
+ cmd : "armclang"
+ cmdfile : "@\""
+ input : "\""
+ output : "-o \""
+ include : "-I\""
+ define : "-D"
+ assembler:
+ cmd : "armasm"
+ cmdfile : "--Via \""
+ input : "\""
+ output : "-o \""
+ include : "-I\""
+ define : "--pd \"%{value.replace('=', ' SETA ') if '=' in value else value+' SETA 1'}\""
+ linker:
+ cmd : "armlink"
+ cmdfile : "--Via \""
+ input : "\""
+ output : "-o \""
+ script : "--scatter=\""
+ librarian:
+ cmd : "armar"
+ cmdfile : "--Via \""
+ input : "\""
+ output : "--create \""
diff --git a/docker/rtebuild/armclang_ltm.rtebuild b/docker/rtebuild/armclang_ltm.rtebuild
new file mode 100644
index 0000000..b688202
--- /dev/null
+++ b/docker/rtebuild/armclang_ltm.rtebuild
@@ -0,0 +1,63 @@
+toolchain:
+ ARMCC6_LTM:
+ env:
+ PATH : [ "/opt/armclangltm/bin" ]
+ rte:
+ Tcompiler: "ARMCC"
+ Toptions : "AC6"
+ ccompiler:
+ cmd : "armclang"
+ cmdfile : "@\""
+ input : "\""
+ output : "-o \""
+ include : "-I\""
+ define : "-D"
+ assembler:
+ cmd : "armclang"
+ cmdfile : "@\""
+ input : "\""
+ output : "-o \""
+ include : "-I\""
+ define : "-D"
+ linker:
+ cmd : "armclang"
+ cmdfile : "@\""
+ input : "\""
+ output : "-o \""
+ script : "-Wl,--scatter=\""
+ librarian:
+ cmd : "armar"
+ cmdfile : "--Via \""
+ input : "\""
+ output : "--create \""
+ ARMCC6_LTM_MDK:
+ env:
+ PATH : [ "/opt/armclangltm/bin" ]
+ rte:
+ Tcompiler: "ARMCC"
+ Toptions : "AC6"
+ ccompiler:
+ cmd : "armclang"
+ cmdfile : "@\""
+ input : "\""
+ output : "-o \""
+ include : "-I\""
+ define : "-D"
+ assembler:
+ cmd : "armasm"
+ cmdfile : "--Via \""
+ input : "\""
+ output : "-o \""
+ include : "-I\""
+ define : "--pd \"%{value.replace('=', ' SETA ') if '=' in value else value+' SETA 1'}\""
+ linker:
+ cmd : "armlink"
+ cmdfile : "--Via \""
+ input : "\""
+ output : "-o \""
+ script : "--scatter=\""
+ librarian:
+ cmd : "armar"
+ cmdfile : "--Via \""
+ input : "\""
+ output : "--create \""
diff --git a/docker/rtebuild/gcc.rtebuild b/docker/rtebuild/gcc.rtebuild
new file mode 100644
index 0000000..a9e5af6
--- /dev/null
+++ b/docker/rtebuild/gcc.rtebuild
@@ -0,0 +1,27 @@
+toolchain:
+ GCC:
+ env:
+ PATH : [ "/opt/gcc-arm-none-eabi-10-2020-q4-major/bin" ]
+ rte:
+ Tcompiler: "GCC"
+ Toptions : ""
+ ccompiler:
+ cmd : "arm-none-eabi-gcc"
+ cmdfile : "@\""
+ input : "\""
+ output : "-o \""
+ include : "-I\""
+ define : "-D"
+ assembler:
+ cmd : "arm-none-eabi-gcc"
+ cmdfile : "@\""
+ input : "\""
+ output : "-o \""
+ include : "-I\""
+ define : "-D"
+ linker:
+ cmd : "arm-none-eabi-gcc"
+ cmdfile : "@\""
+ input : "\""
+ output : "-o \""
+ script : "-T \""
diff --git a/docker/rtebuild/toolchain.rtebuild b/docker/rtebuild/toolchain.rtebuild
new file mode 100644
index 0000000..8970170
--- /dev/null
+++ b/docker/rtebuild/toolchain.rtebuild
@@ -0,0 +1,6 @@
+packdir: ${home}/.rtebuild/PACK
+import:
+ - armcc.rtebuild
+ - armclang.rtebuild
+ - armclang_ltm.rtebuild
+ - gcc.rtebuild