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