summaryrefslogtreecommitdiff
path: root/build-aux/gen-single-binary.sh
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-01-20 10:55:18 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-01-20 10:55:18 +0000
commit70e9163c9c18e995515598085cb824e554eb7ae7 (patch)
treea42dc8b2a6c031354bf31472de888bfc8a060132 /build-aux/gen-single-binary.sh
parentcbf5993c43f49281173f185863577d86bfac6eae (diff)
downloadcoreutils-tarball-master.tar.gz
Diffstat (limited to 'build-aux/gen-single-binary.sh')
-rwxr-xr-xbuild-aux/gen-single-binary.sh111
1 files changed, 111 insertions, 0 deletions
diff --git a/build-aux/gen-single-binary.sh b/build-aux/gen-single-binary.sh
new file mode 100755
index 0000000..4e07cfd
--- /dev/null
+++ b/build-aux/gen-single-binary.sh
@@ -0,0 +1,111 @@
+#!/bin/sh
+
+# Generate the list of rules for the single-binary option based on all the other
+# binaries found in src/local.mk.
+#
+# We need to duplicate the specific rules to build each program into a new
+# static library target. We can't reuse the existing target since we need to
+# create a .a file instead of linking the program. We can't do this at
+# ./configure since the file names need to be available when automake runs
+# to let it generate all the required rules in Makefile.in. The configure
+# step will select which ones will be used to build, but they need to be
+# generated beforehand.
+#
+# Instead of maintaining a duplicated list of rules, we generate the
+# single-binary required rules based on the normal configuration found on
+# src/local.mk with this script.
+
+if test "x$1" = "x"; then
+ echo "Usage: $0 path/to/src/local.mk" >&2
+ exit 1
+fi
+
+set -e
+
+LOCAL_MK=$1
+GEN_LISTS_OF_PROGRAMS="`dirname "$0"`/gen-lists-of-programs.sh"
+
+ALL_PROGRAMS=$($GEN_LISTS_OF_PROGRAMS --list-progs \
+ | grep -v -F -e coreutils -e libstdbuf.so \
+ | tr '[' '_')
+
+# Compute default SOURCES. automake will assume the source file for the
+# src_${cmd} target to be src/${cmd}.c, but we will add rules to generate
+# the lib src_libsinglebin_${cmd}_a which won't match the autogenerated source
+# file. This loop will initialize the default source file and will be reset
+# later if needed.
+for cmd in $ALL_PROGRAMS; do
+ eval "src_${cmd}_SOURCES=src/${cmd}.c"
+done
+
+# Load actual values from src/local.mk. This will read all the variables from
+# the local.mk matching the src_${cmd}_... case.
+while read l; do
+ if echo "$l" | grep -E '^src_\w+ +\+?=' > /dev/null; then
+ var=$(echo $l | cut -f 1 -d ' ')
+ value=$(echo $l | cut -f 2- -d =)
+ if [ "$value" != " \$(LDADD)" ]; then
+ oldvalue=""
+ if echo $l | grep -F '+=' >/dev/null; then
+ eval "oldvalue=\${$var}"
+ fi
+ value=$(echo "$value" | sed "s/'/'\"'\"'/g")
+ eval "$var='$oldvalue "$value"'"
+ fi
+ fi
+done < $LOCAL_MK
+
+me=`echo "$0" | sed 's,.*/,,'`
+echo "## Automatically generated by $me. DO NOT EDIT BY HAND!"
+
+# Override the sources for dir and vdir. We use a smaller version of dir and
+# vdir that relies on the ls main.
+src_dir_SOURCES="src/coreutils-dir.c"
+src_dir_LDADD="$src_dir_LDADD src/libsinglebin_ls.a"
+echo src_libsinglebin_dir_a_DEPENDENCIES = src/libsinglebin_ls.a
+src_vdir_SOURCES="src/coreutils-vdir.c"
+src_vdir_LDADD="$src_vdir_LDADD src/libsinglebin_ls.a"
+echo src_libsinglebin_vdir_a_DEPENDENCIES = src/libsinglebin_ls.a
+
+# Override the sources for arch likewise, using the main from uname.
+src_arch_SOURCES="src/coreutils-arch.c"
+src_arch_LDADD="$src_arch_LDADD src/libsinglebin_uname.a"
+echo src_libsinglebin_arch_a_DEPENDENCIES = src/libsinglebin_uname.a
+
+for cmd in $ALL_PROGRAMS; do
+ echo "# Command $cmd"
+ echo noinst_LIBRARIES += src/libsinglebin_${cmd}.a
+ base="src_libsinglebin_${cmd}_a"
+ # SOURCES
+ var=src_${cmd}_SOURCES
+ eval "value=\$$var"
+ echo "${base}_SOURCES = $value"
+
+ # LDADD
+ var=src_${cmd}_LDADD
+ eval "value=\$$var"
+ if [ "x$value" != "x" ]; then
+ echo "${base}_ldadd = $value"
+ fi
+
+ # CFLAGS
+ # Hack any other program defining a main() replacing its main by
+ # single_binary_main_$PROGRAM_NAME.
+ echo "${base}_CFLAGS = \"-Dmain=single_binary_main_${cmd} (int, char **);" \
+ " int single_binary_main_${cmd}\" " \
+ "-Dusage=_usage_${cmd} \$(src_coreutils_CFLAGS)"
+ var=src_${cmd}_CFLAGS
+ eval "value=\$$var"
+ if [ "x$value" != "x" ]; then
+ echo "${base}_CFLAGS += $value"
+ fi
+
+ # CPPFLAGS
+ var=src_${cmd}_CPPFLAGS
+ eval "value=\$$var"
+ if [ "x$value" != "x" ]; then
+ echo "${base}_CPPFLAGS = $value"
+ fi
+done
+
+exit 0