From faeeaf61a4072fa26c8d9ed5c57a4fae8cced74e Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Fri, 7 Apr 2023 22:20:09 +0000 Subject: [PATCH 1/3] Upgrade mariner images to LLVM 16 --- .../2.0/cross/amd64-alpine/Dockerfile | 2 +- src/cbl-mariner/2.0/cross/amd64/Dockerfile | 32 ++++++++++++++++--- src/cbl-mariner/2.0/cross/arm/Dockerfile | 15 ++++----- .../2.0/cross/arm64-alpine/Dockerfile | 2 +- src/cbl-mariner/2.0/cross/arm64/Dockerfile | 19 +++++------ src/cbl-mariner/2.0/cross/x86/Dockerfile | 24 +++++--------- .../2.0/crossdeps-amd64/Dockerfile | 6 ---- .../2.0/crossdeps-builder/Dockerfile | 6 ++-- .../Dockerfile | 0 src/cbl-mariner/manifest.json | 24 +++----------- 10 files changed, 58 insertions(+), 72 deletions(-) delete mode 100644 src/cbl-mariner/2.0/crossdeps-amd64/Dockerfile rename src/cbl-mariner/2.0/{crossdeps-arm => crossdeps-llvm}/Dockerfile (100%) diff --git a/src/cbl-mariner/2.0/cross/amd64-alpine/Dockerfile b/src/cbl-mariner/2.0/cross/amd64-alpine/Dockerfile index 69a574000..f1442a896 100644 --- a/src/cbl-mariner/2.0/cross/amd64-alpine/Dockerfile +++ b/src/cbl-mariner/2.0/cross/amd64-alpine/Dockerfile @@ -4,7 +4,7 @@ ARG ROOTFS_DIR=/crossrootfs/x64 RUN /scripts/eng/common/cross/build-rootfs.sh x64 alpine3.13 --skipunmount -FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-amd64-local +FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-llvm-local ARG ROOTFS_DIR=/crossrootfs/x64 COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR diff --git a/src/cbl-mariner/2.0/cross/amd64/Dockerfile b/src/cbl-mariner/2.0/cross/amd64/Dockerfile index ac52987cf..36ea09cad 100644 --- a/src/cbl-mariner/2.0/cross/amd64/Dockerfile +++ b/src/cbl-mariner/2.0/cross/amd64/Dockerfile @@ -4,11 +4,33 @@ ARG ROOTFS_DIR=/crossrootfs/x64 RUN /scripts/eng/common/cross/build-rootfs.sh x64 xenial --skipunmount -FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-amd64-local +# Build compiler-rt profile library for PGO instrumentation +RUN mkdir compiler-rt_build && cd compiler-rt_build && \ + cmake ../llvm-project.src/compiler-rt \ + -DCOMPILER_RT_BUILD_PROFILE=ON \ + -DCOMPILER_RT_BUILD_BUILTINS=OFF \ + -DCOMPILER_RT_BUILD_CRT=OFF \ + -DCOMPILER_RT_BUILD_MEMPROF=OFF \ + -DCOMPILER_RT_BUILD_GWP_ASAN=OFF \ + -DCOMPILER_RT_BUILD_SANITIZERS=OFF \ + -DCOMPILER_RT_BUILD_XRAY=OFF \ + -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \ + -DCOMPILER_RT_BUILD_ORC=OFF \ + \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ + -DCMAKE_C_COMPILER_TARGET="x86_64-linux-gnu" \ + -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_C_FLAGS="-v --sysroot=$ROOTFS_DIR" && \ + make -j $(getconf _NPROCESSORS_ONLN) + +RUN LLVM_VERSION=16.0.0 LLVM_VERSION_MAJOR="${LLVM_VERSION%%.*}" && \ + mkdir -p $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ && \ + cp compiler-rt_build/lib/linux/libclang_rt.profile-x86_64.a $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ + + +FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-llvm-local ARG ROOTFS_DIR=/crossrootfs/x64 COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR - -RUN LLVM_VERSION=12.0.1 LLVM_VERSION_MAJOR="${LLVM_VERSION%%.*}" && \ - mkdir -p $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ && \ - cp /usr/lib/clang/${LLVM_VERSION}/lib/linux/libclang_rt.profile-x86_64.a $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ diff --git a/src/cbl-mariner/2.0/cross/arm/Dockerfile b/src/cbl-mariner/2.0/cross/arm/Dockerfile index 623520852..00700f562 100644 --- a/src/cbl-mariner/2.0/cross/arm/Dockerfile +++ b/src/cbl-mariner/2.0/cross/arm/Dockerfile @@ -7,26 +7,23 @@ RUN /scripts/eng/common/cross/build-rootfs.sh arm xenial --skipunmount # Build compiler-rt profile library for PGO instrumentation RUN mkdir compiler-rt_build && cd compiler-rt_build && \ - BUILD_FLAGS="-v --sysroot=$ROOTFS_DIR" \ - TARGET_TRIPLE=arm-linux-gnueabihf && \ cmake ../llvm-project.src/compiler-rt \ -DCOMPILER_RT_BUILD_PROFILE=ON \ -DCOMPILER_RT_BUILD_BUILTINS=OFF \ + -DCOMPILER_RT_BUILD_CRT=OFF \ + -DCOMPILER_RT_BUILD_MEMPROF=OFF \ + -DCOMPILER_RT_BUILD_GWP_ASAN=OFF \ -DCOMPILER_RT_BUILD_SANITIZERS=OFF \ -DCOMPILER_RT_BUILD_XRAY=OFF \ -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \ + -DCOMPILER_RT_BUILD_ORC=OFF \ \ -DCMAKE_C_COMPILER=clang \ - -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ - -DCMAKE_C_COMPILER_TARGET=${TARGET_TRIPLE} \ - -DCMAKE_CXX_COMPILER_TARGET=${TARGET_TRIPLE} \ - -DLLVM_CONFIG_PATH=llvm-config \ + -DCMAKE_C_COMPILER_TARGET="arm-linux-gnueabihf" \ -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \ -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=$ROOTFS_DIR/usr \ - -DCMAKE_C_FLAGS="${BUILD_FLAGS}" \ - -DCMAKE_CXX_FLAGS="${BUILD_FLAGS}" && \ + -DCMAKE_C_FLAGS="-v --sysroot=$ROOTFS_DIR" && \ make -j $(getconf _NPROCESSORS_ONLN) RUN LLVM_VERSION=12.0.1 LLVM_VERSION_MAJOR="${LLVM_VERSION%%.*}" && \ diff --git a/src/cbl-mariner/2.0/cross/arm64-alpine/Dockerfile b/src/cbl-mariner/2.0/cross/arm64-alpine/Dockerfile index 3dd593c46..96d415fb5 100644 --- a/src/cbl-mariner/2.0/cross/arm64-alpine/Dockerfile +++ b/src/cbl-mariner/2.0/cross/arm64-alpine/Dockerfile @@ -4,7 +4,7 @@ ARG ROOTFS_DIR=/crossrootfs/arm64 RUN /scripts/eng/common/cross/build-rootfs.sh arm64 alpine3.13 --skipunmount -FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-arm-local +FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-llvm-local ARG ROOTFS_DIR=/crossrootfs/arm64 COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR diff --git a/src/cbl-mariner/2.0/cross/arm64/Dockerfile b/src/cbl-mariner/2.0/cross/arm64/Dockerfile index b9d48ccab..f7ba929bb 100644 --- a/src/cbl-mariner/2.0/cross/arm64/Dockerfile +++ b/src/cbl-mariner/2.0/cross/arm64/Dockerfile @@ -5,34 +5,31 @@ RUN /scripts/eng/common/cross/build-rootfs.sh arm64 xenial --skipunmount # Build compiler-rt profile library for PGO instrumentation RUN mkdir compiler-rt_build && cd compiler-rt_build && \ - BUILD_FLAGS="-v --sysroot=$ROOTFS_DIR" \ - TARGET_TRIPLE=aarch64-linux-gnu && \ cmake ../llvm-project.src/compiler-rt \ -DCOMPILER_RT_BUILD_PROFILE=ON \ -DCOMPILER_RT_BUILD_BUILTINS=OFF \ + -DCOMPILER_RT_BUILD_CRT=OFF \ + -DCOMPILER_RT_BUILD_MEMPROF=OFF \ + -DCOMPILER_RT_BUILD_GWP_ASAN=OFF \ -DCOMPILER_RT_BUILD_SANITIZERS=OFF \ -DCOMPILER_RT_BUILD_XRAY=OFF \ -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \ + -DCOMPILER_RT_BUILD_ORC=OFF \ \ -DCMAKE_C_COMPILER=clang \ - -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ - -DCMAKE_C_COMPILER_TARGET=${TARGET_TRIPLE} \ - -DCMAKE_CXX_COMPILER_TARGET=${TARGET_TRIPLE} \ - -DLLVM_CONFIG_PATH=llvm-config \ + -DCMAKE_C_COMPILER_TARGET="aarch64-linux-gnu" \ -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \ -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=$ROOTFS_DIR/usr \ - -DCMAKE_C_FLAGS="${BUILD_FLAGS}" \ - -DCMAKE_CXX_FLAGS="${BUILD_FLAGS}" && \ + -DCMAKE_C_FLAGS="-v --sysroot=$ROOTFS_DIR" && \ make -j $(getconf _NPROCESSORS_ONLN) -RUN LLVM_VERSION=12.0.1 LLVM_VERSION_MAJOR="${LLVM_VERSION%%.*}" && \ +RUN LLVM_VERSION=16.0.0 LLVM_VERSION_MAJOR="${LLVM_VERSION%%.*}" && \ mkdir -p $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ && \ cp compiler-rt_build/lib/linux/libclang_rt.profile-aarch64.a $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ -FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-arm-local +FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-llvm-local ARG ROOTFS_DIR=/crossrootfs/arm64 COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR diff --git a/src/cbl-mariner/2.0/cross/x86/Dockerfile b/src/cbl-mariner/2.0/cross/x86/Dockerfile index 4e40dc702..1176bb118 100644 --- a/src/cbl-mariner/2.0/cross/x86/Dockerfile +++ b/src/cbl-mariner/2.0/cross/x86/Dockerfile @@ -1,43 +1,35 @@ FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-builder-local AS builder ARG ROOTFS_DIR=/crossrootfs/x86 -# Provides LLVMConfig.cmake, needed to build compiler-rt. Only needed on x86. -# x64 doesn't need this because we use compiler-rt from the mariner package. -# arm/arm64 don't need this because LLVMConfig.cmake is provided by the LLVM we build from source. -RUN tdnf install -y llvm-devel - RUN /scripts/eng/common/cross/build-rootfs.sh x86 xenial --skipunmount # Build compiler-rt profile library for PGO instrumentation RUN mkdir compiler-rt_build && cd compiler-rt_build && \ - BUILD_FLAGS="-v --sysroot=$ROOTFS_DIR" \ - TARGET_TRIPLE=i386-linux-gnu && \ cmake ../llvm-project.src/compiler-rt \ -DCOMPILER_RT_BUILD_PROFILE=ON \ -DCOMPILER_RT_BUILD_BUILTINS=OFF \ + -DCOMPILER_RT_BUILD_CRT=OFF \ + -DCOMPILER_RT_BUILD_MEMPROF=OFF \ + -DCOMPILER_RT_BUILD_GWP_ASAN=OFF \ -DCOMPILER_RT_BUILD_SANITIZERS=OFF \ -DCOMPILER_RT_BUILD_XRAY=OFF \ -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \ + -DCOMPILER_RT_BUILD_ORC=OFF \ \ -DCMAKE_C_COMPILER=clang \ - -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ - -DCMAKE_C_COMPILER_TARGET=${TARGET_TRIPLE} \ - -DCMAKE_CXX_COMPILER_TARGET=${TARGET_TRIPLE} \ - -DLLVM_CONFIG_PATH=llvm-config \ + -DCMAKE_C_COMPILER_TARGET="i386-linux-gnu" \ -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \ -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=$ROOTFS_DIR/usr \ - -DCMAKE_C_FLAGS="${BUILD_FLAGS}" \ - -DCMAKE_CXX_FLAGS="${BUILD_FLAGS}" && \ + -DCMAKE_C_FLAGS="-v --sysroot=$ROOTFS_DIR" && \ make -j $(getconf _NPROCESSORS_ONLN) -RUN LLVM_VERSION=12.0.1 LLVM_VERSION_MAJOR="${LLVM_VERSION%%.*}" && \ +RUN LLVM_VERSION=16.0.0 LLVM_VERSION_MAJOR="${LLVM_VERSION%%.*}" && \ mkdir -p $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ && \ cp compiler-rt_build/lib/linux/libclang_rt.profile-i386.a $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ -FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-amd64-local +FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-llvm-local ARG ROOTFS_DIR=/crossrootfs/x86 COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR diff --git a/src/cbl-mariner/2.0/crossdeps-amd64/Dockerfile b/src/cbl-mariner/2.0/crossdeps-amd64/Dockerfile deleted file mode 100644 index 9a115b3ed..000000000 --- a/src/cbl-mariner/2.0/crossdeps-amd64/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-local - -RUN tdnf install -y \ - clang \ - lld \ - compiler-rt diff --git a/src/cbl-mariner/2.0/crossdeps-builder/Dockerfile b/src/cbl-mariner/2.0/crossdeps-builder/Dockerfile index 5d3a7bac8..972daa1a2 100644 --- a/src/cbl-mariner/2.0/crossdeps-builder/Dockerfile +++ b/src/cbl-mariner/2.0/crossdeps-builder/Dockerfile @@ -38,11 +38,11 @@ RUN wget https://releases.llvm.org/release-keys.asc && \ gpg --output release-keys.gpg --dearmor release-keys.asc && \ rm release-keys.asc && \ # 2. Download llvm sources and signature, and verify signature - LLVM_VERSION=12.0.1 && \ + LLVM_VERSION=16.0.0 && \ wget -O llvm-project.src.tar.xz.sig https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-project-${LLVM_VERSION}.src.tar.xz.sig && \ - echo "6cc956d622a7d3d746de0d71d8ca616a6c291e2c561703ac7a9535f38b999955 llvm-project.src.tar.xz.sig" | sha256sum -c && \ + echo "2fa1ae520c6756fb53ede6bd9359f7e40fe5d0bfdbd04c359f3b8ce22958a896 llvm-project.src.tar.xz.sig" | sha256sum -c && \ wget -O llvm-project.src.tar.xz https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-project-${LLVM_VERSION}.src.tar.xz && \ - echo "129cb25cd13677aad951ce5c2deb0fe4afc1e9d98950f53b51bdcfb5a73afa0e llvm-project.src.tar.xz" | sha256sum -c && \ + echo "9a56d906a2c81f16f06efc493a646d497c53c2f4f28f0cb1f3c8da7f74350254 llvm-project.src.tar.xz" | sha256sum -c && \ gpg --keyring /release-keys.gpg --verify llvm-project.src.tar.xz.sig && \ rm llvm-project.src.tar.xz.sig diff --git a/src/cbl-mariner/2.0/crossdeps-arm/Dockerfile b/src/cbl-mariner/2.0/crossdeps-llvm/Dockerfile similarity index 100% rename from src/cbl-mariner/2.0/crossdeps-arm/Dockerfile rename to src/cbl-mariner/2.0/crossdeps-llvm/Dockerfile diff --git a/src/cbl-mariner/manifest.json b/src/cbl-mariner/manifest.json index 04b073966..9d6b58ff5 100644 --- a/src/cbl-mariner/manifest.json +++ b/src/cbl-mariner/manifest.json @@ -77,29 +77,13 @@ { "platforms": [ { - "dockerfile": "src/cbl-mariner/2.0/crossdeps-amd64", + "dockerfile": "src/cbl-mariner/2.0/crossdeps-llvm", "os": "linux", "osVersion": "cbl-mariner2.0", "tags": { - "cbl-mariner-2.0-crossdeps-amd64-$(System:TimeStamp)-$(System:DockerfileGitCommitSha)": {}, - "cbl-mariner-2.0-crossdeps-amd64$(FloatingTagSuffix)": {}, - "cbl-mariner-2.0-crossdeps-amd64-local": { - "isLocal": true - } - } - } - ] - }, - { - "platforms": [ - { - "dockerfile": "src/cbl-mariner/2.0/crossdeps-arm", - "os": "linux", - "osVersion": "cbl-mariner2.0", - "tags": { - "cbl-mariner-2.0-crossdeps-arm-$(System:TimeStamp)-$(System:DockerfileGitCommitSha)": {}, - "cbl-mariner-2.0-crossdeps-arm$(FloatingTagSuffix)": {}, - "cbl-mariner-2.0-crossdeps-arm-local": { + "cbl-mariner-2.0-crossdeps-llvm-$(System:TimeStamp)-$(System:DockerfileGitCommitSha)": {}, + "cbl-mariner-2.0-crossdeps-llvm$(FloatingTagSuffix)": {}, + "cbl-mariner-2.0-crossdeps-llvm-local": { "isLocal": true } } From 186874a10996c96551e22dd74c277294793ba040 Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Fri, 7 Apr 2023 23:16:41 +0000 Subject: [PATCH 2/3] Fix arm image --- src/cbl-mariner/2.0/cross/arm/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cbl-mariner/2.0/cross/arm/Dockerfile b/src/cbl-mariner/2.0/cross/arm/Dockerfile index 00700f562..8b5c5666a 100644 --- a/src/cbl-mariner/2.0/cross/arm/Dockerfile +++ b/src/cbl-mariner/2.0/cross/arm/Dockerfile @@ -26,12 +26,12 @@ RUN mkdir compiler-rt_build && cd compiler-rt_build && \ -DCMAKE_C_FLAGS="-v --sysroot=$ROOTFS_DIR" && \ make -j $(getconf _NPROCESSORS_ONLN) -RUN LLVM_VERSION=12.0.1 LLVM_VERSION_MAJOR="${LLVM_VERSION%%.*}" && \ +RUN LLVM_VERSION=16.0.0 LLVM_VERSION_MAJOR="${LLVM_VERSION%%.*}" && \ mkdir -p $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ && \ cp compiler-rt_build/lib/linux/libclang_rt.profile-armhf.a $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ -FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-arm-local +FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-llvm-local ARG ROOTFS_DIR=/crossrootfs/arm COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR From ad96c47443e25631bb60870fd96b47a45e0fcb8d Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Mon, 10 Apr 2023 16:05:16 +0000 Subject: [PATCH 3/3] Fix arm-alpine image --- src/cbl-mariner/2.0/cross/arm-alpine/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cbl-mariner/2.0/cross/arm-alpine/Dockerfile b/src/cbl-mariner/2.0/cross/arm-alpine/Dockerfile index 79ed300fd..0ed2026d6 100644 --- a/src/cbl-mariner/2.0/cross/arm-alpine/Dockerfile +++ b/src/cbl-mariner/2.0/cross/arm-alpine/Dockerfile @@ -4,7 +4,7 @@ ARG ROOTFS_DIR=/crossrootfs/arm RUN /scripts/eng/common/cross/build-rootfs.sh arm alpine3.13 --skipunmount -FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-arm-local +FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-llvm-local ARG ROOTFS_DIR=/crossrootfs/arm COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR