#!/bin/bash # Copyright (c) 2013 The CoreOS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # common.sh should be sourced first [[ -n "${DEFAULT_BUILD_ROOT}" ]] || exit 1 . "${SCRIPTS_DIR}/sdk_lib/sdk_util.sh" || exit 1 . "${BUILD_LIBRARY_DIR}/toolchain_util.sh" || exit 1 # Default option values, may be provided before including this file : ${TYPE:="coreos-sdk"} : ${ARCH:=$(get_sdk_arch)} : ${DEFAULT_CATALYST_ROOT:="${DEFAULT_BUILD_ROOT}/catalyst"} : ${DEFAULT_SEED:=${FLATCAR_SDK_TARBALL_PATH}} : ${DEFAULT_PROFILE:=$(get_sdk_profile)} # Set to something like "stage4" to restrict what to build # FORCE_STAGES= # Values set in catalyst_init, don't use till after calling it CATALYST_ROOT= DEBUG=() BUILDS= BINPKGS= DISTDIR= TEMPDIR= STAGES= DEFINE_string catalyst_root "${DEFAULT_CATALYST_ROOT}" \ "Path to directory for all catalyst images and other files." DEFINE_string portage_stable "${SRC_ROOT}/third_party/portage-stable" \ "Path to the portage-stable git checkout." DEFINE_string coreos_overlay "${SRC_ROOT}/third_party/coreos-overlay" \ "Path to the coreos-overlay git checkout." DEFINE_string seed_tarball "${DEFAULT_SEED}" \ "Path to an existing stage tarball to start from." DEFINE_string version "${FLATCAR_VERSION}" \ "Version to use for portage snapshot and stage tarballs." DEFINE_string profile "${DEFAULT_PROFILE}" \ "Portage profile, may be prefixed with repo:" DEFINE_boolean rebuild ${FLAGS_FALSE} \ "Rebuild and overwrite stages that already exist." DEFINE_boolean debug ${FLAGS_FALSE} "Enable verbose output from catalyst." ##################### # CONFIG DEFINITIONS # # These templates can be expanded by calling the wrapping function after # catalyst_init has been called. They are written as files in write_configs # rather than passed as command line args for easier inspection and debugging # by hand, catalyst can get tricky. ###################### # Values to write to catalyst.conf catalyst_conf() { cat </dev/null 2>&1; then die_notrace "catalyst not found, not installed or bad PATH?" fi # Before doing anything else, ensure we have at least Catalyst 4. if catalyst --version | grep -q "Catalyst [0-3]\."; then emerge --verbose "--jobs=${NUM_JOBS}" --oneshot ">=dev-util/catalyst-4" || exit 1 fi DEBUG=() if [[ ${FLAGS_debug} -eq ${FLAGS_TRUE} ]]; then DEBUG=("--debug") fi # Create output dir, expand path for easy comparison later mkdir -p "$FLAGS_catalyst_root" CATALYST_ROOT=$(readlink -f "$FLAGS_catalyst_root") BUILDS="$CATALYST_ROOT/builds/$TYPE" BINPKGS="$CATALYST_ROOT/packages/$TYPE" TEMPDIR="$CATALYST_ROOT/tmp/$TYPE" DISTDIR="$CATALYST_ROOT/distfiles" # automatically download the current SDK if it is the seed tarball. if [[ "$FLAGS_seed_tarball" == "${FLATCAR_SDK_TARBALL_PATH}" ]]; then sdk_download_tarball fi # confirm seed exists if [[ ! -f "$FLAGS_seed_tarball" ]]; then die_notrace "Seed tarball not found: $FLAGS_seed_tarball" fi # so far so good, expand path to work with weird comparison code below FLAGS_seed_tarball=$(readlink -f "$FLAGS_seed_tarball") if [[ ! "$FLAGS_seed_tarball" =~ .\.tar\.(bz2|xz) ]]; then die_notrace "Seed tarball doesn't end in .tar.bz2 or .tar.xz :-/" fi # catalyst is obnoxious and wants the $TYPE/stage3-$VERSION part of the # path, not the real path to the seed tarball. (Because it could be a # directory under $TEMPDIR instead, aka the SEEDCACHE feature.) if [[ "$FLAGS_seed_tarball" =~ "$CATALYST_ROOT/builds/".* ]]; then SEED="${FLAGS_seed_tarball#$CATALYST_ROOT/builds/}" SEED="${SEED%.tar.*}" else mkdir -p "$CATALYST_ROOT/builds/seed" cp -n "$FLAGS_seed_tarball" "$CATALYST_ROOT/builds/seed" SEED="seed/${FLAGS_seed_tarball##*/}" SEED="${SEED%.tar.*}" fi } write_configs() { info "Creating output directories..." mkdir -m 775 -p "$DISTDIR" chown portage:portage "$DISTDIR" info "Writing out catalyst configs..." info " catalyst.conf" catalyst_conf > "$TEMPDIR/catalyst.conf" info " catalystrc" catalystrc > "$TEMPDIR/catalystrc" info " stage1.spec" catalyst_stage1 > "$TEMPDIR/stage1.spec" info "Configuring Portage..." cp -r "${BUILD_LIBRARY_DIR}"/portage/ "${TEMPDIR}/" ln -sfT '/mnt/host/source/src/third_party/coreos-overlay/coreos/user-patches' \ "${TEMPDIR}"/portage/patches } build_stage() { local stage catalyst_conf target_tarball stage="$1" catalyst_conf="$TEMPDIR/catalyst.conf" target_tarball="${stage}-${ARCH}-${FLAGS_version}.tar.bz2" if [[ -f "$BUILDS/${target_tarball}" && $FLAGS_rebuild == $FLAGS_FALSE ]] then info "Skipping $stage, $target_tarball already exists." return fi info "Starting $stage" catalyst \ "${DEBUG[@]}" \ --verbose \ --config "$TEMPDIR/catalyst.conf" \ --file "$TEMPDIR/${stage}.spec" # Catalyst does not clean up after itself... rm -rf "$TEMPDIR/$stage-${ARCH}-${FLAGS_version}" ln -sf "$stage-${ARCH}-${FLAGS_version}.tar.bz2" \ "$BUILDS/$stage-${ARCH}-latest.tar.bz2" info "Finished building $target_tarball" } build_snapshot() { local repo_dir snapshot snapshots_dir snapshot_path repo_dir=${1:-"${FLAGS_portage_stable}"} snapshot=${2:-"${FLAGS_version}"} snapshots_dir="${CATALYST_ROOT}/snapshots" snapshot_path="${snapshots_dir}/portage-stable-${snapshot}.sqfs" if [[ -f ${snapshot_path} && $FLAGS_rebuild == $FLAGS_FALSE ]] then info "Skipping snapshot, ${snapshot_path} exists" else info "Creating snapshot ${snapshot_path}" mkdir -p "${snapshot_path%/*}" tar -c -C "${repo_dir}" . | tar2sqfs "${snapshot_path}" -q -f -j1 -c gzip fi } catalyst_build() { # assert catalyst_init has been called [[ -n "$CATALYST_ROOT" ]] info "Building stages: $STAGES" write_configs build_snapshot local used_seed used_seed=0 if [[ "$STAGES" =~ stage1 ]]; then build_stage stage1 used_seed=1 fi if [[ "$STAGES" =~ stage3 ]]; then if [[ $used_seed -eq 1 ]]; then SEED="${TYPE}/stage1-${ARCH}-latest" fi info " stage3.spec" catalyst_stage3 > "$TEMPDIR/stage3.spec" build_stage stage3 used_seed=1 fi if [[ "$STAGES" =~ stage4 ]]; then if [[ $used_seed -eq 1 ]]; then SEED="${TYPE}/stage3-${ARCH}-latest" fi info " stage4.spec" catalyst_stage4 > "$TEMPDIR/stage4.spec" build_stage stage4 used_seed=1 fi # Cleanup snapshots, we don't use them rm -rf "$CATALYST_ROOT/snapshots/${FLAGS_portage_stable##*/}-${FLAGS_version}.sqfs"* }