The branch, master has been updated via ec3c9f2f Improve alternate build-dir support via 3b4f5fb8 Move the version string out of configure.ac. from 76064b1b Fix rebuilding configure.sh in an alternate build dir
https://git.samba.org/?p=rsync.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit ec3c9f2f5a6af532b1b5b80ed9baf477500dc8d5 Author: Wayne Davison <wa...@opencoder.net> Date: Sun Jun 28 13:22:15 2020 -0700 Improve alternate build-dir support We now put the configure.sh, config.h.in, and aclocal.m4 files in the alternate build dir along with the other generated files. This requires that we create symlinks for configure.ac & m4 in the build dir, which is handled on the first run of configure or prepare-source. I also changed the patch-branch handling away from the .gen-stash dir to an automatic build/$PATCH subdir idiom that will keep each branch's configuration separated. These automatic build dirs are only used when there is a .git dir, a build/master dir, and no top-dir Makefile. You'll also want to have package/make early on your path for optimal ease of use. commit 3b4f5fb891e57ecda3fe09c3b93fc458c8cc81a7 Author: Wayne Davison <wa...@opencoder.net> Date: Sun Jun 28 13:46:48 2020 -0700 Move the version string out of configure.ac. ----------------------------------------------------------------------- Summary of changes: .gitignore | 2 +- Makefile.in | 24 +++++++++++------------- configure | 28 +++++++++++++--------------- configure.ac | 9 ++++----- md2man | 9 +++++++-- packaging/make | 18 ++++++++++++++++++ packaging/patch-update | 41 ++--------------------------------------- packaging/pkglib.py | 15 ++++++++++----- packaging/release-rsync | 30 +++++++++++++++--------------- prepare-source | 31 ++++++++++++++++++++++++++++--- prepare-source.mak | 3 +++ rsync.h | 1 + testsuite/itemize.test | 4 ++-- version.h | 1 + 14 files changed, 116 insertions(+), 100 deletions(-) create mode 100755 packaging/make create mode 100644 version.h Changeset truncated at 500 lines: diff --git a/.gitignore b/.gitignore index 62cf9a54..6080cdac 100644 --- a/.gitignore +++ b/.gitignore @@ -49,5 +49,5 @@ aclocal.m4 /testsuite/xattrs-hlink.test /patches /SaVeDiR -/.gen-stash +/build .deps diff --git a/Makefile.in b/Makefile.in index 24156d4b..725ee420 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,5 +1,4 @@ -# Makefile for rsync. This is processed by configure to produce the final -# Makefile +# The input file that configure uses to create the Makefile for rsync. prefix=@prefix@ datarootdir=@datarootdir@ @@ -27,8 +26,6 @@ MKDIR_P=@MKDIR_P@ VPATH=$(srcdir) SHELL=/bin/sh -VERSION=@RSYNC_VERSION@ - .SUFFIXES: .SUFFIXES: .c .o @@ -38,7 +35,7 @@ ASM_x86_64=lib/md5-asm-x86_64.o GENFILES=configure.sh aclocal.m4 config.h.in proto.h proto.h-tstamp rsync.1 rsync.1.html \ rsync-ssl.1 rsync-ssl.1.html rsyncd.conf.5 rsyncd.conf.5.html HEADERS=byteorder.h config.h errcode.h proto.h rsync.h ifuncs.h itypes.h inums.h \ - lib/pool_alloc.h lib/mdigest.h lib/md-defines.h + lib/pool_alloc.h lib/mdigest.h lib/md-defines.h version.h LIBOBJ=lib/wildmatch.o lib/compat.o lib/snprintf.o lib/mdfour.o lib/md5.o \ lib/permstring.o lib/pool_alloc.o lib/sysacls.o lib/sysxattrs.o @LIBOBJS@ zlib_OBJS=zlib/deflate.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o \ @@ -172,16 +169,17 @@ aclocal.m4: $(srcdir)/m4/*.m4 aclocal -I $(srcdir)/m4 configure.sh config.h.in: configure.ac aclocal.m4 - @test -f "$(srcdir)/configure.sh" && cp -p "$(srcdir)/configure.sh" configure.sh.old || touch configure.sh.old - @test -f "$(srcdir)/config.h.in" && cp -p "$(srcdir)/config.h.in" config.h.in.old || touch config.h.in.old - (cd "$(srcdir)" && autoconf -o configure.sh && autoheader && touch config.h.in) - @if diff "$(srcdir)/configure.sh" configure.sh.old >/dev/null 2>&1; then \ + @if test -f configure.sh; then cp -p configure.sh configure.sh.old; else touch configure.sh.old; fi + @if test -f config.h.in; then cp -p config.h.in config.h.in.old; else touch config.h.in.old; fi + autoconf -o configure.sh + autoheader && touch config.h.in + @if diff configure.sh configure.sh.old >/dev/null 2>&1; then \ echo "configure.sh is unchanged."; \ rm configure.sh.old; \ else \ echo "configure.sh has CHANGED."; \ fi - @if diff "$(srcdir)/config.h.in" config.h.in.old >/dev/null 2>&1; then \ + @if diff config.h.in config.h.in.old >/dev/null 2>&1; then \ echo "config.h.in is unchanged."; \ rm config.h.in.old; \ else \ @@ -236,13 +234,13 @@ proto.h-tstamp: $(srcdir)/*.c $(srcdir)/lib/compat.c config.h .PHONY: man man: rsync.1 rsync-ssl.1 rsyncd.conf.5 -rsync.1: rsync.1.md md2man NEWS.md Makefile +rsync.1: rsync.1.md md2man version.h Makefile @$(srcdir)/maybe-make-man $(srcdir) rsync.1.md -rsync-ssl.1: rsync-ssl.1.md md2man NEWS.md Makefile +rsync-ssl.1: rsync-ssl.1.md md2man version.h Makefile @$(srcdir)/maybe-make-man $(srcdir) rsync-ssl.1.md -rsyncd.conf.5: rsyncd.conf.5.md md2man NEWS.md Makefile +rsyncd.conf.5: rsyncd.conf.5.md md2man version.h Makefile @$(srcdir)/maybe-make-man $(srcdir) rsyncd.conf.5.md .PHONY: clean diff --git a/configure b/configure index 32cc3b5d..75b9ed7c 100755 --- a/configure +++ b/configure @@ -4,24 +4,22 @@ # then transfer control to the configure.sh script to do the real work. dir=`dirname $0` -realconfigure="$dir/configure.sh" -if test ! -f "$realconfigure"; then - if test -f "$HOME/build_farm/build_test.fns"; then - # Test the included popt - set -- --with-included-popt "${@}" - # Allow the build farm to grab latest files via rsync. - actions='build fetch' - else - actions='build' - fi - if "$dir/prepare-source" $actions; then - : - else +# Support automatic switching to build/$BRANCH subdirs. It's also good +# to put packaging/make somewhere early in your $PATH if you use this! +if test "$dir" = '.' -a ! -f Makefile -a -d build/master -a -d .git; then + builddir=build/`git rev-parse --abbrev-ref HEAD | tr / %` + test -d "$builddir" || mkdir "$builddir" + cd "$builddir" || exit 1 + dir=../.. +fi + +if test ! -f configure.sh; then + if ! "$dir/prepare-source" build; then echo 'Failed to build configure.sh and/or config.h.in -- giving up.' >&2 - rm -f "$realconfigure" + rm -f configure.sh exit 1 fi fi -exec "$realconfigure" "${@}" +exec ./configure.sh --srcdir="$dir" "${@}" diff --git a/configure.ac b/configure.ac index 9275ce75..3676a716 100644 --- a/configure.ac +++ b/configure.ac @@ -1,16 +1,15 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT([rsync],[3.2.2pre1],[https://rsync.samba.org/bugtracking.html]) +AC_INIT([rsync],[],[https://rsync.samba.org/bugtracking.html]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([byteorder.h]) AC_CONFIG_HEADER(config.h) AC_PREREQ([2.69]) -AC_SUBST(RSYNC_VERSION, $PACKAGE_VERSION) -AC_MSG_NOTICE([Configuring rsync $PACKAGE_VERSION]) +PACKAGE_VERSION=`sed 's/.*"\(.*\)".*/\1/' <$srcdir/version.h` -AC_DEFINE_UNQUOTED(RSYNC_VERSION, ["$PACKAGE_VERSION"], [rsync release version]) +AC_MSG_NOTICE([Configuring rsync $PACKAGE_VERSION]) LDFLAGS=${LDFLAGS-""} @@ -1338,5 +1337,5 @@ AC_CONFIG_FILES([Makefile lib/dummy zlib/dummy popt/dummy shconfig]) AC_OUTPUT AC_MSG_RESULT() -AC_MSG_RESULT([ rsync ${RSYNC_VERSION} configuration successful]) +AC_MSG_RESULT([ rsync $PACKAGE_VERSION configuration successful]) AC_MSG_RESULT() diff --git a/md2man b/md2man index ef4e58d6..992d7320 100755 --- a/md2man +++ b/md2man @@ -93,7 +93,7 @@ def main(): env_subs['VERSION'] = '1.0.0' env_subs['libdir'] = '/usr' else: - for fn in (fi.srcdir + 'NEWS.md', 'Makefile'): + for fn in (fi.srcdir + 'version.h', 'Makefile'): try: st = os.lstat(fn) except: @@ -101,6 +101,11 @@ def main(): if not fi.mtime: fi.mtime = st.st_mtime + with open(fi.srcdir + 'version.h', 'r', encoding='utf-8') as fh: + txt = fh.read() + m = re.search(r'"(.+?)"', txt) + env_subs['VERSION'] = m.group(1) + with open('Makefile', 'r', encoding='utf-8') as fh: for line in fh: m = re.match(r'^(\w+)=(.+)', line) @@ -112,7 +117,7 @@ def main(): while re.search(r'\$\{', val): val = re.sub(r'\$\{(\w+)\}', lambda m: env_subs[m.group(1)], val) env_subs[var] = val - if var == 'VERSION': + if var == 'srcdir': break with open(fi.fn, 'r', encoding='utf-8') as fh: diff --git a/packaging/make b/packaging/make new file mode 100755 index 00000000..91583009 --- /dev/null +++ b/packaging/make @@ -0,0 +1,18 @@ +#!/bin/sh + +# You can put this script early on your PATH to support a top-dir "make" +# changing into a per-branch build dir before running the make. Just start +# with a pristine top dir (e.g. run "make distclean") and then create the dir +# "build/master", at which point you can stay in the top dir of the source and +# run "./configure" and "make" commands and have the appropriate build dir be +# automatically used (the non-master subdirs will be auto-created). + +if [ ! -f Makefile -a -d build/master -a -d .git -a x"$1" != x-* ]; then + builddir=build/`git rev-parse --abbrev-ref HEAD | tr / %` + [ -d "$builddir" ] || mkdir "$builddir" + # Let make do a noisy chdir so that a calling editor knows where the files are. + set -- -C "$builddir" ${1+"$@"} +fi + +export PATH="/usr/lib/ccache:$PATH" +exec /usr/bin/make ${1+"$@"} diff --git a/packaging/patch-update b/packaging/patch-update index c5bbe1c3..7b265288 100755 --- a/packaging/patch-update +++ b/packaging/patch-update @@ -13,9 +13,8 @@ sys.path = ['packaging'] + sys.path from pkglib import * MAKE_GEN_CMDS = [ - 'make -f prepare-source.mak conf'.split(), - './config.status'.split(), - 'make gen'.split(), + './prepare-source'.split(), + 'make restatus gen'.split(), ] TMP_DIR = "patches.gen" @@ -31,12 +30,6 @@ def main(): starting_branch, args.base_branch = check_git_state(args.base_branch, not args.skip_check, args.patches_dir) - if not os.path.isdir('.gen-stash'): - os.mkdir('.gen-stash', 0o700) - gen_stash(starting_branch) - if starting_branch == 'master': - cmd_chk('md5sum configure.ac >.gen-stash/configure.ac.sum') - master_commit = latest_git_hash(args.base_branch) if args.gen: @@ -101,8 +94,6 @@ def main(): time.sleep(1) cmd_chk(['git', 'checkout', starting_branch]) - gen_unstash(starting_branch) - def update_patch(patch): global last_touch @@ -132,7 +123,6 @@ def update_patch(patch): s = cmd_run(['git', 'merge', based_on]) ok = s.returncode == 0 if not ok or args.shell: - gen_unstash(branch) m = re.search(r'([^/]+)$', parent) parent_dir = m[1] if not ok: @@ -149,7 +139,6 @@ def update_patch(patch): if is_clean: break print(status_txt, end='') - gen_stash(branch) with open(f"{args.patches_dir}/{patch}.diff", 'w', encoding='utf-8') as fh: fh.write(description[patch]) @@ -203,32 +192,6 @@ def update_patch(patch): return 1 -# The autoconf cache dir can totally mess up if 2 different *.ac files have the same mtime! -def gen_stash_prep(branch): - if os.path.isdir('autom4te.cache'): - shutil.rmtree('autom4te.cache') - return '.gen-stash/' + branch.replace('/', '%') + '.tar.gz' - - -def gen_stash(branch): - files = 'configure.sh config.h.in Makefile'.split() - for fn in files: - if not os.path.exists(fn): - return - tar_fn = gen_stash_prep(branch) - cmd_run(['./prepare-source']) - cmd_chk(['tar', 'czf', tar_fn, *files]) - - -def gen_unstash(branch): - tar_fn = gen_stash_prep(branch) - if os.path.exists(tar_fn): - cmd_chk(['tar', 'xf', tar_fn]) - out, rc = cmd_txt_status('md5sum --status -c .gen-stash/configure.ac.sum'.split()) - if rc: - print('*' * 10, "configure.ac differs from master version", '*' * 10) - - if __name__ == '__main__': parser = argparse.ArgumentParser(description="Turn a git branch back into a diff files in the patches dir.", add_help=False) parser.add_argument('--branch', '-b', dest='base_branch', metavar='BASE_BRANCH', default='master', help="The branch the patch is based on. Default: master.") diff --git a/packaging/pkglib.py b/packaging/pkglib.py index 628669b0..c83a1cdc 100644 --- a/packaging/pkglib.py +++ b/packaging/pkglib.py @@ -181,25 +181,30 @@ def mandate_gensend_hook(): # Snag the GENFILES values out of the Makefile.in file and return them as a list. -def get_gen_files(): +def get_gen_files(want_dir_plus_list=False): cont_re = re.compile(r'\\\n') - extras = [ ] + gen_files = [ ] + + builddir = os.path.join('build', cmd_txt('git rev-parse --abbrev-ref HEAD').replace('/', '%')) with open('Makefile.in', 'r', encoding='utf-8') as fh: for line in fh: - if not extras: + if not gen_files: chk = re.sub(r'^GENFILES=', '', line) if line == chk: continue line = chk m = re.search(r'\\$', line) line = re.sub(r'^\s+|\s*\\\n?$|\s+$', '', line) - extras += line.split() + gen_files += line.split() if not m: break - return extras + if want_dir_plus_list: + return (builddir, gen_files) + + return [ os.path.join(builddir, fn) for fn in gen_files ] def get_configure_version(): diff --git a/packaging/release-rsync b/packaging/release-rsync index 629ee25d..33a9ef2d 100755 --- a/packaging/release-rsync +++ b/packaging/release-rsync @@ -30,7 +30,8 @@ def main(): signal.signal(signal.SIGINT, signal_handler) - gen_files = get_gen_files() + builddir, gen_files = get_gen_files(True) + gen_pathnames = [ os.path.join(builddir, fn) for fn in gen_files ] dash_line = '=' * 74 @@ -153,7 +154,7 @@ release is "{release}" About to: - tweak SUBPROTOCOL_VERSION in rsync.h, if needed - - tweak the version in configure.ac and the spec files + - tweak the version in version.h and the spec files - tweak NEWS.md to ensure header values are correct - generate configure.sh, config.h.in, and proto.h - page through the differences @@ -168,16 +169,15 @@ About to: '%define srcdir': srcdir, } - tweak_files = 'configure.ac rsync.h NEWS.md'.split() + tweak_files = 'version.h rsync.h NEWS.md'.split() tweak_files += glob.glob('packaging/*.spec') tweak_files += glob.glob('packaging/*/*.spec') for fn in tweak_files: with open(fn, 'r', encoding='utf-8') as fh: old_txt = txt = fh.read() - if 'configure' in fn: - x_re = re.compile(r'^(AC_INIT\(\[rsync\],\s*\[)\d.+?(\])', re.M) - txt = replace_or_die(x_re, r'\g<1>%s\2' % version, txt, f"Unable to update AC_INIT with version in {fn}") + if fn == 'version.h': + txt = f"#define RSYNC_VERSION {version}\n" elif '.spec' in fn: for var, val in specvars.items(): x_re = re.compile(r'^%s .*' % re.escape(var), re.M) @@ -216,10 +216,10 @@ About to: srctar_name = f"{rsync_ver}.tar.gz" pattar_name = f"rsync-patches-{version}.tar.gz" diff_name = f"{rsync_lastver}-{version}.diffs.gz" - srctar_file = f"{dest}/{srcdir}/{srctar_name}" - pattar_file = f"{dest}/{srcdir}/{pattar_name}" - diff_file = f"{dest}/{srcdiffdir}/{diff_name}" - lasttar_file = f"{dest}/{lastsrcdir}/{rsync_lastver}.tar.gz" + srctar_file = os.path.join(dest, srcdir, srctar_name) + pattar_file = os.path.join(dest, srcdir, pattar_name) + diff_file = os.path.join(dest, srcdiffdir, diff_name) + lasttar_file = os.path.join(dest, lastsrcdir, rsync_lastver + '.tar.gz') print(f"""\ {dash_line} @@ -237,8 +237,8 @@ About to: if s.returncode: die('Aborting') - cmd_chk('make reconfigure ; make gen') - cmd_chk(['rsync', '-a', *gen_files, 'SaVeDiR/']) + cmd_chk('make gen') + cmd_chk(['rsync', '-a', *gen_pathnames, 'SaVeDiR/']) print(f'Creating any missing patch branches.') s = cmd_run(f'packaging/branch-from-patch --branch={args.master_branch} --add-missing') @@ -295,12 +295,12 @@ About to: os.environ['PATH'] = ORIGINAL_PATH # Extract the generated files from the old tar. - tweaked_gen_files = [ f"{rsync_lastver}/{x}" for x in gen_files ] + tweaked_gen_files = [ os.path.join(rsync_lastver, fn) for fn in gen_files ] cmd_run(['tar', 'xzf', lasttar_file, *tweaked_gen_files]) os.rename(rsync_lastver, 'a') print(f"Creating {diff_file} ...") - cmd_chk(['rsync', '-a', *gen_files, 'b/']) + cmd_chk(['rsync', '-a', *gen_pathnames, 'b/']) sed_script = r's:^((---|\+\+\+) [ab]/[^\t]+)\t.*:\1:' # CAUTION: must not contain any single quotes! cmd_chk(f"(git diff v{lastversion} {v_ver} -- ':!.github'; diff -upN a b | sed -r '{sed_script}') | gzip -9 >{diff_file}") @@ -329,7 +329,7 @@ About to: print(f"Updating the other files in {dest} ...") md_files = 'README.md NEWS.md'.split() - html_files = [ fn for fn in gen_files if fn.endswith('.html') ] + html_files = [ fn for fn in gen_pathnames if fn.endswith('.html') ] cmd_chk(['rsync', '-a', *md_files, *html_files, dest]) cmd_chk(["packaging/md2html"] + [ dest +'/'+ fn for fn in md_files ]) diff --git a/prepare-source b/prepare-source index a41a66a3..8cc7911a 100755 --- a/prepare-source +++ b/prepare-source @@ -16,6 +16,27 @@ if test x"$dir" = x; then dir=. fi +# Support automatic switching to build/$BRANCH subdirs. It's also good +# to put packaging/make somewhere early in your $PATH if you use this! +if test "$dir" = . -a ! -f Makefile -a -d build/master -a -d .git; then + builddir=build/`git rev-parse --abbrev-ref HEAD | tr / %` + test -d "$builddir" || mkdir "$builddir" + cd "$builddir" || exit 1 + dir=../.. +fi + +if test "$dir" != '.'; then + for lnk in configure.ac m4; do + if test ! -h $lnk; then + rm -f $lnk # Just in case + ln -s "$dir/$lnk" $lnk + fi + done + for fn in configure.sh config.h.in aclocal.m4; do + test ! -f $fn -a -f "$dir/$fn" && cp -p "$dir/$fn" $fn + done +fi + if test $# = 0; then set -- build fi @@ -23,13 +44,16 @@ fi for action in "${@}"; do case "$action" in build|make) - (cd $dir && make -f prepare-source.mak) + make -f "$dir/prepare-source.mak" ;; fetch|fetchgen) - $dir/rsync-ssl -iip --no-motd rsync://download.samba.org/rsyncftp/generated-files/'[ca]*' $dir if test "$action" = fetchgen; then - $dir/rsync-ssl -iip --no-motd rsync://download.samba.org/rsyncftp/generated-files/'[^ca]*' . + match='*' + else + match='[ca]*' fi + $dir/rsync-ssl -iipc --no-motd "rsync://download.samba.org/rsyncftp/generated-files/$match" ./ + test $? != 0 && continue sleep 1 # The following files need to be newer than aclocal.m4 touch configure.sh config.h.in ;; @@ -39,6 +63,7 @@ for action in "${@}"; do *) echo "Unknown action: $action" exit 1 + ;; esac if test $? = 0; then exit diff --git a/prepare-source.mak b/prepare-source.mak index bc1938de..08b916de 100644 --- a/prepare-source.mak +++ b/prepare-source.mak @@ -1,3 +1,6 @@ +SHELL=/bin/sh + +.PHONY: conf conf: configure.sh config.h.in -- The rsync repository. _______________________________________________ rsync-cvs mailing list rsync-cvs@lists.samba.org https://lists.samba.org/mailman/listinfo/rsync-cvs