[pacman-dev] [PATCH] makepkg: make in-place sed portable
Do a sed replacement in-place is not very portable. On Mac OSX and BSDs, the syntax is "sed -i ''" where as with GNU sed the command is "sed -i''" or just "sed -i". This patch detects which command should be used during configure. Credit to Kevin Barry who researched this issue and provided a patch to work around this using temporary backup files. Signed-off-by: Allan McRae <allan@archlinux.org> --- configure.ac | 5 +++++ scripts/Makefile.am | 1 + scripts/makepkg.sh.in | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 5dcbe79..a83d5e4 100644 --- a/configure.ac +++ b/configure.ac @@ -180,9 +180,11 @@ GCC_GNU89_INLINE_CC # Host-dependant definitions SIZECMD="stat -c %s" +SEDINPLACE="sed -i" case "${host_os}" in *bsd*) SIZECMD="stat -f %z" + SEDINPLACE="sed -i ''" ;; cygwin*) host_os_cygwin=yes @@ -191,12 +193,14 @@ case "${host_os}" in darwin*) host_os_darwin=yes SIZECMD="/usr/bin/stat -f %z" + SEDINPLACE="sed -i ''" ;; esac AM_CONDITIONAL([CYGWIN], test "x$host_os_cygwin" = "xyes") AM_CONDITIONAL([DARWIN], test "x$host_os_darwin" = "xyes") AC_SUBST(SIZECMD) +AC_SUBST(SEDINPLACE) # Check for architecture, used in default makepkg.conf # (Note single space left after CARCHFLAGS) @@ -356,6 +360,7 @@ ${PACKAGE_NAME}: Architecture flags : ${CARCHFLAGS} Host Type : ${CHOST} Filesize command : ${SIZECMD} + In-place sed command : ${SEDINPLACE} libalpm version : ${LIB_VERSION} libalpm version info : ${LIB_VERSION_INFO} diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 5a2b780..5d65653 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -41,6 +41,7 @@ edit = sed \ -e 's|@DBEXT[@]|$(DBEXT)|g' \ -e 's|@BUILDSCRIPT[@]|$(BUILDSCRIPT)|g' \ -e 's|@SIZECMD[@]|$(SIZECMD)|g' \ + -e 's|@SEDINPLACE[@]|$(SEDINPLACE)|g' \ -e 's|@configure_input[@]|Generated from $@.in; do not edit by hand.|g' ## All the scripts depend on Makefile so that they are rebuilt when the diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index c97eff2..ca25fbb 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -1171,8 +1171,8 @@ devel_update() { if [ -n "$newpkgver" ]; then if [ "$newpkgver" != "$pkgver" ]; then if [ -f "./$BUILDSCRIPT" ]; then - sed -i "s/^pkgver=[^ ]*/pkgver=$newpkgver/" "./$BUILDSCRIPT" - sed -i "s/^pkgrel=[^ ]*/pkgrel=1/" "./$BUILDSCRIPT" + @SEDINPLACE@ "s/^pkgver=[^ ]*/pkgver=$newpkgver/" "./$BUILDSCRIPT" + @SEDINPLACE@ "s/^pkgrel=[^ ]*/pkgrel=1/" "./$BUILDSCRIPT" source "$BUILDSCRIPT" fi fi -- 1.6.2.4
On Sun, Apr 26, 2009 at 6:13 AM, Allan McRae <allan@archlinux.org> wrote:
Do a sed replacement in-place is not very portable. On Mac OSX and BSDs, the syntax is "sed -i ''" where as with GNU sed the command is "sed -i''" or just "sed -i". This patch detects which command should be used during configure.
Credit to Kevin Barry who researched this issue and provided a patch to work around this using temporary backup files.
Signed-off-by: Allan McRae <allan@archlinux.org> Signed-off-by: Dan McGee <dan@archlinux.org>
Of course I didn't test it too extensively, but the concept looks just fine.
--- configure.ac | 5 +++++ scripts/Makefile.am | 1 + scripts/makepkg.sh.in | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac index 5dcbe79..a83d5e4 100644 --- a/configure.ac +++ b/configure.ac @@ -180,9 +180,11 @@ GCC_GNU89_INLINE_CC
# Host-dependant definitions SIZECMD="stat -c %s" +SEDINPLACE="sed -i" case "${host_os}" in *bsd*) SIZECMD="stat -f %z" + SEDINPLACE="sed -i ''" ;; cygwin*) host_os_cygwin=yes @@ -191,12 +193,14 @@ case "${host_os}" in darwin*) host_os_darwin=yes SIZECMD="/usr/bin/stat -f %z" + SEDINPLACE="sed -i ''" ;; esac
AM_CONDITIONAL([CYGWIN], test "x$host_os_cygwin" = "xyes") AM_CONDITIONAL([DARWIN], test "x$host_os_darwin" = "xyes") AC_SUBST(SIZECMD) +AC_SUBST(SEDINPLACE)
# Check for architecture, used in default makepkg.conf # (Note single space left after CARCHFLAGS) @@ -356,6 +360,7 @@ ${PACKAGE_NAME}: Architecture flags : ${CARCHFLAGS} Host Type : ${CHOST} Filesize command : ${SIZECMD} + In-place sed command : ${SEDINPLACE}
libalpm version : ${LIB_VERSION} libalpm version info : ${LIB_VERSION_INFO} diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 5a2b780..5d65653 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -41,6 +41,7 @@ edit = sed \ -e 's|@DBEXT[@]|$(DBEXT)|g' \ -e 's|@BUILDSCRIPT[@]|$(BUILDSCRIPT)|g' \ -e 's|@SIZECMD[@]|$(SIZECMD)|g' \ + -e 's|@SEDINPLACE[@]|$(SEDINPLACE)|g' \ -e 's|@configure_input[@]|Generated from $@.in; do not edit by hand.|g'
## All the scripts depend on Makefile so that they are rebuilt when the diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index c97eff2..ca25fbb 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -1171,8 +1171,8 @@ devel_update() { if [ -n "$newpkgver" ]; then if [ "$newpkgver" != "$pkgver" ]; then if [ -f "./$BUILDSCRIPT" ]; then - sed -i "s/^pkgver=[^ ]*/pkgver=$newpkgver/" "./$BUILDSCRIPT" - sed -i "s/^pkgrel=[^ ]*/pkgrel=1/" "./$BUILDSCRIPT" + @SEDINPLACE@ "s/^pkgver=[^ ]*/pkgver=$newpkgver/" "./$BUILDSCRIPT" + @SEDINPLACE@ "s/^pkgrel=[^ ]*/pkgrel=1/" "./$BUILDSCRIPT" source "$BUILDSCRIPT" fi fi -- 1.6.2.4
_______________________________________________ pacman-dev mailing list pacman-dev@archlinux.org http://www.archlinux.org/mailman/listinfo/pacman-dev
Could the variable point to the full path (/usr/bin/sed)? It's quiet possible for a Mac user to also install GNU/sed and put it in their path before BSD sed to avoid compiling issues with other programs. On Sun, Apr 26, 2009 at 10:22 AM, Dan McGee <dpmcgee@gmail.com> wrote:
On Sun, Apr 26, 2009 at 6:13 AM, Allan McRae <allan@archlinux.org> wrote:
Do a sed replacement in-place is not very portable. On Mac OSX and BSDs, the syntax is "sed -i ''" where as with GNU sed the command is "sed -i''" or just "sed -i". This patch detects which command should be used during configure.
Credit to Kevin Barry who researched this issue and provided a patch to work around this using temporary backup files.
Signed-off-by: Allan McRae <allan@archlinux.org> Signed-off-by: Dan McGee <dan@archlinux.org>
Of course I didn't test it too extensively, but the concept looks just fine.
--- configure.ac | 5 +++++ scripts/Makefile.am | 1 + scripts/makepkg.sh.in | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac index 5dcbe79..a83d5e4 100644 --- a/configure.ac +++ b/configure.ac @@ -180,9 +180,11 @@ GCC_GNU89_INLINE_CC
# Host-dependant definitions SIZECMD="stat -c %s" +SEDINPLACE="sed -i" case "${host_os}" in *bsd*) SIZECMD="stat -f %z" + SEDINPLACE="sed -i ''" ;; cygwin*) host_os_cygwin=yes @@ -191,12 +193,14 @@ case "${host_os}" in darwin*) host_os_darwin=yes SIZECMD="/usr/bin/stat -f %z" + SEDINPLACE="sed -i ''" ;; esac
AM_CONDITIONAL([CYGWIN], test "x$host_os_cygwin" = "xyes") AM_CONDITIONAL([DARWIN], test "x$host_os_darwin" = "xyes") AC_SUBST(SIZECMD) +AC_SUBST(SEDINPLACE)
# Check for architecture, used in default makepkg.conf # (Note single space left after CARCHFLAGS) @@ -356,6 +360,7 @@ ${PACKAGE_NAME}: Architecture flags : ${CARCHFLAGS} Host Type : ${CHOST} Filesize command : ${SIZECMD} + In-place sed command : ${SEDINPLACE}
libalpm version : ${LIB_VERSION} libalpm version info : ${LIB_VERSION_INFO} diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 5a2b780..5d65653 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -41,6 +41,7 @@ edit = sed \ -e 's|@DBEXT[@]|$(DBEXT)|g' \ -e 's|@BUILDSCRIPT[@]|$(BUILDSCRIPT)|g' \ -e 's|@SIZECMD[@]|$(SIZECMD)|g' \ + -e 's|@SEDINPLACE[@]|$(SEDINPLACE)|g' \ -e 's|@configure_input[@]|Generated from $@.in; do not edit by hand.|g'
## All the scripts depend on Makefile so that they are rebuilt when the diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index c97eff2..ca25fbb 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -1171,8 +1171,8 @@ devel_update() { if [ -n "$newpkgver" ]; then if [ "$newpkgver" != "$pkgver" ]; then if [ -f "./$BUILDSCRIPT" ]; then - sed -i "s/^pkgver=[^ ]*/pkgver=$newpkgver/" "./$BUILDSCRIPT" - sed -i "s/^pkgrel=[^ ]*/pkgrel=1/" "./$BUILDSCRIPT" + @SEDINPLACE@ "s/^pkgver=[^ ]*/pkgver=$newpkgver/" "./$BUILDSCRIPT" + @SEDINPLACE@ "s/^pkgrel=[^ ]*/pkgrel=1/" "./$BUILDSCRIPT" source "$BUILDSCRIPT" fi fi -- 1.6.2.4
_______________________________________________ pacman-dev mailing list pacman-dev@archlinux.org http://www.archlinux.org/mailman/listinfo/pacman-dev
_______________________________________________ pacman-dev mailing list pacman-dev@archlinux.org http://www.archlinux.org/mailman/listinfo/pacman-dev
Kevin Barry wrote:
Could the variable point to the full path (/usr/bin/sed)? It's quiet possible for a Mac user to also install GNU/sed and put it in their path before BSD sed to avoid compiling issues with other programs.
Sure. I have added it to my list of minor cleanups that need to be done so it won't be forgotten. Allan
participants (3)
-
Allan McRae
-
Dan McGee
-
Kevin Barry