# Generates a control directory with a control file and scripts
#
# Copyright (C) 2012 Patrick McDermott
#
# This file is part of opkbuild.
#
# opkbuild is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# opkbuild is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with opkbuild. If not, see .
. "${LIBDATADIR}/libopkbuild.${SHSOEXT}.${LIBOPKBUILD_SHSOVERSION}"
main()
{
ob_set_text_domain 'opkbuild'
ob_init_package '..' || exit 1
ob_parse_package_metadata -c '.opkbuild.cache' || exit 1
if [ -n "${OB_DO_SOURCE}" ]; then
gen_control "src-${OPK_SOURCE}" "${OPK_SOURCE_VERSION}" 'src' 'all' \
"${OPK_SOURCE} source package" 'false'
gen_md5sums "src-${OPK_SOURCE}"
else
for pkg in ${OPK_PACKAGES_REDUCED}; do
ob_set_package_substvars "${pkg}"
arch="$(ob_get_binary_parameter "${pkg}" 'Architecture')"
[ "${arch}" != 'all' ] && arch="${OPK_HOST_ARCH}"
plat="$(ob_get_binary_parameter "${pkg}" 'Platform')"
[ "${plat}" != 'all' ] && plat="${OPK_HOST_PLAT}"
desc="$(ob_get_binary_parameter "${pkg}" 'Description')"
desc="$(ob_substvars "${desc}")"
gen_control "${pkg}" "${OPK_BINARY_VERSION}" "${arch}" "${plat}" \
"${desc}" 'true'
install_maintainer_scripts "${pkg}"
gen_conffiles "${pkg}"
gen_md5sums "${pkg}"
done
fi
}
gen_control()
{
binary="${1}"
version="${2}"
arch="${3}"
plat="${4}"
desc="${5}"
gen_rel="${6}"
# Calculate installed size.
# Don't use du, since that considers the allocated size of files, symbolic
# links, and directories (i.e. actual file sizes plus the filesystem
# overhead on the build system).
# See the following for more information:
#
#
#
sizes="$(find "${binary}.data" -type f -exec wc -c '{}' ';' | \
cut -d ' ' -f 1)"
inst_size=0
for size in ${sizes}; do
inst_size=$(($inst_size + $size))
done
# Convert bytes to kibibytes and round up.
# Note: There is an inconsistency between the Debian Policy Manual and opkg
# in the units of this field. Debian Policy defines this field in units of
# kibibytes:
# The disk space is given as the integer value of the estimated installed
# size in bytes, divided by 1024 and rounded up.
# However, opkg apparently attempts to convert this value from bytes to
# kibibytes in its determination of whether the package's data will fit on
# the system:
# pkg_size_kbs = (pkg->installed_size + 1023)/1024;
# TODO: Further investigate opkg's disk space calculation and, if necessary,
# patch opkg and submit a bug report.
inst_size=$((($inst_size + 1023) / 1024))
mkdir -p "${binary}.control"
cat >"${binary}.control/control" <<-EOF
Package: ${binary}
Source: ${OPK_SOURCE}
Version: ${version}
Architecture: ${arch}
Platform: ${plat}
Maintainer: $(ob_get_source_parameter 'Maintainer' | \
tr '\n' ' ')
EOF
if ${gen_rel}; then
for name in Essential Depends Recommends Suggests Pre-Depends \
Conflicts Provides Replaces; do
value="$(ob_get_binary_parameter "${binary}" "${name}")"
if [ -n "${value}" ]; then
case "${name}" in
'Essential')
;;
'Depends'|'Recommends'|'Suggests'|'Pre-Depends')
value="$(ob_reduce_deps -a "${OPK_HOST_ARCH}" \
-P "${OPK_HOST_PLAT}" "${value}")"
value="$(ob_substvars "${value}")"
;;
'Conflicts'|'Provides'|'Replaces')
value="$(ob_reduce_deps -a "${OPK_HOST_ARCH}" \
-P "${OPK_HOST_PLAT}" -u "${value}")"
value="$(ob_substvars "${value}")"
;;
esac
printf '%s: %s\n' "${name}" "${value}" | \
sed 's/[, ]*$//' \
>>"${binary}.control/control"
fi
done
fi
cat >>"${binary}.control/control" <<-EOF
Installed-Size: ${inst_size}
Description:$(echo "${desc}" | sed 's/^/ /')
EOF
homepage="$(ob_get_source_parameter 'Homepage')"
if [ -n "${homepage}" ]; then
printf '%s: %s\n' 'Homepage' "${homepage}" \
>>"${binary}.control/control"
fi
}
install_maintainer_scripts()
{
binary="${1}"
for script in preinst postinst prerm postrm; do
if [ -L "../${binary}.pkg/${script}" ]; then
target="$(ls -l "../${binary}.pkg/${script}")"
target="${target#* -> }"
ln -s "${target}" "${binary}.control/${script}"
elif [ -r "../${binary}.pkg/${script}" ]; then
cp "../${binary}.pkg/${script}" "${binary}.control/${script}"
chmod 755 "${binary}.control/${script}"
fi
done
}
gen_conffiles()
{
binary="${1}"
if [ -d "${binary}.data/etc" ]; then
find "${binary}.data/etc" -type f | sed "s@^${binary}.data@@" \
>"${binary}.control/conffiles"
if [ -z "$(head -n 1 "${binary}.control/conffiles")" ]; then
rm -f "${binary}.control/conffiles"
else
chmod 644 "${binary}.control/conffiles"
fi
fi
}
gen_md5sums()
{
binary="${1}"
find "${binary}.data" -type f | sort | xargs md5sum | \
sed "s@ ${binary}.data@ @" \
>"${binary}.control/md5sums"
if [ -z "$(head -n 1 "${binary}.control/md5sums")" ]; then
rm -f "${binary}.control/md5sums"
else
chmod 644 "${binary}.control/md5sums"
fi
}
main "${@}"