From 73c7a24c63723418943c5f67707a67667d9ee1ee Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Mon, 1 Apr 2019 23:19:13 +0200 Subject: build: Separate git operations from build operations. * gitsub.sh: New file, from gnulib. * .gitmodules: New file. * autogen.sh: Remove all git operations. Look at GNULIB_SRCDIR environment variable. Ignore the GNULIB_TOOL environment variable. * HACKING: Explain when to use gitsub.sh. --- .gitmodules | 3 + ChangeLog | 9 + HACKING | 17 +- autogen.sh | 830 ++++++++++++++++++++++++++++++------------------------------ gitsub.sh | 483 +++++++++++++++++++++++++++++++++++ 5 files changed, 924 insertions(+), 418 deletions(-) create mode 100644 .gitmodules create mode 100755 gitsub.sh diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..11d805c --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[subcheckout "gnulib"] + url = git://git.savannah.gnu.org/gnulib.git + path = gnulib diff --git a/ChangeLog b/ChangeLog index 94354c1..4c160e4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2019-04-01 Bruno Haible + + build: Separate git operations from build operations. + * gitsub.sh: New file, from gnulib. + * .gitmodules: New file. + * autogen.sh: Remove all git operations. Look at GNULIB_SRCDIR + environment variable. Ignore the GNULIB_TOOL environment variable. + * HACKING: Explain when to use gitsub.sh. + 2019-03-13 Bruno Haible build: Update Windows support. diff --git a/HACKING b/HACKING index 0139dae..1db20b6 100644 --- a/HACKING +++ b/HACKING @@ -48,7 +48,22 @@ You will need reasonably recent versions of the build tools: And, of course, the packages listed in the DEPENDENCIES file. -Then you can run the 'autogen.sh' script + +Building off the Git repository +=============================== + +Access to the Git repository is described at +https://savannah.gnu.org/git/?group=libunistring . + +After fetching the sources from the Git repository, peek at the comments in +autogen.sh, then run + ./gitsub.sh pull + ./autogen.sh +Then you can proceed with "./configure" as usual. + +Each time you want to update the source, do not only "git pull". Instead do + git pull && ./gitsub.sh pull + ./autogen.sh Sources diff --git a/autogen.sh b/autogen.sh index 4feebb7..20c3655 100755 --- a/autogen.sh +++ b/autogen.sh @@ -5,10 +5,9 @@ # with new versions of autoconf or automake. # # This script requires autoconf-2.63..2.69 and automake-1.11..1.16 in the PATH. -# It also requires either -# - the GNULIB_TOOL environment variable pointing to the gnulib-tool script -# in a gnulib checkout, or -# - the git program in the PATH and an internet connection. +# If not used from a released tarball, it also requires either +# - the GNULIB_SRCDIR environment variable pointing to a gnulib checkout, or +# - a preceding invocation of './gitsub.sh pull'. # It also requires # - the gperf program. @@ -28,12 +27,6 @@ # along with this program. If not, see . # Usage: ./autogen.sh [--skip-gnulib] -# -# Usage from a git checkout: ./autogen.sh -# This uses an up-to-date gnulib checkout. -# -# Usage from a released tarball: ./autogen.sh --skip-gnulib -# This does not use a gnulib checkout. skip_gnulib=false while :; do @@ -46,6 +39,7 @@ done TEXINFO_VERSION=6.5 if test $skip_gnulib = false; then + # texinfo.tex # The most recent snapshot of it is available in the gnulib repository. # But this is a snapshot, with all possible dangers. @@ -57,414 +51,416 @@ if test $skip_gnulib = false; then && mv build-aux/texinfo.tex.tmp build-aux/texinfo.tex; \ } || rm -f build-aux/texinfo.tex.tmp fi - if test -z "$GNULIB_TOOL"; then - # Check out gnulib in a subdirectory 'gnulib'. - if test -d gnulib; then - (cd gnulib && git pull) - else - git clone git://git.savannah.gnu.org/gnulib.git - fi - # Now it should contain a gnulib-tool. - if test -f gnulib/gnulib-tool; then - GNULIB_TOOL=`pwd`/gnulib/gnulib-tool - else - echo "** warning: gnulib-tool not found" 1>&2 - fi + + if test -n "$GNULIB_SRCDIR"; then + test -d "$GNULIB_SRCDIR" || { + echo "*** GNULIB_SRCDIR is set but does not point to an existing directory." 1>&2 + exit 1 + } + else + GNULIB_SRCDIR=`pwd`/gnulib + test -d "$GNULIB_SRCDIR" || { + echo "*** Subdirectory 'gnulib' does not yet exist. Use './gitsub.sh pull' to create it, or set the environment variable GNULIB_SRCDIR." 1>&2 + exit 1 + } fi - # Skip the gnulib-tool step if gnulib-tool was not found. - if test -n "$GNULIB_TOOL"; then - GNULIB_MODULES=' - unitypes - unistr/base - unistr/u8-check - unistr/u8-chr - unistr/u8-cmp - unistr/u8-cmp2 - unistr/u8-cpy - unistr/u8-cpy-alloc - unistr/u8-endswith - unistr/u8-mblen - unistr/u8-mbsnlen - unistr/u8-mbtouc - unistr/u8-mbtoucr - unistr/u8-mbtouc-unsafe - unistr/u8-move - unistr/u8-next - unistr/u8-prev - unistr/u8-set - unistr/u8-startswith - unistr/u8-stpcpy - unistr/u8-stpncpy - unistr/u8-strcat - unistr/u8-strchr - unistr/u8-strcmp - unistr/u8-strcoll - unistr/u8-strcpy - unistr/u8-strcspn - unistr/u8-strdup - unistr/u8-strlen - unistr/u8-strmblen - unistr/u8-strmbtouc - unistr/u8-strncat - unistr/u8-strncmp - unistr/u8-strncpy - unistr/u8-strnlen - unistr/u8-strpbrk - unistr/u8-strrchr - unistr/u8-strspn - unistr/u8-strstr - unistr/u8-strtok - unistr/u8-to-u16 - unistr/u8-to-u32 - unistr/u8-uctomb - unistr/u16-check - unistr/u16-chr - unistr/u16-cmp - unistr/u16-cmp2 - unistr/u16-cpy - unistr/u16-cpy-alloc - unistr/u16-endswith - unistr/u16-mblen - unistr/u16-mbsnlen - unistr/u16-mbtouc - unistr/u16-mbtoucr - unistr/u16-mbtouc-unsafe - unistr/u16-move - unistr/u16-next - unistr/u16-prev - unistr/u16-set - unistr/u16-startswith - unistr/u16-stpcpy - unistr/u16-stpncpy - unistr/u16-strcat - unistr/u16-strchr - unistr/u16-strcmp - unistr/u16-strcoll - unistr/u16-strcpy - unistr/u16-strcspn - unistr/u16-strdup - unistr/u16-strlen - unistr/u16-strmblen - unistr/u16-strmbtouc - unistr/u16-strncat - unistr/u16-strncmp - unistr/u16-strncpy - unistr/u16-strnlen - unistr/u16-strpbrk - unistr/u16-strrchr - unistr/u16-strspn - unistr/u16-strstr - unistr/u16-strtok - unistr/u16-to-u32 - unistr/u16-to-u8 - unistr/u16-uctomb - unistr/u32-check - unistr/u32-chr - unistr/u32-cmp - unistr/u32-cmp2 - unistr/u32-cpy - unistr/u32-cpy-alloc - unistr/u32-endswith - unistr/u32-mblen - unistr/u32-mbsnlen - unistr/u32-mbtouc - unistr/u32-mbtoucr - unistr/u32-mbtouc-unsafe - unistr/u32-move - unistr/u32-next - unistr/u32-prev - unistr/u32-set - unistr/u32-startswith - unistr/u32-stpcpy - unistr/u32-stpncpy - unistr/u32-strcat - unistr/u32-strchr - unistr/u32-strcmp - unistr/u32-strcoll - unistr/u32-strcpy - unistr/u32-strcspn - unistr/u32-strdup - unistr/u32-strlen - unistr/u32-strmblen - unistr/u32-strmbtouc - unistr/u32-strncat - unistr/u32-strncmp - unistr/u32-strncpy - unistr/u32-strnlen - unistr/u32-strpbrk - unistr/u32-strrchr - unistr/u32-strspn - unistr/u32-strstr - unistr/u32-strtok - unistr/u32-to-u16 - unistr/u32-to-u8 - unistr/u32-uctomb - uniconv/base - uniconv/u8-conv-from-enc - uniconv/u8-conv-to-enc - uniconv/u8-strconv-from-enc - uniconv/u8-strconv-from-locale - uniconv/u8-strconv-to-enc - uniconv/u8-strconv-to-locale - uniconv/u16-conv-from-enc - uniconv/u16-conv-to-enc - uniconv/u16-strconv-from-enc - uniconv/u16-strconv-from-locale - uniconv/u16-strconv-to-enc - uniconv/u16-strconv-to-locale - uniconv/u32-conv-from-enc - uniconv/u32-conv-to-enc - uniconv/u32-strconv-from-enc - uniconv/u32-strconv-from-locale - uniconv/u32-strconv-to-enc - uniconv/u32-strconv-to-locale - unistdio/base - unistdio/u8-asnprintf - unistdio/u8-asprintf - unistdio/u8-snprintf - unistdio/u8-sprintf - unistdio/u8-u8-asnprintf - unistdio/u8-u8-asprintf - unistdio/u8-u8-snprintf - unistdio/u8-u8-sprintf - unistdio/u8-u8-vasnprintf - unistdio/u8-u8-vasprintf - unistdio/u8-u8-vsnprintf - unistdio/u8-u8-vsprintf - unistdio/u8-vasnprintf - unistdio/u8-vasprintf - unistdio/u8-vsnprintf - unistdio/u8-vsprintf - unistdio/u16-asnprintf - unistdio/u16-asprintf - unistdio/u16-snprintf - unistdio/u16-sprintf - unistdio/u16-u16-asnprintf - unistdio/u16-u16-asprintf - unistdio/u16-u16-snprintf - unistdio/u16-u16-sprintf - unistdio/u16-u16-vasnprintf - unistdio/u16-u16-vasprintf - unistdio/u16-u16-vsnprintf - unistdio/u16-u16-vsprintf - unistdio/u16-vasnprintf - unistdio/u16-vasprintf - unistdio/u16-vsnprintf - unistdio/u16-vsprintf - unistdio/u32-asnprintf - unistdio/u32-asprintf - unistdio/u32-snprintf - unistdio/u32-sprintf - unistdio/u32-u32-asnprintf - unistdio/u32-u32-asprintf - unistdio/u32-u32-snprintf - unistdio/u32-u32-sprintf - unistdio/u32-u32-vasnprintf - unistdio/u32-u32-vasprintf - unistdio/u32-u32-vsnprintf - unistdio/u32-u32-vsprintf - unistdio/u32-vasnprintf - unistdio/u32-vasprintf - unistdio/u32-vsnprintf - unistdio/u32-vsprintf - unistdio/ulc-asnprintf - unistdio/ulc-asprintf - unistdio/ulc-fprintf - unistdio/ulc-snprintf - unistdio/ulc-sprintf - unistdio/ulc-vasnprintf - unistdio/ulc-vasprintf - unistdio/ulc-vfprintf - unistdio/ulc-vsnprintf - unistdio/ulc-vsprintf - uniname/base - uniname/uniname - unictype/base - unictype/bidiclass-all - unictype/block-all - unictype/category-all - unictype/combining-class-all - unictype/ctype-alnum - unictype/ctype-alpha - unictype/ctype-blank - unictype/ctype-cntrl - unictype/ctype-digit - unictype/ctype-graph - unictype/ctype-lower - unictype/ctype-print - unictype/ctype-punct - unictype/ctype-space - unictype/ctype-upper - unictype/ctype-xdigit - unictype/decimal-digit - unictype/digit - unictype/joininggroup-all - unictype/joiningtype-all - unictype/mirror - unictype/numeric - unictype/property-all - unictype/scripts-all - unictype/syntax-c-ident - unictype/syntax-c-whitespace - unictype/syntax-java-ident - unictype/syntax-java-whitespace - uniwidth/base - uniwidth/u8-strwidth - uniwidth/u8-width - uniwidth/u16-strwidth - uniwidth/u16-width - uniwidth/u32-strwidth - uniwidth/u32-width - uniwidth/width - unigbrk/base - unigbrk/u8-grapheme-breaks - unigbrk/u8-grapheme-next - unigbrk/u8-grapheme-prev - unigbrk/u16-grapheme-breaks - unigbrk/u16-grapheme-next - unigbrk/u16-grapheme-prev - unigbrk/u32-grapheme-breaks - unigbrk/u32-grapheme-next - unigbrk/u32-grapheme-prev - unigbrk/uc-gbrk-prop - unigbrk/uc-is-grapheme-break - unigbrk/ulc-grapheme-breaks - unigbrk/uc-grapheme-breaks - uniwbrk/base - uniwbrk/u8-wordbreaks - uniwbrk/u16-wordbreaks - uniwbrk/u32-wordbreaks - uniwbrk/ulc-wordbreaks - uniwbrk/wordbreak-property - unilbrk/base - unilbrk/u8-possible-linebreaks - unilbrk/u8-width-linebreaks - unilbrk/u16-possible-linebreaks - unilbrk/u16-width-linebreaks - unilbrk/u32-possible-linebreaks - unilbrk/u32-width-linebreaks - unilbrk/ulc-possible-linebreaks - unilbrk/ulc-width-linebreaks - uninorm/base - uninorm/canonical-decomposition - uninorm/composition - uninorm/decomposition - uninorm/filter - uninorm/nfc - uninorm/nfd - uninorm/nfkc - uninorm/nfkd - uninorm/u8-normalize - uninorm/u8-normcmp - uninorm/u8-normcoll - uninorm/u8-normxfrm - uninorm/u16-normalize - uninorm/u16-normcmp - uninorm/u16-normcoll - uninorm/u16-normxfrm - uninorm/u32-normalize - uninorm/u32-normcmp - uninorm/u32-normcoll - uninorm/u32-normxfrm - unicase/base - unicase/empty-prefix-context - unicase/empty-suffix-context - unicase/locale-language - unicase/tolower - unicase/totitle - unicase/toupper - unicase/u8-casecmp - unicase/u8-casecoll - unicase/u8-casefold - unicase/u8-casexfrm - unicase/u8-ct-casefold - unicase/u8-ct-tolower - unicase/u8-ct-totitle - unicase/u8-ct-toupper - unicase/u8-is-cased - unicase/u8-is-casefolded - unicase/u8-is-lowercase - unicase/u8-is-titlecase - unicase/u8-is-uppercase - unicase/u8-prefix-context - unicase/u8-suffix-context - unicase/u8-tolower - unicase/u8-totitle - unicase/u8-toupper - unicase/u16-casecmp - unicase/u16-casecoll - unicase/u16-casefold - unicase/u16-casexfrm - unicase/u16-ct-casefold - unicase/u16-ct-tolower - unicase/u16-ct-totitle - unicase/u16-ct-toupper - unicase/u16-is-cased - unicase/u16-is-casefolded - unicase/u16-is-lowercase - unicase/u16-is-titlecase - unicase/u16-is-uppercase - unicase/u16-prefix-context - unicase/u16-suffix-context - unicase/u16-tolower - unicase/u16-totitle - unicase/u16-toupper - unicase/u32-casecmp - unicase/u32-casecoll - unicase/u32-casefold - unicase/u32-casexfrm - unicase/u32-ct-casefold - unicase/u32-ct-tolower - unicase/u32-ct-totitle - unicase/u32-ct-toupper - unicase/u32-is-cased - unicase/u32-is-casefolded - unicase/u32-is-lowercase - unicase/u32-is-titlecase - unicase/u32-is-uppercase - unicase/u32-prefix-context - unicase/u32-suffix-context - unicase/u32-tolower - unicase/u32-totitle - unicase/u32-toupper - unicase/ulc-casecmp - unicase/ulc-casecoll - unicase/ulc-casexfrm - relocatable-lib-lgpl - ' - $GNULIB_TOOL --lib=libunistring --source-base=lib --m4-base=gnulib-m4 --tests-base=tests \ - --with-tests --lgpl=3orGPLv2 --makefile-name=Makefile.gnulib --libtool --local-dir=gnulib-local \ - --import $GNULIB_MODULES - # Change lib/unistr.h to be usable standalone. - sed -e 's/if GNULIB_[A-Za-z0-9_]* || .*/if 1/g' \ - -e 's/if GNULIB_[A-Za-z0-9_]*/if 1/g' \ - -e 's/HAVE_INLINE/UNISTRING_HAVE_INLINE/g' \ - < lib/unistr.in.h \ - > lib/unistr.in.h.tmp \ - && mv lib/unistr.in.h.tmp lib/unistr.in.h - # Change lib/unictype.h, lib/uninorm.h, lib/unicase.h for shared libraries on Woe32 systems. - sed -e 's/extern const uc_general_category_t UC_/extern LIBUNISTRING_DLL_VARIABLE const uc_general_category_t UC_/' \ - -e 's/extern const uc_property_t UC_/extern LIBUNISTRING_DLL_VARIABLE const uc_property_t UC_/' \ - < lib/unictype.in.h \ - > lib/unictype.in.h.tmp \ - && mv lib/unictype.in.h.tmp lib/unictype.in.h - sed -e 's/extern const struct unicode_normalization_form /extern LIBUNISTRING_DLL_VARIABLE const struct unicode_normalization_form /' \ - < lib/uninorm.in.h \ - > lib/uninorm.in.h.tmp \ - && mv lib/uninorm.in.h.tmp lib/uninorm.in.h - sed -e 's/extern const casing_/extern LIBUNISTRING_DLL_VARIABLE const casing_/' \ - < lib/unicase.in.h \ - > lib/unicase.in.h.tmp \ - && mv lib/unicase.in.h.tmp lib/unicase.in.h - $GNULIB_TOOL --copy-file build-aux/config.guess; chmod a+x build-aux/config.guess - $GNULIB_TOOL --copy-file build-aux/config.sub; chmod a+x build-aux/config.sub - $GNULIB_TOOL --copy-file build-aux/declared.sh lib/declared.sh; chmod a+x lib/declared.sh - $GNULIB_TOOL --copy-file build-aux/run-test; chmod a+x build-aux/run-test - $GNULIB_TOOL --copy-file build-aux/test-driver.diff - # If we got no texinfo.tex so far, take the snapshot from gnulib. - if test ! -f build-aux/texinfo.tex; then - $GNULIB_TOOL --copy-file build-aux/texinfo.tex - fi + # Now it should contain a gnulib-tool. + GNULIB_TOOL="$GNULIB_SRCDIR/gnulib-tool" + test -f "$GNULIB_TOOL" || { + echo "*** gnulib-tool not found." 1>&2 + exit 1 + } + GNULIB_MODULES=' + unitypes + unistr/base + unistr/u8-check + unistr/u8-chr + unistr/u8-cmp + unistr/u8-cmp2 + unistr/u8-cpy + unistr/u8-cpy-alloc + unistr/u8-endswith + unistr/u8-mblen + unistr/u8-mbsnlen + unistr/u8-mbtouc + unistr/u8-mbtoucr + unistr/u8-mbtouc-unsafe + unistr/u8-move + unistr/u8-next + unistr/u8-prev + unistr/u8-set + unistr/u8-startswith + unistr/u8-stpcpy + unistr/u8-stpncpy + unistr/u8-strcat + unistr/u8-strchr + unistr/u8-strcmp + unistr/u8-strcoll + unistr/u8-strcpy + unistr/u8-strcspn + unistr/u8-strdup + unistr/u8-strlen + unistr/u8-strmblen + unistr/u8-strmbtouc + unistr/u8-strncat + unistr/u8-strncmp + unistr/u8-strncpy + unistr/u8-strnlen + unistr/u8-strpbrk + unistr/u8-strrchr + unistr/u8-strspn + unistr/u8-strstr + unistr/u8-strtok + unistr/u8-to-u16 + unistr/u8-to-u32 + unistr/u8-uctomb + unistr/u16-check + unistr/u16-chr + unistr/u16-cmp + unistr/u16-cmp2 + unistr/u16-cpy + unistr/u16-cpy-alloc + unistr/u16-endswith + unistr/u16-mblen + unistr/u16-mbsnlen + unistr/u16-mbtouc + unistr/u16-mbtoucr + unistr/u16-mbtouc-unsafe + unistr/u16-move + unistr/u16-next + unistr/u16-prev + unistr/u16-set + unistr/u16-startswith + unistr/u16-stpcpy + unistr/u16-stpncpy + unistr/u16-strcat + unistr/u16-strchr + unistr/u16-strcmp + unistr/u16-strcoll + unistr/u16-strcpy + unistr/u16-strcspn + unistr/u16-strdup + unistr/u16-strlen + unistr/u16-strmblen + unistr/u16-strmbtouc + unistr/u16-strncat + unistr/u16-strncmp + unistr/u16-strncpy + unistr/u16-strnlen + unistr/u16-strpbrk + unistr/u16-strrchr + unistr/u16-strspn + unistr/u16-strstr + unistr/u16-strtok + unistr/u16-to-u32 + unistr/u16-to-u8 + unistr/u16-uctomb + unistr/u32-check + unistr/u32-chr + unistr/u32-cmp + unistr/u32-cmp2 + unistr/u32-cpy + unistr/u32-cpy-alloc + unistr/u32-endswith + unistr/u32-mblen + unistr/u32-mbsnlen + unistr/u32-mbtouc + unistr/u32-mbtoucr + unistr/u32-mbtouc-unsafe + unistr/u32-move + unistr/u32-next + unistr/u32-prev + unistr/u32-set + unistr/u32-startswith + unistr/u32-stpcpy + unistr/u32-stpncpy + unistr/u32-strcat + unistr/u32-strchr + unistr/u32-strcmp + unistr/u32-strcoll + unistr/u32-strcpy + unistr/u32-strcspn + unistr/u32-strdup + unistr/u32-strlen + unistr/u32-strmblen + unistr/u32-strmbtouc + unistr/u32-strncat + unistr/u32-strncmp + unistr/u32-strncpy + unistr/u32-strnlen + unistr/u32-strpbrk + unistr/u32-strrchr + unistr/u32-strspn + unistr/u32-strstr + unistr/u32-strtok + unistr/u32-to-u16 + unistr/u32-to-u8 + unistr/u32-uctomb + uniconv/base + uniconv/u8-conv-from-enc + uniconv/u8-conv-to-enc + uniconv/u8-strconv-from-enc + uniconv/u8-strconv-from-locale + uniconv/u8-strconv-to-enc + uniconv/u8-strconv-to-locale + uniconv/u16-conv-from-enc + uniconv/u16-conv-to-enc + uniconv/u16-strconv-from-enc + uniconv/u16-strconv-from-locale + uniconv/u16-strconv-to-enc + uniconv/u16-strconv-to-locale + uniconv/u32-conv-from-enc + uniconv/u32-conv-to-enc + uniconv/u32-strconv-from-enc + uniconv/u32-strconv-from-locale + uniconv/u32-strconv-to-enc + uniconv/u32-strconv-to-locale + unistdio/base + unistdio/u8-asnprintf + unistdio/u8-asprintf + unistdio/u8-snprintf + unistdio/u8-sprintf + unistdio/u8-u8-asnprintf + unistdio/u8-u8-asprintf + unistdio/u8-u8-snprintf + unistdio/u8-u8-sprintf + unistdio/u8-u8-vasnprintf + unistdio/u8-u8-vasprintf + unistdio/u8-u8-vsnprintf + unistdio/u8-u8-vsprintf + unistdio/u8-vasnprintf + unistdio/u8-vasprintf + unistdio/u8-vsnprintf + unistdio/u8-vsprintf + unistdio/u16-asnprintf + unistdio/u16-asprintf + unistdio/u16-snprintf + unistdio/u16-sprintf + unistdio/u16-u16-asnprintf + unistdio/u16-u16-asprintf + unistdio/u16-u16-snprintf + unistdio/u16-u16-sprintf + unistdio/u16-u16-vasnprintf + unistdio/u16-u16-vasprintf + unistdio/u16-u16-vsnprintf + unistdio/u16-u16-vsprintf + unistdio/u16-vasnprintf + unistdio/u16-vasprintf + unistdio/u16-vsnprintf + unistdio/u16-vsprintf + unistdio/u32-asnprintf + unistdio/u32-asprintf + unistdio/u32-snprintf + unistdio/u32-sprintf + unistdio/u32-u32-asnprintf + unistdio/u32-u32-asprintf + unistdio/u32-u32-snprintf + unistdio/u32-u32-sprintf + unistdio/u32-u32-vasnprintf + unistdio/u32-u32-vasprintf + unistdio/u32-u32-vsnprintf + unistdio/u32-u32-vsprintf + unistdio/u32-vasnprintf + unistdio/u32-vasprintf + unistdio/u32-vsnprintf + unistdio/u32-vsprintf + unistdio/ulc-asnprintf + unistdio/ulc-asprintf + unistdio/ulc-fprintf + unistdio/ulc-snprintf + unistdio/ulc-sprintf + unistdio/ulc-vasnprintf + unistdio/ulc-vasprintf + unistdio/ulc-vfprintf + unistdio/ulc-vsnprintf + unistdio/ulc-vsprintf + uniname/base + uniname/uniname + unictype/base + unictype/bidiclass-all + unictype/block-all + unictype/category-all + unictype/combining-class-all + unictype/ctype-alnum + unictype/ctype-alpha + unictype/ctype-blank + unictype/ctype-cntrl + unictype/ctype-digit + unictype/ctype-graph + unictype/ctype-lower + unictype/ctype-print + unictype/ctype-punct + unictype/ctype-space + unictype/ctype-upper + unictype/ctype-xdigit + unictype/decimal-digit + unictype/digit + unictype/joininggroup-all + unictype/joiningtype-all + unictype/mirror + unictype/numeric + unictype/property-all + unictype/scripts-all + unictype/syntax-c-ident + unictype/syntax-c-whitespace + unictype/syntax-java-ident + unictype/syntax-java-whitespace + uniwidth/base + uniwidth/u8-strwidth + uniwidth/u8-width + uniwidth/u16-strwidth + uniwidth/u16-width + uniwidth/u32-strwidth + uniwidth/u32-width + uniwidth/width + unigbrk/base + unigbrk/u8-grapheme-breaks + unigbrk/u8-grapheme-next + unigbrk/u8-grapheme-prev + unigbrk/u16-grapheme-breaks + unigbrk/u16-grapheme-next + unigbrk/u16-grapheme-prev + unigbrk/u32-grapheme-breaks + unigbrk/u32-grapheme-next + unigbrk/u32-grapheme-prev + unigbrk/uc-gbrk-prop + unigbrk/uc-is-grapheme-break + unigbrk/ulc-grapheme-breaks + unigbrk/uc-grapheme-breaks + uniwbrk/base + uniwbrk/u8-wordbreaks + uniwbrk/u16-wordbreaks + uniwbrk/u32-wordbreaks + uniwbrk/ulc-wordbreaks + uniwbrk/wordbreak-property + unilbrk/base + unilbrk/u8-possible-linebreaks + unilbrk/u8-width-linebreaks + unilbrk/u16-possible-linebreaks + unilbrk/u16-width-linebreaks + unilbrk/u32-possible-linebreaks + unilbrk/u32-width-linebreaks + unilbrk/ulc-possible-linebreaks + unilbrk/ulc-width-linebreaks + uninorm/base + uninorm/canonical-decomposition + uninorm/composition + uninorm/decomposition + uninorm/filter + uninorm/nfc + uninorm/nfd + uninorm/nfkc + uninorm/nfkd + uninorm/u8-normalize + uninorm/u8-normcmp + uninorm/u8-normcoll + uninorm/u8-normxfrm + uninorm/u16-normalize + uninorm/u16-normcmp + uninorm/u16-normcoll + uninorm/u16-normxfrm + uninorm/u32-normalize + uninorm/u32-normcmp + uninorm/u32-normcoll + uninorm/u32-normxfrm + unicase/base + unicase/empty-prefix-context + unicase/empty-suffix-context + unicase/locale-language + unicase/tolower + unicase/totitle + unicase/toupper + unicase/u8-casecmp + unicase/u8-casecoll + unicase/u8-casefold + unicase/u8-casexfrm + unicase/u8-ct-casefold + unicase/u8-ct-tolower + unicase/u8-ct-totitle + unicase/u8-ct-toupper + unicase/u8-is-cased + unicase/u8-is-casefolded + unicase/u8-is-lowercase + unicase/u8-is-titlecase + unicase/u8-is-uppercase + unicase/u8-prefix-context + unicase/u8-suffix-context + unicase/u8-tolower + unicase/u8-totitle + unicase/u8-toupper + unicase/u16-casecmp + unicase/u16-casecoll + unicase/u16-casefold + unicase/u16-casexfrm + unicase/u16-ct-casefold + unicase/u16-ct-tolower + unicase/u16-ct-totitle + unicase/u16-ct-toupper + unicase/u16-is-cased + unicase/u16-is-casefolded + unicase/u16-is-lowercase + unicase/u16-is-titlecase + unicase/u16-is-uppercase + unicase/u16-prefix-context + unicase/u16-suffix-context + unicase/u16-tolower + unicase/u16-totitle + unicase/u16-toupper + unicase/u32-casecmp + unicase/u32-casecoll + unicase/u32-casefold + unicase/u32-casexfrm + unicase/u32-ct-casefold + unicase/u32-ct-tolower + unicase/u32-ct-totitle + unicase/u32-ct-toupper + unicase/u32-is-cased + unicase/u32-is-casefolded + unicase/u32-is-lowercase + unicase/u32-is-titlecase + unicase/u32-is-uppercase + unicase/u32-prefix-context + unicase/u32-suffix-context + unicase/u32-tolower + unicase/u32-totitle + unicase/u32-toupper + unicase/ulc-casecmp + unicase/ulc-casecoll + unicase/ulc-casexfrm + relocatable-lib-lgpl + ' + $GNULIB_TOOL --lib=libunistring --source-base=lib --m4-base=gnulib-m4 --tests-base=tests \ + --with-tests --lgpl=3orGPLv2 --makefile-name=Makefile.gnulib --libtool --local-dir=gnulib-local \ + --import $GNULIB_MODULES + # Change lib/unistr.h to be usable standalone. + sed -e 's/if GNULIB_[A-Za-z0-9_]* || .*/if 1/g' \ + -e 's/if GNULIB_[A-Za-z0-9_]*/if 1/g' \ + -e 's/HAVE_INLINE/UNISTRING_HAVE_INLINE/g' \ + < lib/unistr.in.h \ + > lib/unistr.in.h.tmp \ + && mv lib/unistr.in.h.tmp lib/unistr.in.h + # Change lib/unictype.h, lib/uninorm.h, lib/unicase.h for shared libraries on Woe32 systems. + sed -e 's/extern const uc_general_category_t UC_/extern LIBUNISTRING_DLL_VARIABLE const uc_general_category_t UC_/' \ + -e 's/extern const uc_property_t UC_/extern LIBUNISTRING_DLL_VARIABLE const uc_property_t UC_/' \ + < lib/unictype.in.h \ + > lib/unictype.in.h.tmp \ + && mv lib/unictype.in.h.tmp lib/unictype.in.h + sed -e 's/extern const struct unicode_normalization_form /extern LIBUNISTRING_DLL_VARIABLE const struct unicode_normalization_form /' \ + < lib/uninorm.in.h \ + > lib/uninorm.in.h.tmp \ + && mv lib/uninorm.in.h.tmp lib/uninorm.in.h + sed -e 's/extern const casing_/extern LIBUNISTRING_DLL_VARIABLE const casing_/' \ + < lib/unicase.in.h \ + > lib/unicase.in.h.tmp \ + && mv lib/unicase.in.h.tmp lib/unicase.in.h + $GNULIB_TOOL --copy-file build-aux/config.guess; chmod a+x build-aux/config.guess + $GNULIB_TOOL --copy-file build-aux/config.sub; chmod a+x build-aux/config.sub + $GNULIB_TOOL --copy-file build-aux/declared.sh lib/declared.sh; chmod a+x lib/declared.sh + $GNULIB_TOOL --copy-file build-aux/run-test; chmod a+x build-aux/run-test + $GNULIB_TOOL --copy-file build-aux/test-driver.diff + # If we got no texinfo.tex so far, take the snapshot from gnulib. + if test ! -f build-aux/texinfo.tex; then + $GNULIB_TOOL --copy-file build-aux/texinfo.tex fi fi diff --git a/gitsub.sh b/gitsub.sh new file mode 100755 index 0000000..9665198 --- /dev/null +++ b/gitsub.sh @@ -0,0 +1,483 @@ +#! /bin/sh +# +# Copyright (C) 2019 Free Software Foundation, Inc. +# Written by Bruno Haible , 2019. +# +# 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 . + +# Program that manages the subdirectories of a git checkout of a package +# that come from other packages (called "dependency packages"). +# +# This program is similar in spirit to 'git submodule', with three +# essential differences: +# +# 1) Its options are easy to remember, and do not require knowledge of +# 'git submodule'. +# +# 2) The developer may choose to work on a different checkout for each +# dependency package. This is important when the developer is +# preparing simultaneous changes to the package and the dependency +# package, or is using the dependency package in several packages. +# +# The developer indicates this different checkout by setting the +# environment variable _SRCDIR (e.g. GNULIB_SRCDIR) to point to it. +# +# 3) The package maintainer may choose to use or not use git submodules. +# +# The advantages of management through a git submodule are: +# - Changes to the dependency package cannot suddenly break your package. +# In other words, when there is an incompatible change that will cause +# a breakage, you can fix things at your pace; you are not forced to +# cope with such breakages in an emergency. +# - When you need to make a change as a response to a change in the +# dependency package, your co-developers cannot accidentally mix things +# up (for example, use a combination of your newest change with an +# older version of the dependency package). +# +# The advantages of management without a git submodule (just as a plain +# subdirectory, let's call it a "subcheckout") are: +# - The simplicity: you are conceptually always using the newest revision +# of the dependency package. +# - You don't have to remember to periodially upgrade the dependency. +# Upgrading the dependency is an implicit operation. + +# This program is meant to be copied to the top-level directory of the package, +# together with a configuration file. The configuration is supposed to be +# named '.gitmodules' and to define: +# * The git submodules, as described in "man 5 gitmodules" or +# . For example: +# +# [submodule "gnulib"] +# url = git://git.savannah.gnu.org/gnulib.git +# path = gnulib +# +# You don't add this piece of configuration to .gitmodules manually. Instead, +# you would invoke +# $ git submodule add --name "gnulib" -- git://git.savannah.gnu.org/gnulib.git gnulib +# +# * The subdirectories that are not git submodules, in a similar syntax. For +# example: +# +# [subcheckout "gnulib"] +# url = git://git.savannah.gnu.org/gnulib.git +# path = gnulib +# +# Here the URL is the one used for anonymous checkouts of the dependency +# package. If the developer needs a checkout with write access, they can +# either set the GNULIB_SRCDIR environment variable to point to that checkout +# or modify the gnulib/.git/config file to enter a different URL. + +scriptname="$0" +scriptversion='2019-04-01' +nl=' +' +IFS=" "" $nl" + +# func_usage +# outputs to stdout the --help usage message. +func_usage () +{ + echo "\ +Usage: gitsub.sh pull [SUBDIR] + gitsub.sh upgrade [SUBDIR] + gitsub.sh checkout SUBDIR REVISION + +Operations: + +gitsub.sh pull [SUBDIR] + You should perform this operation after 'git clone ...' and after + every 'git pull'. + It brings your checkout in sync with what the other developers of + your package have committed and pushed. + If an environment variable _SRCDIR is set, with a non-empty + value, nothing is done for this SUBDIR. + If no SUBDIR is specified, the operation applies to all dependencies. + +gitsub.sh upgrade [SUBDIR] + You should perform this operation periodically, to ensure currency + of the dependency package revisions that you use. + This operation pulls and checks out the changes that the developers + of the dependency package have committed and pushed. + If an environment variable _SRCDIR is set, with a non-empty + value, nothing is done for this SUBDIR. + If no SUBDIR is specified, the operation applies to all dependencies. + +gitsub.sh checkout SUBDIR REVISION + Checks out a specific revision for a dependency package. + If an environment variable _SRCDIR is set, with a non-empty + value, this operation fails. + +This script requires the git program in the PATH and an internet connection. +" +} + +# func_version +# outputs to stdout the --version message. +func_version () +{ + year=`echo "$scriptversion" | sed -e 's/^\(....\)-.*/\1/'` + echo "\ +gitsub.sh (GNU gnulib) $scriptversion +Copyright (C) 2019-$year Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +" + printf "Written by %s.\n" "Bruno Haible" +} + +# func_fatal_error message +# outputs to stderr a fatal error message, and terminates the program. +# Input: +# - scriptname name of this program +func_fatal_error () +{ + echo "$scriptname: *** $1" 1>&2 + echo "$scriptname: *** Stop." 1>&2 + exit 1 +} + +# func_warning message +# Outputs to stderr a warning message, +func_warning () +{ + echo "gitsub.sh: warning: $1" 1>&2 +} + +# func_note message +# Outputs to stdout a note message, +func_note () +{ + echo "gitsub.sh: note: $1" +} + +# Unset CDPATH. Otherwise, output from 'cd dir' can surprise callers. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Command-line option processing. +mode= +while test $# -gt 0; do + case "$1" in + --help | --hel | --he | --h ) + func_usage + exit $? ;; + --version | --versio | --versi | --vers | --ver | --ve | --v ) + func_version + exit $? ;; + -- ) + # Stop option processing + shift + break ;; + -* ) + echo "gitsub.sh: unknown option $1" 1>&2 + echo "Try 'gitsub.sh --help' for more information." 1>&2 + exit 1 ;; + * ) + break ;; + esac +done +if test $# = 0; then + echo "gitsub.sh: missing operation argument" 1>&2 + echo "Try 'gitsub.sh --help' for more information." 1>&2 + exit 1 +fi +case "$1" in + pull | upgrade | checkout ) + mode="$1" + shift ;; + *) + echo "gitsub.sh: unknown operation '$1'" 1>&2 + echo "Try 'gitsub.sh --help' for more information." 1>&2 + exit 1 ;; +esac +if test $# = 2 && test $mode != checkout || test $# -gt 2; then + echo "gitsub.sh: too many arguments in '$mode' mode" 1>&2 + echo "Try 'gitsub.sh --help' for more information." 1>&2 + exit 1 +fi +if test $# = 0 && test $mode = checkout; then + echo "gitsub.sh: too few arguments in '$mode' mode" 1>&2 + echo "Try 'gitsub.sh --help' for more information." 1>&2 + exit 1 +fi + +# Read the configuration. +# Output: +# - subcheckout_names space-separated list of subcheckout names +# - submodule_names space-separated list of submodule names +if test -f .gitmodules; then + subcheckout_names=`git config --file .gitmodules --get-regexp --name-only 'subcheckout\..*\.url' | sed -e 's/^subcheckout\.//' -e 's/\.url$//' | tr -d '\r' | tr '\n' ' '` + submodule_names=`git config --file .gitmodules --get-regexp --name-only 'submodule\..*\.url' | sed -e 's/^submodule\.//' -e 's/\.url$//' | tr -d '\r' | tr '\n' ' '` +else + subcheckout_names= + submodule_names= +fi + +# func_validate SUBDIR +# Verifies that the state on the file system is in sync with the declarations +# in the configuration file. +# Input: +# - subcheckout_names space-separated list of subcheckout names +# - submodule_names space-separated list of submodule names +# Output: +# - srcdirvar Environment that the user can set +# - srcdir Value of the environment variable +# - path if $srcdir = "": relative path of the subdirectory +# - needs_init if $srcdir = "" and $path is not yet initialized: +# true +# - url if $srcdir = "" and $path is not yet initialized: +# the repository URL +func_validate () +{ + srcdirvar=`echo "$1" | LC_ALL=C sed -e 's/[^a-zA-Z0-9]/_/g' | LC_ALL=C tr '[a-z]' '[A-Z]'`"_SRCDIR" + eval 'srcdir=$'"$srcdirvar" + path= + url= + if test -n "$srcdir"; then + func_note "Ignoring '$1' because $srcdirvar is set." + else + found=false + needs_init= + case " $subcheckout_names " in *" $1 "*) + found=true + # It ought to be a subcheckout. + path=`git config --file .gitmodules "subcheckout.$1.path"` + if test -z "$path"; then + path="$1" + fi + if test -d "$path"; then + if test -d "$path/.git"; then + # It's a plain checkout. + : + else + if test -f "$path/.git"; then + # It's a submodule. + func_fatal_error "Subdirectory '$path' is supposed to be a plain checkout, but it is a submodule." + else + func_warning "Ignoring '$path' because it exists but is not a git checkout." + fi + fi + else + # The subdir does not yet exist. + needs_init=true + url=`git config --file .gitmodules "subcheckout.$1.url"` + if test -z "$url"; then + func_fatal_error "Property subcheckout.$1.url is not defined in .gitmodules" + fi + fi + ;; + esac + case " $submodule_names " in *" $1 "*) + found=true + # It ought to be a submodule. + path=`git config --file .gitmodules "submodule.$1.path"` + if test -z "$path"; then + path="$1" + fi + if test -d "$path"; then + if test -d "$path/.git" || test -f "$path/.git"; then + # It's likely a submodule. + : + else + path_if_empty=`find "$path" -prune -empty 2>/dev/null` + if test -n "$path_if_empty"; then + # The subdir is empty. + needs_init=true + else + # The subdir is not empty. + # It is important to report an error, because we don't want to erase + # the user's files and 'git submodule update gnulib' sometimes reports + # "fatal: destination path '$path' already exists and is not an empty directory." + # but sometimes does not. + func_fatal_error "Subdir '$path' exists but is not a git checkout." + fi + fi + else + # The subdir does not yet exist. + needs_init=true + fi + # Another way to determine needs_init could be: + # if git submodule status "$path" | grep '^-' > /dev/null; then + # needs_init=true + # fi + if test -n "$needs_init"; then + url=`git config --file .gitmodules "submodule.$1.url"` + if test -z "$url"; then + func_fatal_error "Property submodule.$1.url is not defined in .gitmodules" + fi + fi + ;; + esac + if ! $found; then + func_fatal_error "Subdir '$1' is not configured as a subcheckout or a submodule in .gitmodules" + fi + fi +} + +# func_cleanup_current_git_clone +# Cleans up the current 'git clone' operation. +# Input: +# - path +func_cleanup_current_git_clone () +{ + rm -rf "$path" + func_fatal_error "git clone failed" +} + +# func_pull SUBDIR +# Implements the 'pull' operation. +func_pull () +{ + func_validate "$1" + if test -z "$srcdir"; then + case " $subcheckout_names " in *" $1 "*) + # It's a subcheckout. + if test -d "$path"; then + if test -d "$path/.git"; then + (cd "$path" && git pull) || func_fatal_error "git operation failed" + fi + else + # The subdir does not yet exist. Create a plain checkout. + trap func_cleanup_current_git_clone 1 2 13 15 + git clone "$url" "$path" || func_cleanup_current_git_clone + trap - 1 2 13 15 + fi + ;; + esac + case " $submodule_names " in *" $1 "*) + # It's a submodule. + if test -n "$needs_init"; then + # Create a submodule checkout. + git submodule init -- "$path" && git submodule update -- "$path" || func_fatal_error "git operation failed" + else + # See https://stackoverflow.com/questions/1030169/easy-way-to-pull-latest-of-all-git-submodules + # https://stackoverflow.com/questions/4611512/is-there-a-way-to-make-git-pull-automatically-update-submodules + git submodule update "$path" || func_fatal_error "git operation failed" + fi + ;; + esac + fi +} + +# func_upgrade SUBDIR +# Implements the 'upgrade' operation. +func_upgrade () +{ + func_validate "$1" + if test -z "$srcdir"; then + if test -d "$path"; then + case " $subcheckout_names " in *" $1 "*) + # It's a subcheckout. + if test -d "$path/.git"; then + (cd "$path" && git pull) || func_fatal_error "git operation failed" + fi + ;; + esac + case " $submodule_names " in *" $1 "*) + # It's a submodule. + if test -z "$needs_init"; then + (cd "$path" && git fetch && git merge origin/master) || func_fatal_error "git operation failed" + fi + ;; + esac + else + # The subdir does not yet exist. + func_fatal_error "Subdirectory '$path' does not exist yet. Use 'gitsub.sh pull' to create it." + fi + fi +} + +# func_checkout SUBDIR REVISION +# Implements the 'checkout' operation. +func_checkout () +{ + func_validate "$1" + if test -z "$srcdir"; then + if test -d "$path"; then + case " $subcheckout_names " in *" $1 "*) + # It's a subcheckout. + if test -d "$path/.git"; then + (cd "$path" && git checkout "$2") || func_fatal_error "git operation failed" + fi + ;; + esac + case " $submodule_names " in *" $1 "*) + # It's a submodule. + if test -z "$needs_init"; then + (cd "$path" && git checkout "$2") || func_fatal_error "git operation failed" + fi + ;; + esac + else + # The subdir does not yet exist. + func_fatal_error "Subdirectory '$path' does not exist yet. Use 'gitsub.sh pull' to create it." + fi + fi +} + +case "$mode" in + pull ) + if test $# = 0; then + for sub in $subcheckout_names $submodule_names; do + func_pull "$sub" + done + else + valid=false + for sub in $subcheckout_names $submodule_names; do + if test "$sub" = "$1"; then + valid=true + fi + done + if $valid; then + func_pull "$1" + else + func_fatal_error "Subdir '$1' is not configured as a subcheckout or a submodule in .gitmodules" + fi + fi + ;; + + upgrade ) + if test $# = 0; then + for sub in $subcheckout_names $submodule_names; do + func_upgrade "$sub" + done + else + valid=false + for sub in $subcheckout_names $submodule_names; do + if test "$sub" = "$1"; then + valid=true + fi + done + if $valid; then + func_upgrade "$1" + else + func_fatal_error "Subdir '$1' is not configured as a subcheckout or a submodule in .gitmodules" + fi + fi + ;; + + checkout ) + valid=false + for sub in $subcheckout_names $submodule_names; do + if test "$sub" = "$1"; then + valid=true + fi + done + if $valid; then + func_checkout "$1" "$2" + else + func_fatal_error "Subdir '$1' is not configured as a subcheckout or a submodule in .gitmodules" + fi + ;; +esac -- cgit v1.2.1