summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--lib/messages.sh12
-rw-r--r--man/opkhelper.7.in110
-rw-r--r--src/opkbuild.sh849
-rw-r--r--strings/en.sh84
5 files changed, 620 insertions, 436 deletions
diff --git a/.gitignore b/.gitignore
index 43bd3f7..c37743b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,4 +11,5 @@ sedscript
src/*[^.]??
lib/*[^.]??
man/*[^.]??
+strings/*[^.]??
opkhelper-*.tar.*
diff --git a/lib/messages.sh b/lib/messages.sh
index e476954..3894778 100644
--- a/lib/messages.sh
+++ b/lib/messages.sh
@@ -63,3 +63,15 @@ oh_info()
printf '\n'
return 0
}
+
+oh_help()
+{
+ _help_str="$(eval echo "\$\{oh_str_help_${0##*/}\}")"
+ : "${_help_str:=${oh_str_help_none}}"
+ printf '%s\n' "${_help_str}"
+}
+
+oh_version()
+{
+ printf "${oh_str_version}\n" "${0##*/}" '@@PACKAGE@@' '@@VERSION@@'
+}
diff --git a/man/opkhelper.7.in b/man/opkhelper.7.in
index 815d6f1..e71e935 100644
--- a/man/opkhelper.7.in
+++ b/man/opkhelper.7.in
@@ -1,6 +1,6 @@
.\" Author: Patrick "P. J." McDermott
.TH opkhelper 7 \
-"2012-04-26" "@@PACKAGE@@-@@VERSION@@" "opkg Build Helper Tools"
+"2012-07-29" "@@PACKAGE@@-@@VERSION@@" "opkg Build Helper Tools"
.SH NAME
opkhelper \- opkg build helper tools
@@ -12,9 +12,9 @@ by the lightweight package manager
These tools are inspired by debhelper, a similar set of programs written
primarily by Joey Hess for Debian.
.sp
-opkhelper is designed to build source packages that comply with draft version
-1.0 of the source package format at
-.IR http://specs.os.pehjota.net/source-package-format-1.0.html .
+opkhelper 2.0.x is designed to build source packages that comply with draft
+version 2.0 of the source package format at
+.IR http://specs.os.pehjota.net/source-package-format-2.0.html .
.SH MAINTAINER AND PACKAGE INTERFACES
opkhelper exposes various interfaces to users building packages and to packages
@@ -92,7 +92,7 @@ files.
.SH ENVIRONMENT VARIABLES
opkbuild makes available to package
-.I build
+.IR config and build
files and other opkhelper tools a number of environment variables that describe
the packages being built, the build and host systems, and the toolchain to be
used. The difference between "build" and "host" systems follows the convention
@@ -100,17 +100,27 @@ set by GNU Autoconf. The build system is the one on which software is built.
The host system is the one on which software is to be run. For more information, see
.IR https://www.gnu.org/software/autoconf/manual/autoconf.html#Specifying-Targe\
t-Triplets .
+
+.SS PACKAGE
.TP
-.B OH_SRCPKG
-The name of the source package
+.B OH_SOURCE
+The source package name
.TP
-.B OH_PKGVER
-The version of the source package
+.B OH_SOURCE_VERSION
+The source package version
.TP
-.B OH_BINPKG
-The name of the current binary package
+.B OH_SOURCE_VERSION_UPSTREAM
+The upstream source package version (which may include a Software Inclusion
+Policy revision number)
.TP
-.B OH_BUILD_ARCH_DIST
+.B OH_BINARY_VERSION
+The binary package version (which is different from
+.B OH_SOURCE_VERSION
+during a binary rebuild)
+
+.SS BUILD AND HOST SYSTEMS
+.TP
+.B OH_BUILD_ARCH
Build system distribution architecture string
.TP
.B OH_BUILD_ARCH_CPU
@@ -131,9 +141,9 @@ Build system GNU system type
.B OH_BUILD_ARCH_KBUILD
Build system kbuild srchitecture name
.sp
-This is likely to be deprecated and removed in the near future.
+This is deprecated.
.TP
-.B OH_HOST_ARCH_DIST
+.B OH_HOST_ARCH
Host system distribution architecture string
.TP
.B OH_HOST_ARCH_CPU
@@ -154,85 +164,61 @@ Host system GNU system type
.B OH_HOST_ARCH_KBUILD
Host system kbuild srchitecture name
.sp
-This is likely to be deprecated and removed in the near future.
+This is deprecated.
+.TP
+.B ARCH
+Host system architecture name as used by kbuild.
+.sp
+This is deprecated.
+
+.SS TOOLS
.TP
.B AR
-"ar" with cross toolchain prefix, if any
+"ar" with cross toolchain prefix
.TP
.B AS
-"as" with cross toolchain prefix, if any
+"as" with cross toolchain prefix
.TP
.B CC
-"gcc" with cross toolchain prefix, if any
+"gcc" with cross toolchain prefix
.TP
.B CPP
-"cpp" with cross toolchain prefix, if any
+"cpp" with cross toolchain prefix
.TP
.B CXX
-"g++" with cross toolchain prefix, if any
+"g++" with cross toolchain prefix
.TP
.B LD
-"ld" with cross toolchain prefix, if any
+"ld" with cross toolchain prefix
.TP
.B NM
-"nm" with cross toolchain prefix, if any
+"nm" with cross toolchain prefix
.TP
.B OBJCOPY
-"objcopy" with cross toolchain prefix, if any
+"objcopy" with cross toolchain prefix
.TP
.B OBJDUMP
-"objdump" with cross toolchain prefix, if any
+"objdump" with cross toolchain prefix
.TP
.B RANLIB
-"ranlib" with cross toolchain prefix, if any
+"ranlib" with cross toolchain prefix
.TP
.B READELF
-"readelf" with cross toolchain prefix, if any
+"readelf" with cross toolchain prefix
.TP
.B SIZE
-"size" with cross toolchain prefix, if any
+"size" with cross toolchain prefix
.TP
.B STRINGS
-"strings" with cross toolchain prefix, if any
+"strings" with cross toolchain prefix
.TP
.B STRIP
-"strip" with cross toolchain prefix, if any
-.TP
-.B ARCH
-Host system architecture name as used by kbuild.
-.sp
-This is likely to be deprecated and removed in the near future.
+"strip" with cross toolchain prefix
.TP
.B CROSS_COMPILE
-Cross toolchain prefix, if any, as used by kbuild.
+Cross toolchain prefix as used by kbuild.
.sp
-This is likely to be deprecated and removed in the near future.
-
-.SH EXAMPLES
-The following is an example
-.I build
-makefile, showing the use of opkhelper tools and environment variables:
-.sp
-.nf
-#! /usr/bin/make -f
-
-PKGS = xmlwf xmlwf-doc libexpat.1 libexpat.1-dev libexpat.1-dbg
-
-$(PKGS): expat.buildstamp
-
-\a.SILENT: expat.buildstamp
-expat.buildstamp:
- cd src && \\
- ./configure --prefix=/usr \\
- --build=$${OH_BUILD_ARCH_GNU} --host=$${OH_HOST_ARCH_GNU} && \\
- make && make DESTDIR=$$(pwd)/../dest install
- oh-strip -gl /usr/lib/libexpat.so.1.6.0
- oh-installfiles $(PKGS)
- oh-installdocs libexpat.1
- oh-gencontrol $(PKGS)
- oh-buildopk $(PKGS)
- touch expat.buildstamp
-.fi
+This is deprecated.
.SH COPYRIGHT
Copyright (C) 2012 Patrick "P. J." McDermott
diff --git a/src/opkbuild.sh b/src/opkbuild.sh
index 114eeed..865c350 100644
--- a/src/opkbuild.sh
+++ b/src/opkbuild.sh
@@ -19,395 +19,496 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-. @@LIBDIR@@/opkhelper/controlfields
-. @@LIBDIR@@/opkhelper/architecture
-. @@LIBDIR@@/opkhelper/archive
+. @@LIBDIR@@/opkhelper/messages
+. @@LIBDIR@@/opkhelper/strings/en
+. @@LIBDIR@@/opkhelper/changelog
+
+# Environment variables:
+export OH_SOURCE=
+export OH_SOURCE_VERSION=
+export OH_SOURCE_VERSION_UPSTREAM=
+export OH_BINARY_VERSION=
+export OH_BUILD_ARCH=
+export OH_BUILD_ARCH_CPU=
+export OH_BUILD_ARCH_KERNEL=
+export OH_BUILD_ARCH_LIBS=
+export OH_BUILD_PLATFORM=
+export OH_BUILD_ARCH_GNU=
+export OH_HOST_ARCH=
+export OH_HOST_ARCH_CPU=
+export OH_HOST_ARCH_KERNEL=
+export OH_HOST_ARCH_LIBS=
+export OH_HOST_PLATFORM=
+export OH_HOST_ARCH_GNU=
+export OH_TOOL_PREFIX=
+export AR=
+export AS=
+export CC=
+export CPP=
+export CXXLD=
+export NM=
+export OBJCOPY=
+export OBJDUMP=
+export RANLIB=
+export READELF=
+export SIZE=
+export STRINGS=
+export STRIP=
+
+# Constant global parameters:
+SOURCE_VERSION_ID_RE='^'
+SOURCE_VERSION_ID_RE="${SOURCE_VERSION_ID_RE}"'[0-9a-z.~]+'
+SOURCE_VERSION_ID_RE="${SOURCE_VERSION_ID_RE}"'(\+sip[1-9][0-9]*)?'
+SOURCE_VERSION_ID_RE="${SOURCE_VERSION_ID_RE}"'(-[1-9][0-9]*)?'
+SOURCE_VERSION_ID_RE="${SOURCE_VERSION_ID_RE}"'(\+[a-z0-9]+-[1-9][0-9]*)?'
+SOURCE_VERSION_ID_RE="${SOURCE_VERSION_ID_RE}"'$'
+
+# Global parameters:
+OPT_BUILD=
+OPT_TARGET=
+OPT_HOST_ARCH=
+OPT_HOST_PLAT=
+OPT_CHECK_BUILD_DEPS=
+OPT_CLEAN=
+OPT_UID0_CMD=
+
+main()
+{
+ get_options
+
+ test_uid0_cmd
+
+ find_sanity
+ oh_changelog_parse changelog setup_package
+
+ if [ "${OPT_BUILD}" = 'source' -o "${OPT_BUILD}" = 'full' ]; then
+ build_source
+ fi
+
+ if [ "${OPT_BUILD}" != 'source' ]; then
+ "${OPT_CHECK_BUILD_DEPS}" && oh-checkbuilddeps
+ setup_build
+ print_arch_stats
+ if [ -n "${OH_CV_STEP}" ]; then
+ "step_${OH_CV_STEP}"
+ else
+ make_work_area
+ fi
+ fi
+}
-print_usage()
+get_options()
{
- cat <<EOF
-Usage: ${1} [-S|-b] [-r assume-uid0-cmd] \
-[-a host-architecture] [-p host-platform] \
-[-s status-override] [-d]
-EOF
+ # Parse and handle command-line options.
+ while getopts 'bBASFT:a:P:Ddr:hV' opt; do
+ case "${opt}" in
+ b)
+ if [ -n "${OPT_BUILD}" ]; then
+ oh_error "${oh_str_basf_mutex}"
+ fi
+ OPT_BUILD=binary
+ ;;
+ B)
+ if [ -n "${OPT_BUILD}" ]; then
+ oh_error "${oh_str_basf_mutex}"
+ fi
+ OPT_BUILD=binary-arch
+ ;;
+ A)
+ if [ -n "${OPT_BUILD}" ]; then
+ oh_error "${oh_str_basf_mutex}"
+ fi
+ OPT_BUILD=binary-indep
+ ;;
+ S)
+ if [ -n "${OPT_BUILD}" ]; then
+ oh_error "${oh_str_basf_mutex}"
+ fi
+ OPT_BUILD=source
+ ;;
+ F)
+ if [ -n "${OPT_BUILD}" ]; then
+ oh_error "${oh_str_basf_mutex}"
+ fi
+ OPT_BUILD=full
+ ;;
+ T)
+ OPT_TARGET="${OPTARG}"
+ ;;
+ a)
+ OPT_HOST_ARCH="${OPTARG}"
+ ;;
+ P)
+ OPT_HOST_PLAT="${OPTARG}"
+ ;;
+ D)
+ OPT_CHECK_BUILD_DEPS=true
+ ;;
+ d)
+ OPT_CHECK_BUILD_DEPS=false
+ ;;
+ C)
+ OPT_CLEAN=true
+ ;;
+ c)
+ OPT_CLEAN=false
+ ;;
+ r)
+ OPT_UID0_CMD="${OPTARG}"
+ ;;
+ h)
+ oh_help
+ exit 0
+ ;;
+ V)
+ oh_version
+ exit 0
+ ;;
+ ?)
+ oh_error "${oh_str_bad_opt}" "${opt}"
+ exit 1
+ ;;
+ esac
+ done
+
+ # Set default option values.
+ [ -z "${OPT_BUILD}" ] && OPT_BUILD=full
+ [ -z "${OPT_CHECK_BUILD_DEPS}" ] && OPT_CHECK_BUILD_DEPS=true
+ [ -z "${OPT_UID0_CMD}" ] && OPT_UID0_CMD=fakeroot
+
+ # Set default target and cleaning behavior.
+ if [ -n "${OPT_TARGET}" ]; then
+ [ -z "${OPT_CLEAN}" ] && OPT_CLEAN=false
+ else
+ if [ "${OPT_BUILD}" = 'full' ]; then
+ OPT_TARGET=binary
+ else
+ OPT_TARGET="${OPT_BUILD}"
+ fi
+ [ -z "${OPT_CLEAN}" ] && OPT_CLEAN=true
+ fi
}
-print_version()
+test_uid0_cmd()
{
- cat <<EOF
-opkbuild (@@PACKAGE@@) @@VERSION@@
-Copyright (C) 2012 Patrick "P. J." McDermott
-License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
-This is free software: you are free to change and redistribute it.
-There is NO WARRANTY, to the extent permitted by law.
-
-Written by P. J. McDermott.
-EOF
+ # Verify that the UID 0 command works.
+ test_uid=$("${OPT_UID_CMD}" id -u)
+ if [ "${?}" -ne 0 ]; then
+ oh_error "${oh_str_uid0_cmd_not_found}" "${OPT_UID_CMD}"
+ fi
+ if [ "${test_uid}" -ne 0 ]; then
+ oh_error "${oh_str_uid0_cmd_bad_uid}" "${OPT_UID_CMD}"
+ fi
}
-error()
+find_sanity()
{
- [ ${#} -eq 1 ] && printf 'opkbuild: [%s] Error\n' "${1}" >&2
- if ${dbg}; then
- printf 'opkbuild: Starting debugging shell...\n' >&2
- @@SHELL@@
+ oh_info "${oh_str_find_sanity}"
+
+ format="$(cat format 2>/dev/null)"
+ if [ "${?}" -ne 0 ]; then
+ oh_error "${oh_str_no_format}"
fi
- cd ..
- rm -Rf tmp 2> /dev/null
- exit 1
+ if [ "${format}" -ne 0 ]; then
+ oh_error "${oh_str_unsupported_format}"
+ fi
+
+ # Check for all files immediately required by SPF 2.0.
+ [ ! -f 'control' ] && oh_error "${oh_str_no_control}"
+ [ ! -x 'config' ] && oh_error "${oh_str_no_config}"
+ [ ! -f 'copyright' ] && oh_error "${oh_str_no_copyright}"
+ [ ! -f 'changelog' ] && oh_error "${oh_str_no_changelog}"
}
-source_only=false
-binary_only=false
-opts=$(getopt -n "${0}" -o 'Sbr:a:p:ds:V' -- "${@}")
-if [ ${?} -ne 0 ]; then
- print_usage "${0}" >&2
- exit 1;
-fi
-eval set -- "${opts}"
-while true; do
- case "${1}" in
- -S)
- source_only=true
- shift
- ;;
- -b)
- binary_only=true
- shift
- ;;
- -r)
- uid0_cmd=${2}
- shift 2
- ;;
- -a)
- host_arch=${2}
- shift 2
- ;;
- -p)
- host_platform=${2}
- shift 2
- ;;
- -d)
- dbg=true
- shift
- ;;
- -s)
- status_override=${2}
- shift 2
- ;;
- -V)
- print_version
- exit 0
- ;;
- --)
- shift
- break
- ;;
- *)
- print_usage "${0}" >&2
- exit 1
- ;;
- esac
-done
-
-if ${source_only} && ${binary_only}; then
- printf 'opkbuild: Error: Cannot combine -S and -b\n' >&2
- exit 1
-fi
-if [ -z "${uid0_cmd}" ]; then
- uid0_cmd=fakeroot
-fi
-${uid0_cmd} true
-if [ ${?} -ne 0 ]; then
- printf 'opkbuild: Error running command to gain UID 0\n' >&2
- exit 1
-fi
-if [ -z "${dbg}" ]; then
- dbg=false
-fi
-
-# Sanity checks.
-printf 'opkbuild: Checking for sanity...\n'
-if [ ! -f format -o ! -f build -o ! -f control ]; then
- printf 'Error: Current working directory is not a source package.\n' >&2
- exit 1
-fi
-if [ "$(cat format)" != '1.0' ]; then
- printf 'Error: Source package is of an incompatible version.\n' >&2
- exit 1
-fi
-
-# Attempt to detect the build architecture.
-build_arch=$(opkg print-architecture | sed -n \
- 's/^arch \([^ -][^ -]*-[^ -][^ -]*-[^ -][^ -]*\) [0-9][0-9]*$/\1/p')
-if [ -z "${build_arch}" ]; then
- printf 'opkbuild: Error: No installable architecture found\n' >&2
- exit 1
-elif [ $(echo "${build_arch}" | wc -l) -gt 1 ]; then
- printf 'opkbuild: Error: Multiple installable architectures found\n' >&2
- exit 1
-fi
-
-# If a host architecture is not specified, natively build.
-if [ -z "${host_arch}" ]; then
- host_arch="${build_arch}"
-fi
-
-# Attempt to detect the build platform.
-build_platform=$(opkg print-architecture | sed -n \
- 's/^arch \([^ -][^ -]*\) [0-9][0-9]*$/\1/p' | \
- grep -v 'all')
-if [ -z "${build_platform}" ]; then
- printf 'opkbuild: Error: No build platforms found\n' >&2
- exit 1
-elif [ $(echo "${build_platform}" | wc -l) -gt 1 ]; then
- printf 'opkbuild: Error: Multiple build platforms found\n' >&2
- exit 1
-fi
-
-# If there no config files to copy, build platform-independent packages.
-if [ ! -f config ]; then
- host_platform=''
-# If a host platform was not specified, natively configure.
-elif [ -z "${host_platform}" ]; then
- host_platform="${build_platform}"
-fi
-
-# Resolve status override file path.
-pkg_dir="${PWD}"
-cd "$(dirname "${status_override}")"
-status_override="${PWD}/$(basename "${status_override}")"
-cd "${pkg_dir}"
-
-# Make work area.
-printf 'opkbuild: Making work area...\n'
-mkdir tmp
-cd tmp
-
-# Get source package name and version.
-printf 'opkbuild: Reading source package control fields...\n'
-srcpkg=$(oh_get_field Source)
-version=$(oh_get_field Version)
-export OH_SRCPKG="${srcpkg}"
-export OH_PKGVER=${version}
-
-# Set environment variables for the build architecture.
-export OH_BUILD_ARCH_DIST="${build_arch}"
-IFS=- read OH_BUILD_ARCH_CPU OH_BUILD_ARCH_KERNEL OH_BUILD_ARCH_LIBS <<EOF
-${OH_BUILD_ARCH_DIST}
-EOF
-export OH_BUILD_ARCH_CPU OH_BUILD_ARCH_KERNEL OH_BUILD_ARCH_LIBS
-export OH_BUILD_PLATFORM="${build_platform}"
+setup_package()
+{
+ [ -n "${OH_SOURCE}" ] && return
+ OH_SOURCE="${OH_CHANGELOG_SOURCE}"
+ OH_SOURCE_VERSION="${OH_CHANGELOG_VERSION}"
+
+ # Validate source package version identifier.
+ echo "${OH_SOURCE_VERSION}" | grep -E "${SOURCE_VERSION_ID_RE}" \
+ >/dev/null 2>&1
+ if [ "${?}" -ne 0 ]; then
+ oh_error "${oh_str_bad_source_version}" "${OH_SOURCE_VERSION}"
+ fi
-# Set environment variables for the host architecture and platform.
-export OH_HOST_ARCH_DIST="${host_arch}"
-IFS=- read OH_HOST_ARCH_CPU OH_HOST_ARCH_KERNEL OH_HOST_ARCH_LIBS <<EOF
-${OH_HOST_ARCH_DIST}
-EOF
-export OH_HOST_ARCH_CPU OH_HOST_ARCH_KERNEL OH_HOST_ARCH_LIBS
-export OH_HOST_PLATFORM="${host_platform}"
-
-# Make sure the architecture table exists.
-if [ ! -f "@@DATADIR@@/opkhelper/archtab" ]; then
- printf 'opkbuild: Error: architecture table not found.\n' >&2
- exit 1
-fi
-
-archtab_bre='[ \t][ \t]*\([^ \t][^ \t]*[ \t][ \t]*[^ \t][^ \t]*\)'
-
-# TODO: kbuild doesn't have standardized architecture names. For example, IA-32
-# is known as "x86" in Linux and "i386" in BusyBox. So we should support a
-# comma-separated list of possible values and try to find one in src/arch once
-# the software source code is copied into the work area.
-
-# TODO: Ideally, we should have a tool like debhelper's dh_auto_configure that
-# detects the build system in use and configures the build automatically,
-# including cross building options.
-
-# Look up build GNU and kbuild architecture names.
-archtab_row_build="$(sed -n \
- "s/^${OH_BUILD_ARCH_DIST}${archtab_bre}\$/\\1/p" \
- "@@DATADIR@@/opkhelper/archtab")"
-if [ -z "${archtab_row_build}" ]; then
- printf 'opkbuild: Error: "%s" not found in architecture table.\n' \
- "${OH_BUILD_ARCH_DIST}" >&2
- exit 1
-fi
-read OH_BUILD_ARCH_GNU OH_BUILD_ARCH_KBUILD <<EOF
-${archtab_row_build}
+ OH_SOURCE_VERSION_UPSTREAM="${OH_SOURCE_VERSION:%%-}"
+ OH_BINARY_VERSION="${OH_SOURCE_VERSION}"
+}
+
+build_source()
+{
+ # TODO: Build source package.
+}
+
+setup_build()
+{
+ setup_build_arch
+ setup_build_flags
+ setup_build_platform
+ setup_host_arch
+ setup_host_platform
+ setup_toolchain
+}
+
+setup_build_arch()
+{
+ # TODO: Get build arch from opkg.
+ # TODO: Get GNU system type from table.
+
+ IFS=- read OH_BUILD_ARCH_CPU OH_BUILD_ARCH_KERNEL OH_BUILD_ARCH_LIBS <<EOF
+${OH_BUILD_ARCH}
EOF
-export OH_BUILD_ARCH_GNU OH_BUILD_ARCH_KBUILD
-
-# Look up host GNU and kbuild architecture names.
-archtab_row_host="$(sed -n \
- "s/^${OH_HOST_ARCH_DIST}${archtab_bre}\$/\\1/p" \
- "@@DATADIR@@/opkhelper/archtab")"
-if [ -z "${archtab_row_host}" ]; then
- printf 'opkbuild: Error: "%s" not found in architecture table.\n' \
- "${OH_HOST_ARCH_DIST}" >&2
- exit 1
-fi
-read OH_HOST_ARCH_GNU OH_HOST_ARCH_KBUILD <<EOF
-${archtab_row_host}
+}
+
+setup_build_flags()
+{
+ # TODO: Don't hardcode path.
+ if [ -f "/usr/local/share/opkhelper/buildflags/${OH_HOST_ARCH_CPU}" ]; then
+ . /usr/local/share/opkhelper/buildflags/${OH_HOST_ARCH_CPU}
+ fi
+}
+
+setup_build_platform()
+{
+ # TODO: Get build platform from opkg.
+}
+
+setup_host_arch()
+{
+ if [ -n "${OPT_HOST_ARCH}" ]; then
+ OH_HOST_ARCH="${OPT_HOST_ARCH}"
+ else
+ OH_HOST_ARCH="${OH_BUILD_ARCH}"
+ fi
+
+ IFS=- read OH_HOST_ARCH_CPU OH_HOST_ARCH_KERNEL OH_HOST_ARCH_LIBS <<EOF
+${OH_HOST_ARCH}
EOF
-export OH_HOST_ARCH_GNU OH_HOST_ARCH_KBUILD
-
-# Detect cross building.
-if [ "${OH_BUILD_ARCH_GNU}" != "${OH_HOST_ARCH_GNU}" ]; then
- toolchain_prefix="${OH_HOST_ARCH_GNU}-"
-else
- toolchain_prefix=
-fi
-
-# Set toolchain environment variables.
-# NB: This is written for GNU Binutils and GCC and won't work for, e.g., LLVM.
-export AR="${toolchain_prefix}ar"
-export AS="${toolchain_prefix}as"
-export CC="${toolchain_prefix}gcc"
-export CPP="${toolchain_prefix}cpp"
-export CXX="${toolchain_prefix}g++"
-export LD="${toolchain_prefix}ld"
-export NM="${toolchain_prefix}nm"
-export OBJCOPY="${toolchain_prefix}objcopy"
-export OBJDUMP="${toolchain_prefix}objdump"
-export RANLIB="${toolchain_prefix}ranlib"
-export READELF="${toolchain_prefix}readelf"
-export SIZE="${toolchain_prefix}size"
-export STRINGS="${toolchain_prefix}strings"
-export STRIP="${toolchain_prefix}strip"
-# These are used by kbuild (the build system of Linux, BusyBox, and others).
-export ARCH="${OH_HOST_ARCH_KBUILD}"
-export CROSS_COMPILE="${toolchain_prefix}"
-
-# Set build flags.
-if [ -f "@@DATADIR@@/opkhelper/buildflags/${OH_HOST_ARCH_CPU}" ]; then
- . @@DATADIR@@/opkhelper/buildflags/${OH_HOST_ARCH_CPU}
-fi
-
-# Print build and host architecture and platform information.
-printf 'opkbuild: Build system:\n'
-printf 'opkbuild: Architecture: %s (%s, %s)\n' \
- "${OH_BUILD_ARCH_DIST}" "${OH_BUILD_ARCH_GNU}" "${OH_BUILD_ARCH_KBUILD}"
-printf 'opkbuild: Platform: %s\n' "${OH_BUILD_PLATFORM}"
-printf 'opkbuild: Host system:\n'
-printf 'opkbuild: Architecture: %s (%s, %s)\n' \
- "${OH_HOST_ARCH_DIST}" "${OH_HOST_ARCH_GNU}" "${OH_HOST_ARCH_KBUILD}"
-printf 'opkbuild: Platform: %s\n' "${OH_HOST_PLATFORM:-<none>}"
-
-# Check build dependencies.
-oh-checkbuilddeps -s "${status_override}" || error "${srcpkg}-src"
-
-printf '\n'
-
-# TODO: This should maybe go in the library.
-
-if ! ${binary_only}; then
-
-# Build *-src package.
-printf 'opkbuild: Attempting to build package "%s"...\n' "${srcpkg}-src"
-printf 'opkbuild: Installing files for package "%s"...\n' "${srcpkg}-src"
-${uid0_cmd} mkdir -p ${srcpkg}-src.data/usr/src/${srcpkg}_${version} ||
- error "${srcpkg}-src"
-for file in ../*; do
- case ${file} in
- ../tmp)
- ;;
- ../*)
- ${uid0_cmd} cp -R ${file} \
- ${srcpkg}-src.data/usr/src/${srcpkg}_${version} ||
- error "${srcpkg}-src"
- ;;
- esac
-done
-( ${uid0_cmd} oh-gencontrol -s;) || error "${srcpkg}-src"
-( ${uid0_cmd} oh-buildopk -s;) || error "${srcpkg}-src"
-( ${uid0_cmd} rm -Rf ${srcpkg}-src.data;) || error "${srcpkg}-src"
-printf 'opkbuild: Package "%s" complete!\n\n' "${srcpkg}-src"
-
-fi
-
-# TODO: This should maybe go in the library.
-
-if ! ${source_only}; then
-
-# Build other binary packages.
-for binpkgdir in ../*.pkg/; do
- binpkg=${binpkgdir#'../'}
- binpkg=${binpkg%'.pkg/'}
- export OH_BINPKG="${binpkg}"
- # Check architecture.
- oh_is_buildable "${binpkg}"
- if [ ${?} -eq 0 ]; then
- printf 'opkbuild: Attempting to build package "%s"...\n' "${binpkg}"
- # Copy or extract software sources to src.
- if [ -d ../src ]; then
- printf 'opkbuild: Copying sources into work area...\n'
- cp -Rp ../src src || error "${binpkg}"
- else
- printf 'opkbuild: Extracting sources into work area...\n'
- oh_archive_extract_source
- case ${?} in
- 1)
- printf 'opkbuild: Error: No source archive found\n' >&2
- error
- ;;
- 2)
- printf 'opkbuild: Error: Multiple source archives found\n' \
- >&2
- error
- ;;
- 3)
- printf 'opkbuild: Error: %s\n' \
- 'Unsupported archive compression format detected' >&2
- error
- ;;
- 4)
- printf 'opkbuild: Error: %s\n' \
- 'No directories found in source archive' >&2
- error
- ;;
- 5)
- printf 'opkbuild: Error: %s\n' \
- 'Multiple top-level directories found in source archive' >&2
- error
- ;;
- 6)
- printf 'opkbuild: Error: %s\n' \
- 'Failed to extract source archive' >&2
- error
- ;;
- 7)
- printf 'opkbuild: Error: %s\n' \
- 'Failed to move extracted sources' >&2
- error
- ;;
- esac
- fi
- # Make installation directory.
- # TODO: Maybe this should be an FHS-compliant filesystem hierarchy.
- mkdir dest || error "${binpkg}"
- # Apply patches.
- oh-applypatches
- # Copy platform config files.
- oh-copyconfig || error "${binpkg}"
- # Build the package.
- ${uid0_cmd} ../build ${binpkg} || error "${binpkg}"
- printf 'opkbuild: Package "%s" complete!\n\n' "${binpkg}"
- # Clean up everything except the build stamps.
- for file in *; do
- case ${file} in
- *stamp)
- ;;
- *)
- ${uid0_cmd} rm -Rf ${file} || error "${binpkg}"
- ;;
- esac
+}
+
+setup_host_platform()
+{
+ if [ -n "${OPT_HOST_PLAT}" ]; then
+ OH_HOST_PLATFORM="${OPT_HOST_PLAT}"
+ else
+ OH_HOST_PLATFORM="${OH_BUILD_PLATFORM}"
+ fi
+}
+
+setup_toolchain()
+{
+ OH_TOOL_PREFIX="${OH_HOST_ARCH}-"
+
+ # Set toolchain environment variables.
+ # NB: This is written for GNU Binutils and GCC and won't work for, e.g., LLVM.
+ AR="${OH_TOOL_PREFIX}ar"
+ AS="${OH_TOOL_PREFIX}as"
+ CC="${OH_TOOL_PREFIX}gcc"
+ CPP="${OH_TOOL_PREFIX}cpp"
+ CXX="${OH_TOOL_PREFIX}g++"
+ LD="${OH_TOOL_PREFIX}ld"
+ NM="${OH_TOOL_PREFIX}nm"
+ OBJCOPY="${OH_TOOL_PREFIX}objcopy"
+ OBJDUMP="${OH_TOOL_PREFIX}objdump"
+ RANLIB="${OH_TOOL_PREFIX}ranlib"
+ READELF="${OH_TOOL_PREFIX}readelf"
+ SIZE="${OH_TOOL_PREFIX}size"
+ STRINGS="${OH_TOOL_PREFIX}strings"
+ STRIP="${OH_TOOL_PREFIX}strip"
+}
+
+print_arch_stats()
+{
+ oh_info "${oh_str_build_arch_stat_header}"
+ oh_info "${oh_str_arch_stat_arch}" "${OH_BUILD_ARCH}"
+ oh_info "${oh_str_arch_stat_plat}" "${OH_BUILD_PLATFORM}"
+ oh_info "${oh_str_host_arch_stat_header}"
+ oh_info "${oh_str_arch_stat_arch}" "${OH_HOST_ARCH}"
+ oh_info "${oh_str_arch_stat_plat}" "${OH_HOST_PLATFORM}"
+}
+
+make_work_area()
+{
+ mkdir tmp || oh_error "${oh_str_cant_make_work_area}"
+ cd tmp || oh_error "${oh_str_cant_enter_work_area}"
+
+ step_unpack
+}
+
+step_unpack()
+{
+ oh_cv_set step unpack
+
+ # TODO: Put this in oh-unpacksource.
+ if [ -d ../src ]; then
+ oh_info "${oh_str_unpacking_native}"
+ cp -Rp ../src src || oh_error "${oh_str_cant_unpack_native}"
+ else
+ archive_base_name="${OH_SOURCE}-${OH_SOURCE_VERSION_UPSTREAM}.orig.tar."
+ archive_matches=$(find .. -name "${archive_base_name}*")
+ case "$(echo "${archive_matches}" | wc -l)" in
+ 0)
+ oh_error "${oh_str_no_sources}"
+ ;;
+ 1)
+ ;;
+ *)
+ oh_error "${oh_str_multiple_upstream_sources}"
+ ;;
+ esac
+ z_ext="${archive_matches#../${archive_base_name}}"
+ case ${z_ext} in
+ gz)
+ z=z
+ ;;
+ bz2)
+ z=j
+ ;;
+ lz)
+ z=a
+ ;;
+ Z)
+ z=Z
+ ;;
+ *)
+ oh_error "${oh_str_unsupported_archive_compression}" "${z_ext}"
+ ;;
+ esac
+ sed 's@^./@@' | grep '^[^/]*/$'
+ top_dirs=$(tar "-t${z}f" "${archive_matches}${z_ext}" | \
+ sed -n 's@^\./\([^/]*\)$@\1@p')
+ case "$(echo "${top_dirs}" | wc -l)" in
+ 0)
+ oh_error "${oh_str_no_upstream_dirs}"
+ ;;
+ 1)
+ ;;
+ *)
+ oh_error "${oh_str_multiple_top_upstream_dirs}"
+ esac
+ oh_info "${oh_str_unpacking_upstream}"
+ tar "-x${z}f" "${archive_matches}${z_ext}" || \
+ oh_error "${oh_str_cant_unpack_upstream}"
+ mv "${top_dirs}" src || oh_error "${oh_str_cant_move_native}"
+ fi
+
+ step_patch
+}
+
+step_patch()
+{
+ oh_cv_set step patch
+
+ # TODO: Put this in oh-applypatches.
+ applied=false
+ if [ -d ../patches ]; then
+ # Iterate over patches ordered alphabetically by name.
+ for patch in $(ls -1 ../patches | sort); do
+ oh_info "${oh_str_applying_patch}" "${patch}"
+ patch -N -p 1 -u -d src -i "../../patches/${patch}" || \
+ oh_error "${oh_str_cant_apply_patch}" "${patch}"
+ applied=true
done
fi
-done
+ ${applied} || oh_info "${oh_str_no_patches}"
+
+ step_config
+}
+
+step_config()
+{
+ oh_cv_set step config
+
+ ./config
+
+ step_platconf
+}
+
+step_platconf()
+{
+ oh_cv_set step platconf
+
+ # TODO: Put this in oh-copyconfig.
+ if [ -f ../config ]; then
+ while read -r src dest; do
+ if [ -z "${src}" -o -z "${dest}" ]; then
+ oh_error
+ fi
+ # Make sure the destination directory exists.
+ mkdir -p "${dest%/*}" || oh_error
+ # Find the config package files.
+ # TODO: Don't hardcode path.
+ config_dir_base="/usr/share/config/${OH_HOST_PLATFORM}/${OH_SOURCE}"
+ if [ -d "${config_dir_base}-${OH_SOURCE_VERSION_UPSTREAM}" ]; then
+ src_base="${config_dir_base}-${OH_SOURCE_VERSION_UPSTREAM}"
+ elif [ -d "${config_dir_base}" ]; then
+ src_base="${config_dir_base}"
+ else
+ # This shouldn't happen unless the package maintainer neglected
+ # to add the config package to the package's Build-Depends
+ # field.
+ oh_error
+ fi
+ # Copy the config file(s).
+ oh_info
+ cp -p "${src_base}/${src}" "${dest}" || oh_error
+ done <../config
+ fi
+ for bin_config in ../*.pkg/config; do
+ while read -r src dest; do
+ if [ -z "${src}" -o -z "${dest}" ]; then
+ oh_error
+ fi
+ # Make sure the destination directory exists.
+ mkdir -p "dest/${dest%/*}" || oh_error
+ # Find the config package files.
+ # TODO: Don't hardcode path.
+ config_dir_base="/usr/share/config/${OH_HOST_PLATFORM}/${OH_SOURCE}"
+ if [ -d "${config_dir_base}-${OH_SOURCE_VERSION_UPSTREAM}" ]; then
+ src_base="${config_dir_base}-${OH_SOURCE_VERSION_UPSTREAM}"
+ elif [ -d "${config_dir_base}" ]; then
+ src_base="${config_dir_base}"
+ else
+ # This shouldn't happen unless the package maintainer neglected
+ # to add the config package to the package's Build-Depends
+ # field.
+ oh_error
+ fi
+ # Copy the config file(s).
+ oh_info
+ cp -p "${src_base}/${src}" "dest/${dest}" || oh_error
+ done <"${bin_config}"
+ done
+
+ step_build
+}
+
+step_build()
+{
+ oh_cv_set step build
-fi
+ ./build "${OPT_TARGET}"
+
+ "${OPT_CLEAN}" && step_clean
+}
+
+step_clean()
+{
+ oh_cv_set step clean
+
+ ./config clean
+
+ step_cleanwork
+}
+
+step_cleanwork()
+{
+ oh_cv_clear
+
+ cd ..
+ rm -Rf tmp
+}
-# Clean up tmp.
-cd ..
-rm -Rf tmp
+main "${@}"
diff --git a/strings/en.sh b/strings/en.sh
new file mode 100644
index 0000000..12c9248
--- /dev/null
+++ b/strings/en.sh
@@ -0,0 +1,84 @@
+# opkhelper
+# strings/en
+# English message strings.
+#
+# 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 <http://www.gnu.org/licenses/>.
+
+# General strings:
+oh_str_help_none='No help found'
+oh_str_version='%s (%s) %s
+Copyright (C) 2012 Patrick "P. J." McDermott
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+Written by P. J. McDermott.'
+oh_str_bad_opt='Invalid option "%s"'
+
+# opkbuild strings:
+oh_str_help_opkbuild='Usage: opkbuild [<option>...]
+
+Options:
+ -b build only binary packages
+ -B build only architecture-dependent binary packages
+ -A build only architecture-independent binary packages
+ -S build only the source package
+ -F build the source package and all binary packages
+ -T <target> target of the "build" makefile to build
+ -a <host-arch> distribution architecture for which architecture-
+ dependent packages should be built (default: system
+ architecture)
+ -P <host-plat> application platform for which platform-specific
+ packages should be configured (default: system
+ platform)
+ -D check build dependencies (default behavior)
+ -d do not check build dependencies
+ -C clean source packaging after build (default behavior
+ unless the -T option is given)
+ -c do not clean source packaging
+ -r <uid0-cmd> command to assume user ID 0 (default: fakeroot)
+ -h display this help and exit
+ -V display the version and exit'
+oh_str_basf_mutex='Options -b, -B, -A, -S, and -F are mutually exclusive'
+oh_str_uid0_cmd_not_found='UID 0 command "%s" not found'
+oh_str_uid0_cmd_bad_uid='UID 0 command "%s" doesn'\''t give UID 0'
+oh_str_find_sanity='Looking for sanity...'
+oh_str_no_format='No "format" file found'
+oh_str_unsupported_format='Source package format "%s" unsupported'
+oh_str_no_control='No "control" file found'
+oh_str_no_config='No "config" file found'
+oh_str_no_copyright='No "copyright" file found'
+oh_str_no_changelog='No "changelog" file found'
+oh_str_bad_source_version='Invalid source package version identifier "%s"'
+oh_str_build_arch_stat_header='Build system:'
+oh_str_arch_stat_arch=' Architecture: %s'
+oh_str_arch_stat_plat=' Platform: %s'
+oh_str_host_arch_stat_header='Host system:'
+oh_str_cant_make_work_area='Can'\''t make work area'
+oh_str_cant_enter_work_area='Can'\''t enter work area'
+oh_str_unpacking_native='Copying native source directory...'
+oh_str_cant_unpack_native='Can'\''t copy native source directory'
+oh_str_no_sources='No native or upstream sources found'
+oh_str_multiple_upstream_sources='Multiple upstream source archives found'
+oh_str_unsupported_archive_compression='Compression format with extension "%s" nsupported'
+oh_str_no_upstream_dirs='No directories found in upstream source archive'
+oh_str_multiple_top_upstream_dirs='Multiple top-level directories found in upstream source archive'
+oh_str_unpacking_upstream='Extracting upstream source archive...'
+oh_str_cant_unpack_upstream='Can'\''t extract upstream source archive'
+oh_str_cant_move_native='Can'\''t move extracted upstream source directory'
+oh_str_applying_patch='Applying patch "%s"...'
+oh_str_cant_apply_patch='Can'\''t apply patch "%s"'
+oh_str_no_patches='No patches to be applied'