enhanced build in docker
This commit is contained in:
51
README
51
README
@@ -1,25 +1,9 @@
|
||||
Simplify Your Project Build Environment
|
||||
|
||||
bootstrap-build-environment
|
||||
|
||||
Simply setup a new project:
|
||||
1. create a subversion basic tree
|
||||
2. checkoutsubversion repository
|
||||
3. cd into the new project subversion working copy
|
||||
4. call with full path: /path/to/bootstrap.sh
|
||||
5. if trunk has been created, cd to trunk
|
||||
6. follow the instructions, i.e. edit configure.ac
|
||||
7. run again: /path/to/bootstrap.sh
|
||||
8. add some generated files: svn add COPYING ChangeLog INSTALL
|
||||
9. check files, i.e. all makefile.am, set Section in debian/control.in
|
||||
10. your project is setup and compilable, test: ./bootstrap.sh -b
|
||||
|
||||
|
||||
Fore more details, see:
|
||||
./bootstrap.sh -h
|
||||
|
||||
Supports and preconfigures:
|
||||
Automake and Autoconf based build environment that especially supports and preconfigures:
|
||||
- C++ including:
|
||||
- Qt
|
||||
- QT (without qmake, just using the AutoTools)
|
||||
- LibTool
|
||||
- Library dependencies
|
||||
- CPP-Unit
|
||||
- PKG-Config dependency file
|
||||
@@ -31,10 +15,35 @@ Supports and preconfigures:
|
||||
- Debian packaging
|
||||
- RPM packaging
|
||||
- Mac OSX App Bundle creation
|
||||
- Subversion
|
||||
- SQL to Doxygen schema documentation
|
||||
- Build in Docker
|
||||
- Resolve package dependencies
|
||||
- ...
|
||||
|
||||
Makefiles and other files are generated automatically, necessary build and dependency rules are automatically added. There are no redundancies. This reduces extremely the size of your configuration. The whole build system becomes extremely simple, lean and smart.
|
||||
|
||||
Simply setup a new project:
|
||||
1. create a subversion basic tree
|
||||
2. checkout subversion repository
|
||||
3. cd into the new project subversion working copy
|
||||
4. call with full path: /path/to/bootstrap.sh
|
||||
5. if trunk has been created, cd to trunk
|
||||
6. follow the instructions, i.e. edit configure.ac
|
||||
7. run again: /path/to/bootstrap.sh
|
||||
8. add some generated files: svn add COPYING ChangeLog INSTALL
|
||||
9. check files, i.e. all makefile.am, set Section in debian/control.in
|
||||
10. your project is setup and compilable, test: ./bootstrap.sh -b
|
||||
|
||||
|
||||
For more details, see:
|
||||
|
||||
./bootstrap.sh -h
|
||||
|
||||
Example:
|
||||
|
||||
There is a just created empty subversion repository:
|
||||
|
||||
https://dev.marc.waeckerlin.org/svn/project-name
|
||||
|
||||
Setup a basic project:
|
||||
@@ -46,7 +55,7 @@ Setup a basic project:
|
||||
|
||||
The file AUTHORS is already correct due to my gnupg setup:
|
||||
|
||||
Fistname Lastname (https://my.homepage.xyz) <me@mysite.xyz>
|
||||
Firstname Lastname (https://my.homepage.xyz) <me@mysite.xyz>
|
||||
|
||||
Edit the file README, I add the following lines:
|
||||
|
||||
|
@@ -20,7 +20,7 @@ DEFAULT_PROJECT_NAME=${PROJECT_PATH##*/}
|
||||
configure=0
|
||||
build=0
|
||||
docker=0
|
||||
buildtarget="distcheck"
|
||||
buildtarget=""
|
||||
overwrite=0
|
||||
rebuild=0
|
||||
rebuildfiles=()
|
||||
@@ -28,8 +28,9 @@ while test $# -gt 0; do
|
||||
case "$1" in
|
||||
(--configure|-c) configure=1;;
|
||||
(--docker|-d) docker=1;;
|
||||
(--build|-b) configure=1; build=1;;
|
||||
(--target|-t) shift; configure=1; build=1; buildtarget="$1";;
|
||||
(--build|-b) configure=1; build=1; buildtarget+=" distcheck";;
|
||||
(--target|-t) shift; configure=1; build=1; buildtarget+=" $1";;
|
||||
(--clean) shift; configure=1; build=1; buildtarget+=" maintainer-clean";;
|
||||
(--overwrite|-o) overwrite=1;;
|
||||
(--rebuild|-r) rebuild=1;;
|
||||
(--rebuild-file|-f) shift; rebuildfiles+=("$1");;
|
||||
|
@@ -1,20 +1,140 @@
|
||||
#! /bin/bash -ex
|
||||
#! /bin/bash -e
|
||||
|
||||
# build and test everything in a fresh docker installation
|
||||
|
||||
DOCKER_ID=$(docker run -d -v $(pwd):/workdir -w /workdir ubuntu sleep infinity)
|
||||
trap "docker rm -f ${DOCKER_ID}" INT TERM EXIT
|
||||
docker exec ${DOCKER_ID} apt-get install -y software-properties-common apt-transport-https dpkg-dev
|
||||
docker exec ${DOCKER_ID} apt-add-repository universe
|
||||
docker exec ${DOCKER_ID} apt-add-repository https://dev.marc.waeckerlin.org/repository
|
||||
wget -O- https://dev.marc.waeckerlin.org/repository/PublicKey \
|
||||
| docker exec -i ${DOCKER_ID} apt-key add -
|
||||
if test -n "$*"; then
|
||||
for p in $*; do
|
||||
docker exec ${DOCKER_ID} apt-add-repository $p
|
||||
done
|
||||
img="ubuntu:latest"
|
||||
repos=()
|
||||
keys=()
|
||||
envs=()
|
||||
dirs=("-v $(pwd):/workdir")
|
||||
packages=()
|
||||
targets="all check distcheck"
|
||||
commands=()
|
||||
if test -e ./build-in-docker.conf; then
|
||||
# you can preconfigure the variables in file build-in-docker.conf
|
||||
# if you do so, add the file to EXTRA_DIST in makefile.am
|
||||
source ./build-in-docker.conf
|
||||
fi
|
||||
while test $# -gt 0; do
|
||||
case "$1" in
|
||||
(-h|--help)
|
||||
echo "$0 [OPTIONS]"
|
||||
echo
|
||||
echo "OPTIONS:"
|
||||
echo
|
||||
echo " -h, --help show this help"
|
||||
echo " -i, --image <image> use given docker image instead of ${img}"
|
||||
echo " -t, --targets targets specify build targets, default: ${targets}"
|
||||
echo " -r, --repo <url> add given apt repository"
|
||||
echo " -k, --key <url> add public key from url"
|
||||
echo " -e, --env <var>=<val> set environment variable in docker"
|
||||
echo " -d, --dir <dir> access given directory read only"
|
||||
echo " -p, --package <pkg> install extra debian packages"
|
||||
echo " -c, --cmd <command> execute commands as root in docker"
|
||||
echo
|
||||
echo " The options -r -k -e -d -p -c can be repeated several times."
|
||||
echo
|
||||
echo " The options -r -p -c allow an if-then-else contruct"
|
||||
echo " depending on the operating system:"
|
||||
echo " <os>:::<A>:::<B>"
|
||||
echo " <os>:::<A>"
|
||||
echo " Read as: On linux type <os> use <A> else use <B>"
|
||||
echo " That means: If the distributer ID or codename in lsb_release"
|
||||
echo " matches <os>, then <A> is replaced, else <B> is replaced."
|
||||
echo " The three colons are for splitting <os> from <A> and <B> part."
|
||||
echo " E.g.: Install package curl on wheezy and npm on olter systems:"
|
||||
echo " $0 -p wheezy:::curl:::npm"
|
||||
echo
|
||||
echo "EXAMPLE:"
|
||||
echo
|
||||
echo "$0 -i mwaeckerlin/ubuntu:trusty-i386 \\"
|
||||
echo " -t deb \\"
|
||||
echo " -e ANDROID_HOME=/opt/local/android \\"
|
||||
echo " -d /opt/local/android \\"
|
||||
echo " -r universe \\"
|
||||
echo " -r https://dev.marc.waeckerlin.org/repository \\"
|
||||
echo " -k https://dev.marc.waeckerlin.org/repository/PublicKey \\"
|
||||
echo " -p mrw-c++"
|
||||
echo
|
||||
exit 0
|
||||
;;
|
||||
(-i|--image) shift;
|
||||
img="$1"
|
||||
;;
|
||||
(-t|--targets) shift;
|
||||
targets="$1"
|
||||
;;
|
||||
(-r|--repo) shift;
|
||||
repos+=("$1")
|
||||
;;
|
||||
(-k|--key) shift;
|
||||
keys+=("$1")
|
||||
;;
|
||||
(-e|--env) shift;
|
||||
envs+=("-e $1")
|
||||
;;
|
||||
(-d|--dirs) shift;
|
||||
dirs+=("-v $1:$1:ro")
|
||||
;;
|
||||
(-p|--package) shift;
|
||||
packages+=("$1")
|
||||
;;
|
||||
(-c|--cmd) shift;
|
||||
commands+=("$1")
|
||||
;;
|
||||
(*)
|
||||
echo "**** ERROR: unknown option '$1', try --help" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
if test $# -eq 0; then
|
||||
echo "**** ERROR: missing value, try --help" 2>61
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
function ifthenelse() {
|
||||
arg="$1"
|
||||
shift
|
||||
cmd="$*"
|
||||
if test "${arg/:::/}" = "${arg}"; then
|
||||
docker exec ${DOCKER_ID} bash -c "${cmd//ARG/${arg}}"
|
||||
else
|
||||
os="${arg%%:::*}"
|
||||
thenpart="${arg#*:::}"
|
||||
if test "${thenpart/:::/}" = "${thenpart}"; then
|
||||
docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if test "${os//$(lsb_release -is)/}${os//$(lsb_release -cs)/}" != "${os}${os}"; then '"${cmd//ARG/${thenpart}}"'; fi'
|
||||
else
|
||||
elsepart="${thenpart##*:::}"
|
||||
thenpart="${thenpart%:::*}"
|
||||
docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if test "${os//$(lsb_release -is)/}${os//$(lsb_release -cs)/}" != "${os}${os}"; then '"${cmd//ARG/${thenpart}}"'; else '"${cmd//ARG/${elsepart}}"'; fi'
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
set -x
|
||||
|
||||
DOCKER_ID=$(docker run -d ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity)
|
||||
trap "docker rm -f ${DOCKER_ID}" INT TERM EXIT
|
||||
docker exec ${DOCKER_ID} apt-get update
|
||||
docker exec ${DOCKER_ID} apt-get upgrade -y --force-yes
|
||||
if ! docker exec ${DOCKER_ID} apt-get install -y --force-yes python-software-properties apt-transport-https dpkg-dev lsb-release; then
|
||||
docker exec ${DOCKER_ID} apt-get install -y --force-yes software-properties-common apt-transport-https dpkg-dev lsb-release
|
||||
fi
|
||||
for repo in "${repos[@]}"; do
|
||||
ifthenelse "${repo}" "apt-add-repository ARG"
|
||||
done
|
||||
for key in "${keys[@]}"; do
|
||||
wget -O- \
|
||||
| docker exec -i ${DOCKER_ID} apt-key add -
|
||||
done
|
||||
docker exec ${DOCKER_ID} apt-get update
|
||||
for package in "${packages[@]}"; do
|
||||
ifthenelse "${package}" "apt-get install -y --force-yes ARG"
|
||||
done
|
||||
for command in "${commands[@]}"; do
|
||||
ifthenelse "${command}" "ARG"
|
||||
done
|
||||
docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh
|
||||
docker exec -u $(id -u) ${DOCKER_ID} svn upgrade || true
|
||||
docker exec -u $(id -u) ${DOCKER_ID} ./bootstrap.sh -t "all check distcheck"
|
||||
docker exec -u $(id -u) ${DOCKER_ID} ./bootstrap.sh -t "${targets}"
|
||||
|
@@ -16,7 +16,11 @@ if test -n "${SCHROOTNAME}"; then
|
||||
SUDO="schroot -c "${SCHROOTNAME}" -u root -d / --"
|
||||
else
|
||||
DO=""
|
||||
if grep -q '/docker/' /proc/1/cgroup; then
|
||||
SUDO=""
|
||||
else
|
||||
SUDO="sudo"
|
||||
fi
|
||||
fi
|
||||
|
||||
function install() {
|
||||
|
Reference in New Issue
Block a user