Improvements to the build system imported from other projects

This commit is contained in:
Héctor Molinero Fernández
2019-09-02 21:52:36 +02:00
parent 3657a753e1
commit 357e5c5c9b
7 changed files with 127 additions and 127 deletions

4
.github/FUNDING.yml vendored
View File

@@ -1,3 +1 @@
# These are supported funding model platforms custom: https://hector.molinero.dev/donate
custom: https://www.paypal.me/hectormf

View File

@@ -1,137 +1,137 @@
image: docker:stable image: "docker.io/docker:stable"
services: services:
- docker:dind - "docker:dind"
stages: stages:
- build:images - "build:images"
- push:images - "push:images"
- push:manifests - "push:manifests"
variables: variables:
DOCKER_HOST: tcp://docker:2375 DOCKER_HOST: "tcp://docker:2375"
DOCKER_DRIVER: overlay2 DOCKER_DRIVER: "overlay2"
build:native-image: build:native-image:
stage: build:images stage: "build:images"
before_script: before_script:
- docker info - "docker info"
- apk add --no-cache coreutils git m4 make xz - "apk add --no-cache coreutils git m4 make xz"
script: script:
- make build-native-image save-native-image - "make build-native-image save-native-image"
except: except:
- tags - "tags"
artifacts: artifacts:
expire_in: 1 day expire_in: "1 day"
paths: paths:
- dist/ - "dist/"
build:amd64-image: build:amd64-image:
stage: build:images stage: "build:images"
before_script: before_script:
- docker info - "docker info"
- apk add --no-cache coreutils git m4 make xz - "apk add --no-cache coreutils git m4 make xz"
- make binfmt-register - "make binfmt-register"
script: script:
- make build-amd64-image save-amd64-image - "make build-amd64-image save-amd64-image"
only: only:
- /^v([0-9.]+)(-.+)?$/ - "/^v([0-9.]+)(-.+)?$/"
except: except:
- branches - "branches"
artifacts: artifacts:
expire_in: 1 week expire_in: "1 week"
paths: paths:
- dist/ - "dist/"
build:arm32v7-image: build:arm32v7-image:
stage: build:images stage: "build:images"
before_script: before_script:
- docker info - "docker info"
- apk add --no-cache coreutils git m4 make xz - "apk add --no-cache coreutils git m4 make xz"
- make binfmt-register - "make binfmt-register"
script: script:
- make build-arm32v7-image save-arm32v7-image - "make build-arm32v7-image save-arm32v7-image"
only: only:
- /^v([0-9.]+)(-.+)?$/ - "/^v([0-9.]+)(-.+)?$/"
except: except:
- branches - "branches"
artifacts: artifacts:
expire_in: 1 week expire_in: "1 week"
paths: paths:
- dist/ - "dist/"
build:arm64v8-image: build:arm64v8-image:
stage: build:images stage: "build:images"
before_script: before_script:
- docker info - "docker info"
- apk add --no-cache coreutils git m4 make xz - "apk add --no-cache coreutils git m4 make xz"
- make binfmt-register - "make binfmt-register"
script: script:
- make build-arm64v8-image save-arm64v8-image - "make build-arm64v8-image save-arm64v8-image"
only: only:
- /^v([0-9.]+)(-.+)?$/ - "/^v([0-9.]+)(-.+)?$/"
except: except:
- branches - "branches"
artifacts: artifacts:
expire_in: 1 week expire_in: "1 week"
paths: paths:
- dist/ - "dist/"
push:amd64-image: push:amd64-image:
stage: push:images stage: "push:images"
before_script: before_script:
- apk add --no-cache coreutils git make xz - "apk add --no-cache coreutils git make xz"
- docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY}" >/dev/null 2>&1 - "docker login -u \"${CI_REGISTRY_USER:?}\" -p \"${CI_REGISTRY_PASSWORD:?}\" \"${CI_REGISTRY:?}\" >/dev/null 2>&1"
script: script:
- make load-amd64-image push-amd64-image - "make load-amd64-image push-amd64-image"
only: only:
- /^v([0-9.]+)(-.+)?$/ - "/^v([0-9.]+)(-.+)?$/"
except: except:
- branches - "branches"
dependencies: dependencies:
- build:amd64-image - "build:amd64-image"
push:arm32v7-image: push:arm32v7-image:
stage: push:images stage: "push:images"
before_script: before_script:
- apk add --no-cache coreutils git make xz - "apk add --no-cache coreutils git make xz"
- docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY}" >/dev/null 2>&1 - "docker login -u \"${CI_REGISTRY_USER:?}\" -p \"${CI_REGISTRY_PASSWORD:?}\" \"${CI_REGISTRY:?}\" >/dev/null 2>&1"
script: script:
- make load-arm32v7-image push-arm32v7-image - "make load-arm32v7-image push-arm32v7-image"
only: only:
- /^v([0-9.]+)(-.+)?$/ - "/^v([0-9.]+)(-.+)?$/"
except: except:
- branches - "branches"
dependencies: dependencies:
- build:arm32v7-image - "build:arm32v7-image"
push:arm64v8-image: push:arm64v8-image:
stage: push:images stage: "push:images"
before_script: before_script:
- apk add --no-cache coreutils git make xz - "apk add --no-cache coreutils git make xz"
- docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY}" >/dev/null 2>&1 - "docker login -u \"${CI_REGISTRY_USER:?}\" -p \"${CI_REGISTRY_PASSWORD:?}\" \"${CI_REGISTRY:?}\" >/dev/null 2>&1"
script: script:
- make load-arm64v8-image push-arm64v8-image - "make load-arm64v8-image push-arm64v8-image"
only: only:
- /^v([0-9.]+)(-.+)?$/ - "/^v([0-9.]+)(-.+)?$/"
except: except:
- branches - "branches"
dependencies: dependencies:
- build:arm64v8-image - "build:arm64v8-image"
push:cross-manifest: push:cross-manifest:
stage: push:manifests stage: "push:manifests"
before_script: before_script:
- apk add --no-cache coreutils git make xz - "apk add --no-cache coreutils git make"
- "mkdir -p ~/.docker/ && printf '%s\n' '{\"experimental\": \"enabled\"}' > ~/.docker/config.json" - "mkdir -p ~/.docker/ && printf '%s\n' '{\"experimental\": \"enabled\"}' > ~/.docker/config.json"
- docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY}" >/dev/null 2>&1 - "docker login -u \"${CI_REGISTRY_USER:?}\" -p \"${CI_REGISTRY_PASSWORD:?}\" \"${CI_REGISTRY:?}\" >/dev/null 2>&1"
script: script:
- make push-cross-manifest - "make push-cross-manifest"
only: only:
- /^v([0-9.]+)(-.+)?$/ - "/^v([0-9.]+)(-.+)?$/"
except: except:
- branches - "branches"
dependencies: dependencies:
- push:amd64-image - "push:amd64-image"
- push:arm32v7-image - "push:arm32v7-image"
- push:arm64v8-image - "push:arm64v8-image"

View File

@@ -71,8 +71,8 @@ m4_ifelse(ENABLE_32BIT, 1, [[m4_dnl
ARG LIBJPEG_TURBO_TREEISH=2.0.2 ARG LIBJPEG_TURBO_TREEISH=2.0.2
ARG LIBJPEG_TURBO_REMOTE=https://github.com/libjpeg-turbo/libjpeg-turbo.git ARG LIBJPEG_TURBO_REMOTE=https://github.com/libjpeg-turbo/libjpeg-turbo.git
WORKDIR /tmp/libjpeg-turbo/ WORKDIR /tmp/libjpeg-turbo/
RUN git clone "${LIBJPEG_TURBO_REMOTE}" ./ RUN git clone "${LIBJPEG_TURBO_REMOTE:?}" ./
RUN git checkout "${LIBJPEG_TURBO_TREEISH}" RUN git checkout "${LIBJPEG_TURBO_TREEISH:?}"
RUN git submodule update --init --recursive RUN git submodule update --init --recursive
WORKDIR ./build/ WORKDIR ./build/
RUN cmake ./ \ RUN cmake ./ \
@@ -102,8 +102,8 @@ RUN dpkg -i --force-architecture ./libjpeg-turbo32_*.deb
ARG VIRTUALGL_TREEISH=2.6.2 ARG VIRTUALGL_TREEISH=2.6.2
ARG VIRTUALGL_REMOTE=https://github.com/VirtualGL/virtualgl.git ARG VIRTUALGL_REMOTE=https://github.com/VirtualGL/virtualgl.git
WORKDIR /tmp/virtualgl/ WORKDIR /tmp/virtualgl/
RUN git clone "${VIRTUALGL_REMOTE}" ./ RUN git clone "${VIRTUALGL_REMOTE:?}" ./
RUN git checkout "${VIRTUALGL_TREEISH}" RUN git checkout "${VIRTUALGL_TREEISH:?}"
RUN git submodule update --init --recursive RUN git submodule update --init --recursive
WORKDIR ./build/ WORKDIR ./build/
RUN cmake ./ \ RUN cmake ./ \
@@ -133,8 +133,8 @@ RUN dpkg -i --force-architecture ./virtualgl32_*.deb
ARG TURBOVNC_TREEISH=2.2.2 ARG TURBOVNC_TREEISH=2.2.2
ARG TURBOVNC_REMOTE=https://github.com/TurboVNC/turbovnc.git ARG TURBOVNC_REMOTE=https://github.com/TurboVNC/turbovnc.git
WORKDIR /tmp/turbovnc/ WORKDIR /tmp/turbovnc/
RUN git clone "${TURBOVNC_REMOTE}" ./ RUN git clone "${TURBOVNC_REMOTE:?}" ./
RUN git checkout "${TURBOVNC_TREEISH}" RUN git checkout "${TURBOVNC_TREEISH:?}"
RUN git submodule update --init --recursive RUN git submodule update --init --recursive
WORKDIR ./build/ WORKDIR ./build/
RUN cmake ./ \ RUN cmake ./ \
@@ -152,8 +152,8 @@ RUN dpkg -i --force-architecture ./turbovnc_*.deb
ARG XRDP_TREEISH=v0.9.11 ARG XRDP_TREEISH=v0.9.11
ARG XRDP_REMOTE=https://github.com/neutrinolabs/xrdp.git ARG XRDP_REMOTE=https://github.com/neutrinolabs/xrdp.git
WORKDIR /tmp/xrdp/ WORKDIR /tmp/xrdp/
RUN git clone "${XRDP_REMOTE}" ./ RUN git clone "${XRDP_REMOTE:?}" ./
RUN git checkout "${XRDP_TREEISH}" RUN git checkout "${XRDP_TREEISH:?}"
RUN git submodule update --init --recursive RUN git submodule update --init --recursive
RUN ./bootstrap RUN ./bootstrap
RUN ./configure \ RUN ./configure \
@@ -172,8 +172,8 @@ RUN checkinstall --default --pkgname=xrdp --pkgversion=0 --pkgrelease=0
ARG XORGXRDP_TREEISH=v0.2.11 ARG XORGXRDP_TREEISH=v0.2.11
ARG XORGXRDP_REMOTE=https://github.com/neutrinolabs/xorgxrdp.git ARG XORGXRDP_REMOTE=https://github.com/neutrinolabs/xorgxrdp.git
WORKDIR /tmp/xorgxrdp/ WORKDIR /tmp/xorgxrdp/
RUN git clone "${XORGXRDP_REMOTE}" ./ RUN git clone "${XORGXRDP_REMOTE:?}" ./
RUN git checkout "${XORGXRDP_TREEISH}" RUN git checkout "${XORGXRDP_TREEISH:?}"
RUN git submodule update --init --recursive RUN git submodule update --init --recursive
RUN ./bootstrap RUN ./bootstrap
RUN ./configure RUN ./configure
@@ -190,8 +190,8 @@ RUN apt-get source pulseaudio && mv ./pulseaudio-*/ ./pulseaudio/
WORKDIR /tmp/pulseaudio/ WORKDIR /tmp/pulseaudio/
RUN ./configure RUN ./configure
WORKDIR /tmp/xrdp-pulseaudio/ WORKDIR /tmp/xrdp-pulseaudio/
RUN git clone "${XRDP_PULSEAUDIO_REMOTE}" ./ RUN git clone "${XRDP_PULSEAUDIO_REMOTE:?}" ./
RUN git checkout "${XRDP_PULSEAUDIO_TREEISH}" RUN git checkout "${XRDP_PULSEAUDIO_TREEISH:?}"
RUN git submodule update --init --recursive RUN git submodule update --init --recursive
RUN ./bootstrap RUN ./bootstrap
RUN ./configure PULSE_DIR=/tmp/pulseaudio/ RUN ./configure PULSE_DIR=/tmp/pulseaudio/
@@ -397,7 +397,7 @@ ENV UNPRIVILEGED_USER_SHELL=/bin/bash
ENV DISABLE_GPU=false ENV DISABLE_GPU=false
ENV RDP_TLS_KEY_PATH=/etc/xrdp/key.pem ENV RDP_TLS_KEY_PATH=/etc/xrdp/key.pem
ENV RDP_TLS_CERT_PATH=/etc/xrdp/cert.pem ENV RDP_TLS_CERT_PATH=/etc/xrdp/cert.pem
ENV PATH=/opt/VirtualGL/bin:/opt/TurboVNC/bin:"${PATH}" ENV PATH=/opt/VirtualGL/bin:/opt/TurboVNC/bin:${PATH}
ENV VGL_DISPLAY=:0 ENV VGL_DISPLAY=:0
## Workaround for AMDGPU X_GLXCreatePbuffer issue: ## Workaround for AMDGPU X_GLXCreatePbuffer issue:
## https://github.com/VirtualGL/virtualgl/issues/85#issuecomment-480291529 ## https://github.com/VirtualGL/virtualgl/issues/85#issuecomment-480291529
@@ -406,12 +406,14 @@ ENV VGL_FORCEALPHA=1
ENV QT_STYLE_OVERRIDE=Adwaita ENV QT_STYLE_OVERRIDE=Adwaita
# Setup locale # Setup locale
RUN sed -i 's|^# \(en_US\.UTF-8 UTF-8\)$|\1|' /etc/locale.gen && locale-gen RUN printf '%s\n' 'en_US.UTF-8 UTF-8' > /etc/locale.gen
RUN localedef -c -i en_US -f UTF-8 en_US.UTF-8 ||:
ENV LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 ENV LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
# Setup timezone # Setup timezone
ENV TZ=Etc/UTC ENV TZ=UTC
RUN ln -sf /usr/share/zoneinfo/"${TZ}" /etc/localtime RUN ln -snf "/usr/share/zoneinfo/${TZ:?}" /etc/localtime
RUN printf '%s\n' "${TZ:?}" > /etc/timezone
# Setup D-Bus # Setup D-Bus
RUN mkdir /run/dbus/ && chown messagebus:messagebus /run/dbus/ RUN mkdir /run/dbus/ && chown messagebus:messagebus /run/dbus/
@@ -427,12 +429,12 @@ RUN printf '%s\n' 'exec xfce4-session' > /etc/skel/.xsession
# Create /etc/skel/.xsessionrc file # Create /etc/skel/.xsessionrc file
RUN printf '%s\n' \ RUN printf '%s\n' \
'export XDG_CACHE_HOME=${HOME}/.cache' \ 'export XDG_CACHE_HOME=${HOME:?}/.cache' \
'export XDG_CONFIG_DIRS=/etc/xdg/xdg-xubuntu:/etc/xdg' \ 'export XDG_CONFIG_DIRS=/etc/xdg/xdg-xubuntu:/etc/xdg' \
'export XDG_CONFIG_HOME=${HOME}/.config' \ 'export XDG_CONFIG_HOME=${HOME:?}/.config' \
'export XDG_CURRENT_DESKTOP=XFCE' \ 'export XDG_CURRENT_DESKTOP=XFCE' \
'export XDG_DATA_DIRS=/usr/share/xubuntu:/usr/share/xfce4:/usr/local/share:/usr/share' \ 'export XDG_DATA_DIRS=/usr/share/xubuntu:/usr/share/xfce4:/usr/local/share:/usr/share' \
'export XDG_DATA_HOME=${HOME}/.local/share' \ 'export XDG_DATA_HOME=${HOME:?}/.local/share' \
'export XDG_MENU_PREFIX=xfce-' \ 'export XDG_MENU_PREFIX=xfce-' \
'export XDG_RUNTIME_DIR=/run/user/$(id -u)' \ 'export XDG_RUNTIME_DIR=/run/user/$(id -u)' \
'export XDG_SESSION_DESKTOP=xubuntu' \ 'export XDG_SESSION_DESKTOP=xubuntu' \
@@ -471,4 +473,4 @@ EXPOSE 3389/tcp
WORKDIR / WORKDIR /
ENTRYPOINT ["/usr/bin/tini", "--"] ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ["/usr/local/bin/docker-foreground-cmd"] CMD ["/usr/local/bin/container-foreground-cmd"]

View File

@@ -239,9 +239,9 @@ binfmt-reset:
version: version:
@if printf -- '%s' '$(IMAGE_VERSION)' | grep -q '^v[0-9]\{1,\}$$'; then \ @if printf -- '%s' '$(IMAGE_VERSION)' | grep -q '^v[0-9]\{1,\}$$'; then \
NEW_IMAGE_VERSION=$$(awk -v 'v=$(IMAGE_VERSION)' 'BEGIN {printf "v%.0f", substr(v,2)+1}'); \ NEW_IMAGE_VERSION=$$(awk -v 'v=$(IMAGE_VERSION)' 'BEGIN {printf "v%.0f", substr(v,2)+1}'); \
printf -- '%s\n' "$${NEW_IMAGE_VERSION}" > '$(VERSION_FILE)'; \ printf -- '%s\n' "$${NEW_IMAGE_VERSION:?}" > '$(VERSION_FILE)'; \
'$(GIT)' add '$(VERSION_FILE)'; '$(GIT)' commit -m "$${NEW_IMAGE_VERSION}"; \ '$(GIT)' add '$(VERSION_FILE)'; '$(GIT)' commit -m "$${NEW_IMAGE_VERSION:?}"; \
'$(GIT)' tag -a "$${NEW_IMAGE_VERSION}" -m "$${NEW_IMAGE_VERSION}"; \ '$(GIT)' tag -a "$${NEW_IMAGE_VERSION:?}" -m "$${NEW_IMAGE_VERSION:?}"; \
else \ else \
>&2 printf -- 'Malformed version string: %s\n' '$(IMAGE_VERSION)'; \ >&2 printf -- 'Malformed version string: %s\n' '$(IMAGE_VERSION)'; \
exit 1; \ exit 1; \

41
run.sh
View File

@@ -3,42 +3,45 @@
set -eu set -eu
export LC_ALL=C export LC_ALL=C
DOCKER=$(command -v docker 2>/dev/null)
IMAGE_REGISTRY=docker.io
IMAGE_NAMESPACE=hectormolinero IMAGE_NAMESPACE=hectormolinero
IMAGE_PROJECT=xubuntu IMAGE_PROJECT=xubuntu
IMAGE_TAG=latest IMAGE_TAG=latest
IMAGE_NAME=${IMAGE_NAMESPACE}/${IMAGE_PROJECT}:${IMAGE_TAG} IMAGE_NAME=${IMAGE_REGISTRY:?}/${IMAGE_NAMESPACE:?}/${IMAGE_PROJECT:?}:${IMAGE_TAG:?}
CONTAINER_NAME=${IMAGE_PROJECT} CONTAINER_NAME=${IMAGE_PROJECT:?}
imageExists() { [ -n "$(docker images -q "$1")" ]; } imageExists() { [ -n "$("${DOCKER:?}" images -q "${1:?}")" ]; }
containerExists() { docker ps -aqf name="$1" --format '{{.Names}}' | grep -Fxq "$1"; } containerExists() { "${DOCKER:?}" ps -af name="${1:?}" --format '{{.Names}}' | grep -Fxq "${1:?}"; }
containerIsRunning() { docker ps -qf name="$1" --format '{{.Names}}' | grep -Fxq "$1"; } containerIsRunning() { "${DOCKER:?}" ps -f name="${1:?}" --format '{{.Names}}' | grep -Fxq "${1:?}"; }
if ! imageExists "${IMAGE_NAME}"; then if ! imageExists "${IMAGE_NAME:?}" && ! imageExists "${IMAGE_NAME#docker.io/}"; then
>&2 printf -- '%s\n' "\"${IMAGE_NAME}\" image doesn't exist!" >&2 printf -- '%s\n' "\"${IMAGE_NAME:?}\" image doesn't exist!"
exit 1 exit 1
fi fi
if containerIsRunning "${CONTAINER_NAME}"; then if containerIsRunning "${CONTAINER_NAME:?}"; then
printf -- '%s\n' "Stopping \"${CONTAINER_NAME}\" container..." printf -- '%s\n' "Stopping \"${CONTAINER_NAME:?}\" container..."
docker stop "${CONTAINER_NAME}" >/dev/null "${DOCKER:?}" stop "${CONTAINER_NAME:?}" >/dev/null
fi fi
if containerExists "${CONTAINER_NAME}"; then if containerExists "${CONTAINER_NAME:?}"; then
printf -- '%s\n' "Removing \"${CONTAINER_NAME}\" container..." printf -- '%s\n' "Removing \"${CONTAINER_NAME:?}\" container..."
docker rm "${CONTAINER_NAME}" >/dev/null "${DOCKER:?}" rm "${CONTAINER_NAME:?}" >/dev/null
fi fi
printf -- '%s\n' "Creating \"${CONTAINER_NAME}\" container..." printf -- '%s\n' "Creating \"${CONTAINER_NAME:?}\" container..."
docker run --detach \ "${DOCKER:?}" run --detach \
--name "${CONTAINER_NAME}" \ --name "${CONTAINER_NAME:?}" \
--hostname "${CONTAINER_NAME}" \ --hostname "${CONTAINER_NAME:?}" \
--restart on-failure:3 \ --restart on-failure:3 \
--log-opt max-size=32m \ --log-opt max-size=32m \
--publish 0.0.0.0:3322:3322/tcp \ --publish 0.0.0.0:3322:3322/tcp \
--publish 0.0.0.0:3389:3389/tcp \ --publish 0.0.0.0:3389:3389/tcp \
--privileged \ --privileged \
--shm-size 2g \ --shm-size 2g \
"${IMAGE_NAME}" "$@" >/dev/null "${IMAGE_NAME:?}" "$@" >/dev/null
printf -- '%s\n\n' 'Done!' printf -- '%s\n\n' 'Done!'
exec docker logs -f "${CONTAINER_NAME}" exec "${DOCKER:?}" logs -f "${CONTAINER_NAME:?}"

View File

@@ -31,7 +31,7 @@ printf '%s' "${UNPRIVILEGED_USER_NAME:?}:${UNPRIVILEGED_USER_PASSWORD:?}" | chpa
unset UNPRIVILEGED_USER_PASSWORD unset UNPRIVILEGED_USER_PASSWORD
# Dump environment variables # Dump environment variables
export-env >> /etc/profile.d/env.sh export-env > /etc/profile.d/env.sh
# Disable xdummy if there is no graphics card # Disable xdummy if there is no graphics card
if [ "${DISABLE_GPU:?}" = 'true' ] || [ ! -d /dev/dri/ ]; then if [ "${DISABLE_GPU:?}" = 'true' ] || [ ! -d /dev/dri/ ]; then
@@ -39,7 +39,7 @@ if [ "${DISABLE_GPU:?}" = 'true' ] || [ ! -d /dev/dri/ ]; then
fi fi
# Create RANDFILE if it does not exist # Create RANDFILE if it does not exist
RANDFILE=${RANDFILE-${HOME}/.rnd} RANDFILE=${RANDFILE-${HOME:?}/.rnd}
if [ ! -f "${RANDFILE:?}" ]; then if [ ! -f "${RANDFILE:?}" ]; then
dd if=/dev/urandom of="${RANDFILE:?}" bs=256 count=1 >/dev/null 2>&1 dd if=/dev/urandom of="${RANDFILE:?}" bs=256 count=1 >/dev/null 2>&1
fi fi

View File

@@ -1,12 +1,9 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
BEGIN { BEGIN {for (v in ENVIRON) {
print("\n") if (v !~ /^(_|AWKPATH|AWKLIBPATH|TERM|SHLVL|PWD|HOME|SHELL|HOSTNAME|UID|USER|GID|GROUP)$/) {
for (v in ENVIRON) { gsub(/[^0-9A-Za-z_]/, "_", v);
if (v !~ /^(PWD|HOME|SHELL|HOSTNAME|UID|USER|GID|GROUP)$/) { gsub(/'/, "'\\''", ENVIRON[v])
gsub(/[^0-9A-Za-z_]/, "_", v); print("export "v"='"ENVIRON[v]"'")
gsub(/'/, "'\\''", ENVIRON[v])
print("export "v"='"ENVIRON[v]"'")
}
} }
} }}