diff options
author | Renato Botelho <renato@netgate.com> | 2016-08-01 17:14:24 -0300 |
---|---|---|
committer | Renato Botelho <renato@netgate.com> | 2016-08-01 17:14:24 -0300 |
commit | 1217cd7a98721ee72bb48a56b6c4b0b56ff71d44 (patch) | |
tree | c24bd3c521365bdfda250af2fe5153894e96116d | |
parent | 6c0329cbea9840b031dccfd3d09452cccbe74121 (diff) | |
download | pfsense-1217cd7a98721ee72bb48a56b6c4b0b56ff71d44.zip pfsense-1217cd7a98721ee72bb48a56b6c4b0b56ff71d44.tar.gz |
Add create_core_pkg.sh and start using it
-rwxr-xr-x | build/scripts/create_core_pkg.sh | 172 | ||||
-rw-r--r-- | tools/builder_common.sh | 91 |
2 files changed, 182 insertions, 81 deletions
diff --git a/build/scripts/create_core_pkg.sh b/build/scripts/create_core_pkg.sh new file mode 100755 index 0000000..ad1f6c7 --- /dev/null +++ b/build/scripts/create_core_pkg.sh @@ -0,0 +1,172 @@ +#!/bin/sh +# +# create_core_pkg.sh +# +# part of pfSense (https://www.pfsense.org) +# Copyright (c) 2004-2016 Electric Sheep Fencing, LLC +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +export PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin + +scripts_path=$(dirname $(realpath $0)) + +if [ ! -f "${scripts_path}/common.subr" ]; then + echo >&2 "ERROR: common.subr is missing" + exit 1 +fi + +. ${scripts_path}/common.subr + +usage() { + cat >&2 <<END +Usage: $(basename $0) -t template -d destdir [-h] + +Options: + -t template -- Path to package template directory + -f flavor -- package flavor + -v version -- package version + -r root -- root directory containing package files + -F filter -- filter pattern to exclude files from plist + -d destdir -- Destination directory to create package + -h -- Show this help and exit + +Environment: + TMPDIR -- Temporary directory (default: /tmp) + PRODUCT_NAME -- Product name (default: pfSense) + PRODUCT_URL -- Product URL (default: https://www.pfsense.org) +END + exit 1 +} + +while getopts t:f:v:r:F:d:h opt; do + case "$opt" in + t) + template=$OPTARG + ;; + f) + flavor=$OPTARG + ;; + v) + version=$OPTARG + ;; + r) + root=$OPTARG + ;; + F) + filter=$OPTARG + ;; + d) + destdir=$OPTARG + ;; + *) + usage + ;; + esac +done + +[ -z "$template" ] \ + && err "template directory is not defined" + +[ -e $template -a ! -d $template ] \ + && err "template path is not a directory" + +[ -z "$destdir" ] \ + && err "destination directory is not defined" + +[ -e $destdir -a ! -d $destdir ] \ + && err "destination path already exists and is not a directory" + +: ${TMPDIR=/tmp} +: ${PRODUCT_NAME=pfSense} +: ${PRODUCT_URL=http://www.pfsense.org/} + +[ -d $destdir ] \ + || mkdir -p ${destdir} + +template_path=$(realpath $(dirname ${template})) +template_name=$(basename ${template}) +template_metadir=${template_path}/metadir +template_licensedir=${template_path}/_license + +[ -d ${template_metadir} ] \ + || err "template directory not found for package ${template_name}" + +scratchdir=$(mktemp -d -q ${TMPDIR:-/tmp}/${template_name}.XXXXXXX) + +[ -n "${scratchdir}" -a -d ${scratchdir} ] \ + || err "error creating temporary directory" + +trap "rm -rf ${scratchdir}" 1 2 15 EXIT + +metadir=${scratchdir}/${template_name}_metadir + +run "Copying metadata for package ${template_name}" \ + "cp -r ${template_metadir} ${metadir}" + +manifest=${metadir}/+MANIFEST +plist=${scratchdir}/${template_name}_plist +exclude_plist=${scratchdir}/${template_name}_exclude_plist + +if [ -f "${template_path}/pkg-plist" ]; then + cp ${template_path}/pkg-plist ${plist} +else + if [ -n "${filter}" ]; then + filter="-name ${filter}" + fi + (cd ${root} \ + && find . ${filter} -type f -or -type l \ + | sed 's,^.,,' \ + | sort -u \ + ) > ${plist} +fi + +if [ -f "${template_path}/exclude_plist" ]; then + cp ${template_path}/exclude_plist ${exclude_plist} +else + touch ${exclude_plist} +fi + +sed \ + -i '' \ + -e "s,%%PRODUCT_NAME%%,${PRODUCT_NAME},g" \ + -e "s,%%PRODUCT_URL%%,${PRODUCT_URL},g" \ + -e "s,%%FLAVOR%%,${flavor:+-}${flavor},g" \ + -e "s,%%FLAVOR_DESC%%,${flavor:+ (${flavor})},g" \ + -e "s,%%VERSION%%,${version},g" \ + ${metadir}/* \ + ${plist} \ + ${exclude_plist} + +if [ -f "${exclude_plist}" ]; then + sort -u ${exclude_plist} > ${plist}.exclude + mv ${plist} ${plist}.tmp + comm -23 ${plist}.tmp ${plist}.exclude > ${plist} + rm -f ${plist}.tmp ${plist}.exclude +fi + +# Add license information +if [ -d "${template_licensedir}" ]; then + portname=$(sed '/^name: /!d; s,^[^"]*",,; s,",,' ${metadir}/+MANIFEST) + licenses_dir="/usr/local/share/licenses/${portname}-${version}" + + mkdir -p ${root}${licenses_dir} + for f in ${template_licensedir}/*; do + cp ${f} ${licenses_dir} + echo "${licenses_dir}/$(basename ${f})" >> ${plist} + done +fi + +run "Creating core package ${template_name}" \ + "pkg create -o ${destdir} -p ${plist} -r ${root} -m ${metadir}" diff --git a/tools/builder_common.sh b/tools/builder_common.sh index 61b379a..dc4feb7 100644 --- a/tools/builder_common.sh +++ b/tools/builder_common.sh @@ -84,87 +84,16 @@ core_pkg_create() { local _root="${4}" local _filter="${5}" - [ -d "${CORE_PKG_TMP}" ] \ - && rm -rf ${CORE_PKG_TMP} - - local _templates_path=${BUILDER_TOOLS}/templates/core_pkg/${_template} - local _template_metadir=${_templates_path}/metadir - local _metadir=${CORE_PKG_TMP}/${_template}_metadir - - if [ ! -d ${_template_metadir} ]; then - echo "ERROR: Template dir not found for pkg ${_template}" - exit - fi - - mkdir -p ${CORE_PKG_TMP} - - cp -r ${_template_metadir} ${_metadir} - - local _manifest=${_metadir}/+MANIFEST - local _plist=${CORE_PKG_TMP}/${_template}_plist - local _exclude_plist=${CORE_PKG_TMP}/${_template}_exclude_plist - - if [ -f "${_templates_path}/pkg-plist" ]; then - cp ${_templates_path}/pkg-plist ${_plist} - else - if [ -n "${_filter}" ]; then - _filter="-name ${_filter}" - fi - (cd ${_root} && find . ${_filter} -type f -or -type l | sed 's,^.,,' | sort -u) > ${_plist} - fi - - if [ -f "${_templates_path}/exclude_plist" ]; then - cp ${_templates_path}/exclude_plist ${_exclude_plist} - else - touch ${_exclude_plist} - fi - - sed \ - -i '' \ - -e "s,%%PRODUCT_NAME%%,${PRODUCT_NAME},g" \ - -e "s,%%PRODUCT_URL%%,${PRODUCT_URL},g" \ - -e "s,%%FLAVOR%%,${_flavor:+-}${_flavor},g" \ - -e "s,%%FLAVOR_DESC%%,${_flavor:+ (${_flavor})},g" \ - -e "s,%%VERSION%%,${_version},g" \ - ${_metadir}/* \ - ${_plist} \ - ${exclude_plist} - - if [ -f "${_exclude_plist}" ]; then - sort -u ${_exclude_plist} > ${_plist}.exclude - mv ${_plist} ${_plist}.tmp - comm -23 ${_plist}.tmp ${_plist}.exclude > ${_plist} - rm -f ${_plist}.tmp ${plist}.exclude - fi - - # Add license information - local _portname=$(sed '/^name: /!d; s,^[^"]*",,; s,",,' ${_metadir}/+MANIFEST) - local _licenses_dir="/usr/local/share/licenses/${_portname}-${_version}" - mkdir -p ${_root}${_licenses_dir} - cp ${BUILDER_ROOT}/LICENSE ${_root}${_licenses_dir}/APACHE20 - echo "This package has a single license: APACHE20 (Apache License 2.0)." \ - > ${_root}${_licenses_dir}/LICENSE - cat <<EOF >${_root}${_licenses_dir}/catalog.mk -_LICENSE=APACHE20 -_LICENSE_NAME=Apache License 2.0 -_LICENSE_PERMS=dist-mirror dist-sell pkg-mirror pkg-sell auto-accept -_LICENSE_GROUPS=FSF OSI -_LICENSE_DISTFILES= -EOF - cat <<EOF >>${_plist} -${_licenses_dir}/catalog.mk -${_licenses_dir}/LICENSE -${_licenses_dir}/APACHE20 -EOF - - mkdir -p ${CORE_PKG_REAL_PATH}/All - if ! pkg create -o ${CORE_PKG_REAL_PATH}/All -p ${_plist} -r ${_root} -m ${_metadir}; then - echo ">>> ERROR: Error building package ${_template} ${_flavor}" - print_error_pfS - fi - - # Cleanup _licenses_dir - rm -rf ${_root}${_licenses_dir} + local _template_path=${BUILDER_TOOLS}/templates/core_pkg/${_template} + + ${SCRIPTS_DIR}/create_core_pkg.sh \ + -t "${_template_path}" \ + -f "${_flavor}" \ + -v "${_version}" \ + -r "${_root}" \ + -F "${_filter}" \ + -d "${CORE_PKG_REAL_PATH}/All" \ + || print_error_pfS } # This routine will output that something went wrong |