>From 1ec17595c0c80757a794d9ffa68ed9f64c6a195f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?=
Date: Fri, 4 Jul 2014 15:04:49 +0100 Subject: [PATCH 1/4] build: support --program-prefix et. al. with --enable-single-binary * Makefile.am: Honor any user configured $transform. This also uses 'install' rather than 'ginstall' as the destinary path. --- Makefile.am | 26 +++++++++++++------------- 1 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Makefile.am b/Makefile.am index f4d5fef..20de43b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -189,19 +189,19 @@ check-git-hook-script-sync: # If we are building a single-binary, create symlinks or shebangs for # the selected tools when installing. install-exec-hook: - $(AM_V_at)for i in $(single_binary_progs); do \ - rm -f $(DESTDIR)$(bindir)/$$i$(EXEEXT) || exit $$?; \ - if test "x$(single_binary_install_type)" = xshebangs; then \ - printf '#!%s --coreutils-prog=%s\n' \ - $(bindir)/coreutils$(EXEEXT) $$i \ - >$(DESTDIR)$(bindir)/$$i$(EXEEXT) || exit $$?; \ - chmod a+x,a-w $(DESTDIR)$(bindir)/$$i$(EXEEXT) \ - || exit $$?; \ - else \ - $(LN_S) -s coreutils$(EXEEXT) \ - $(DESTDIR)$(bindir)/$$i$(EXEEXT) \ - || exit $$?; \ - fi \ + $(AM_V_at)ctrans=$$(printf coreutils | sed -e "$(transform)"); \ + for p in $(single_binary_progs); do \ + ptrans=$$(printf '%s' "$$p" | sed -e "$(transform)"); \ + rm -f $(DESTDIR)$(bindir)/$$ptrans$(EXEEXT) || exit $$?; \ + if test "x$(single_binary_install_type)" = xshebangs; then \ + printf '#!%s --coreutils-prog=%s\n' \ + $(bindir)/$$ctrans$(EXEEXT) $$p \ + >$(DESTDIR)$(bindir)/$$ptrans$(EXEEXT) || exit $$?; \ + chmod a+x,a-w $(DESTDIR)$(bindir)/$$ptrans$(EXEEXT) || exit $$?;\ + else \ + $(LN_S) -s $$ctrans$(EXEEXT) \ + $(DESTDIR)$(bindir)/$$ptrans$(EXEEXT) || exit $$?; \ + fi \ done noinst_LIBRARIES = -- 1.7.7.6 >From c53e8a03df916c7757b371f95435380087afecd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Fri, 4 Jul 2014 15:09:17 +0100 Subject: [PATCH 2/4] build: support directly calling coreutils with shebangs enabled When called with a shebang, the path of the shebang script will be added to the command line. Therefore there is a different number of args to strip depending on whether we're calling through the shebang script or directly calling `coreutils --coreutils-prog`. Also adjust argv[0] to just the identified program name. I.E. without the path. This is usually correct, and allows error string matching in the tests to work as expected. --- Makefile.am | 2 +- src/coreutils.c | 26 ++++++++++++++++++++++---- src/local.mk | 2 +- tests/local.mk | 1 + tests/misc/coreutils.sh | 31 +++++++++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 6 deletions(-) create mode 100755 tests/misc/coreutils.sh diff --git a/Makefile.am b/Makefile.am index 20de43b..fb4af27 100644 --- a/Makefile.am +++ b/Makefile.am @@ -194,7 +194,7 @@ install-exec-hook: ptrans=$$(printf '%s' "$$p" | sed -e "$(transform)"); \ rm -f $(DESTDIR)$(bindir)/$$ptrans$(EXEEXT) || exit $$?; \ if test "x$(single_binary_install_type)" = xshebangs; then \ - printf '#!%s --coreutils-prog=%s\n' \ + printf '#!%s --coreutils-prog-shebang=%s\n' \ $(bindir)/$$ctrans$(EXEEXT) $$p \ >$(DESTDIR)$(bindir)/$$ptrans$(EXEEXT) || exit $$?; \ chmod a+x,a-w $(DESTDIR)$(bindir)/$$ptrans$(EXEEXT) || exit $$?;\ diff --git a/src/coreutils.c b/src/coreutils.c index f54f85d..cda7eb3 100644 --- a/src/coreutils.c +++ b/src/coreutils.c @@ -102,7 +102,7 @@ launch_program (const char *prog_name, int prog_argc, char **prog_argv) #include "coreutils.h" #undef SINGLE_BINARY_PROGRAM - if (!prog_main) + if (! prog_main) return; #if HAVE_PRCTL && defined PR_SET_NAME @@ -135,10 +135,28 @@ main (int argc, char **argv) path/to/coreutils --coreutils-prog=someprog someprog ... The third argument is what the program will see as argv[0]. */ - if (argc >= 2 && STRPREFIX (argv[1], "--coreutils-prog=")) + if (argc >= 2) { - prog_name = argv[1] + strlen ("--coreutils-prog="); - launch_program (prog_name, argc - 2, argv + 2); + size_t nskip = 0; + + /* If calling coreutils directly, the "script" name isn't passed. + Distinguish the two cases with a -shebang suffix. */ + if (STRPREFIX (argv[1], "--coreutils-prog=")) + { + nskip = 1; + prog_name = argv[1] + strlen ("--coreutils-prog="); + } + else if (STRPREFIX (argv[1], "--coreutils-prog-shebang=")) + { + nskip = 2; + prog_name = argv[1] + strlen ("--coreutils-prog-shebang="); + } + + if (nskip) + { + argv[nskip] = prog_name; /* XXX: Discards any specified path. */ + launch_program (prog_name, argc - nskip, argv + nskip); + } } /* No known program was selected. From here on, we behave like any other diff --git a/src/local.mk b/src/local.mk index 134f00b..e1a5632 100644 --- a/src/local.mk +++ b/src/local.mk @@ -427,7 +427,7 @@ src/coreutils_shebangs: Makefile $(AM_V_GEN)touch $@ $(AM_V_at)for i in $(single_binary_progs); do \ rm -f src/$$i$(EXEEXT) || exit $$?; \ - printf '#!%s --coreutils-prog=%s\n' \ + printf '#!%s --coreutils-prog-shebang=%s\n' \ $(abs_top_builddir)/src/coreutils$(EXEEXT) $$i \ >src/$$i$(EXEEXT) || exit $$?; \ chmod a+x,a-w src/$$i$(EXEEXT) || exit $$?; \ diff --git a/tests/local.mk b/tests/local.mk index 86050dc..d1e6f59 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -249,6 +249,7 @@ all_tests = \ tests/pr/pr-tests.pl \ tests/misc/pwd-option.sh \ tests/misc/chcon-fail.sh \ + tests/misc/coreutils.sh \ tests/misc/cut.pl \ tests/misc/cut-huge-range.sh \ tests/misc/wc.pl \ diff --git a/tests/misc/coreutils.sh b/tests/misc/coreutils.sh new file mode 100755 index 0000000..ad39c8b --- /dev/null +++ b/tests/misc/coreutils.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# Verify behavior of separate coreutils multicall binary + +# Copyright (C) 2014 Free Software Foundation, Inc. + +# 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