#!/usr/bin/env bash DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) source "${DIR}/util.sh" DIST_DIR="${BASE_DIR}/dist" SRC_DIR="${BASE_DIR}/src" function get_project_opt { filter=${1} manifest_path=${SRC_DIR}/tamarin.json jq -r "${filter}" ${manifest_path} | sed 's/null//g' } function get_build_dir { project_name="${1}" temp_dir=$(mktemp -d) build_dir="${temp_dir}/${project_name}" mkdir -p "${build_dir}" echo ${build_dir} } function exec_hook { hook_name=${1} build_dir=${2} hook_script="${SRC_DIR}/$(get_project_opt .hooks.${hook_name})" # Test hook script existence if [ ! -f "${hook_script}" ]; then info "No ${hook_name} hook." return fi info "Executing ${hook_name} hook..." # Ensure the hook script is executable chmod +x "${hook_script}" # Execute hook in a subshell ( cd ${SRC_DIR} && DESTDIR="${build_dir}" SRCDIR="${SRC_DIR}" exec "${hook_script}" ) # If the script did not execute properly, we stop here if [ $? != 0 ]; then fatal "The '${hook_name}' hook script did not finished properly !" fi } function create_debian_control_file { debian_dir="${1}" control_file="${debian_dir}/control" touch "${control_file}" package_name=$(get_project_opt .name) echo "Package: ${package_name}" > "${control_file}" package_version=$(get_project_opt .version) echo "Version: ${package_version:-0.0.0}" >> "${control_file}" package_section=$(get_project_opt .section) echo "Section: ${package_section:-extra}" >> "${control_file}" package_priority=$(get_project_opt .priority) echo "Priority: ${package_priority:-optional}" >> "${control_file}" package_arch=$(get_project_opt .arch) echo "Architecture: ${package_arch:-all}" >> "${control_file}" dependencies=$( get_project_opt ".dependencies | .[\"${DISTRIB}\"] | @sh" | sed "s/' '/, /g" | sed "s/'//g" ) debug "Package dependencies: $dependencies" echo "Depends: ${dependencies}" >> "${control_file}" package_maintainer=$(get_project_opt .maintainer) echo "Maintainer: ${package_maintainer:-Unknown}" >> "${control_file}" package_description=$(get_project_opt .description) echo "Description: ${package_description:-No description}" >> "${control_file}" } function create_debian_hooks { debian_dir="${1}" pre_install="$(get_project_opt .hooks.preInstall)" if [ ! -z "${pre_install}" ]; then cp "${SRC_DIR}/${pre_install}" "${debian_dir}/preinst" chmod +x "${debian_dir}/preinst" fi post_install="$(get_project_opt .hooks.postInstall)" if [ ! -z "${post_install}" ]; then cp "${SRC_DIR}/${post_install}" "${debian_dir}/postinst" chmod +x "${debian_dir}/postinst" fi pre_remove="$(get_project_opt .hooks.preRemove)" if [ ! -z "${pre_remove}" ]; then cp "${SRC_DIR}/${pre_remove}" "${debian_dir}/prerm" chmod +x "${debian_dir}/prerm" fi post_remove="$(get_project_opt .hooks.postRemove)" if [ ! -z "${post_remove}" ]; then cp "${SRC_DIR}/${post_remove}" "${debian_dir}/postrm" chmod +x "${debian_dir}/postrm" fi } function create_debian_metadata { build_dir="${1}" debian_dir="${build_dir}/DEBIAN" # Ensure debian dir exists mkdir -p "${debian_dir}" create_debian_control_file "${debian_dir}" create_debian_hooks "${debian_dir}" } function build_project { project_name="$(get_project_opt '.name')" info "Building project '${project_name}'..." build_dir="$(get_build_dir "${project_name}")" debug "Build dir: ${build_dir}" # We don't generate Debian metadata files if a debian directory is present if [ ! -d "${SRC_DIR}/DEBIAN" ] && [ ! -d "${SRC_DIR}/debian" ]; then info "No Debian directory detected in sources." info "Generating Debian metadata files from manifest..." create_debian_metadata "${build_dir}" else info "A Debian directory is already present in sources." fi exec_hook "preBuild" "${build_dir}" # Ensure $DIST_DIR exists mkdir -p "${DIST_DIR}" cd "${build_dir}/.." dpkg-deb --build "${project_name}" ${DIST_DIR} info "Package created ! (${build_dir}/${project_name}.deb)" if [ $? != 0 ]; then fatal "The build process has not completed successfuly !" fi cd ${SRC_DIR} exec_hook "postBuild" "${build_dir}" } function main { manifest_path=${SRC_DIR}/tamarin.json if [ ! -f "${manifest_path}" ]; then fatal "There is no 'tamarin.json' file found in the project directory !" fi build_project } main