#!@@SH@@ # # opkbuild # src/ob-gencontrol # Generates a control directory with a control file and scripts. # # Copyright (C) 2012 Patrick "P. J." McDermott # # This program 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. # # This program 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 this program. If not, see . . '@@LIBOPKBUILD@@/load.sm' ob_use locale ob_use output ob_use package main() { ob_set_text_domain 'opkbuild' ob_init_package '..' ob_parse_package_metadata -c '.opkbuild.cache' if [ -n "${OB_DO_SOURCE}" ]; then gen_control "src-${OPK_SOURCE}" "${OPK_SOURCE_VERSION}" 'src' \ "${OPK_SOURCE} source package" 'false' gen_md5sums "src-${OPK_SOURCE}" else for pkg in ${OPK_PACKAGES}; do arch="$(ob_get_binary_parameter "${pkg}" 'Architecture')" [ "${arch}" != 'all' ] && arch="${OPK_HOST_ARCH}" gen_control "${pkg}" "${OPK_BINARY_VERSION}" "${arch}" \ "$(ob_get_binary_parameter "${pkg}" 'Description')" 'true' install_maintainer_scripts "${pkg}" gen_conffiles "${pkg}" gen_md5sums "${pkg}" done fi } gen_control() { binary="${1}" version="${2}" arch="${3}" desc="${4}" gen_rel="${5}" # 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" <>"${binary}.control/control" fi done fi cat >>"${binary}.control/control" <>"${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 "${@}"