diff --git a/GNUmakefile.in b/GNUmakefile.in index 4d8fc794bb..30553b2a95 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -87,29 +87,25 @@ update-unicode: | submake-generated-headers submake-libpgport distdir = postgresql-$(VERSION) dummy = =install= +GIT = git + dist: $(distdir).tar.gz $(distdir).tar.bz2 - rm -rf $(distdir) -$(distdir).tar: distdir - $(TAR) chf $@ $(distdir) - -.INTERMEDIATE: $(distdir).tar +.PHONY: $(distdir).tar.gz $(distdir).tar.bz2 distdir-location: @echo $(distdir) -distdir: - rm -rf $(distdir)* $(dummy) - for x in `cd $(top_srcdir) && find . \( -name CVS -prune \) -o \( -name .git -prune \) -o -print`; do \ - file=`expr X$$x : 'X\./\(.*\)'`; \ - if test -d "$(top_srcdir)/$$file" ; then \ - mkdir "$(distdir)/$$file" && chmod 777 "$(distdir)/$$file"; \ - else \ - ln "$(top_srcdir)/$$file" "$(distdir)/$$file" >/dev/null 2>&1 \ - || cp "$(top_srcdir)/$$file" "$(distdir)/$$file"; \ - fi || exit; \ - done - $(MAKE) -C $(distdir) distclean +# Note: core.autocrlf=false is needed to avoid line-ending conversion +# in case the environment has a different setting. Without this, a +# tarball created on Windows might be different than on, and unusable +# on, Unix machines. + +$(distdir).tar.gz: + $(GIT) -C $(srcdir) -c core.autocrlf=false archive --format tar.gz -9 --prefix $(distdir)/ HEAD -o $(abs_top_builddir)/$@ + +$(distdir).tar.bz2: + $(GIT) -C $(srcdir) -c core.autocrlf=false -c tar.tar.bz2.command='$(BZIP2) -c' archive --format tar.bz2 --prefix $(distdir)/ HEAD -o $(abs_top_builddir)/$@ distcheck: dist rm -rf $(dummy) @@ -135,4 +131,4 @@ headerscheck: submake-generated-headers cpluspluscheck: submake-generated-headers $(top_srcdir)/src/tools/pginclude/headerscheck --cplusplus $(top_srcdir) $(abs_top_builddir) -.PHONY: dist distdir distcheck docs install-docs world check-world install-world installcheck-world headerscheck cpluspluscheck +.PHONY: dist distcheck docs install-docs world check-world install-world installcheck-world headerscheck cpluspluscheck diff --git a/meson.build b/meson.build index c8fdfeb0ec..18b5be842e 100644 --- a/meson.build +++ b/meson.build @@ -3359,6 +3359,71 @@ run_target('help', +############################################################### +# Distribution archive +############################################################### + +# Meson has its own distribution building command (meson dist), but we +# are not using that at this point. The main problem is that, the way +# they have implemented it, it is not deterministic. Also, we want it +# to be equivalent to the "make" version for the time being. But the +# target name "dist" in meson is reserved for that reason, so we call +# the custom target "pgdist". + +git = find_program('git', required: false, native: true, disabler: true) +bzip2 = find_program('bzip2', required: false, native: true) + +distdir = meson.project_name() + '-' + meson.project_version() + +# Note: core.autocrlf=false is needed to avoid line-ending conversion +# in case the environment has a different setting. Without this, a +# tarball created on Windows might be different than on, and unusable +# on, Unix machines. + +tar_gz = custom_target('tar.gz', + build_always_stale: true, + command: [git, '-C', '@SOURCE_ROOT@', + '-c', 'core.autocrlf=false', + 'archive', + '--format', 'tar.gz', + '-9', + '--prefix', distdir + '/', + '-o', join_paths(meson.build_root(), '@OUTPUT@'), + 'HEAD', '.'], + output: distdir + '.tar.gz', +) + +if bzip2.found() + tar_bz2 = custom_target('tar.bz2', + build_always_stale: true, + command: [git, '-C', '@SOURCE_ROOT@', + '-c', 'core.autocrlf=false', + '-c', 'tar.tar.bz2.command="@0@" -c'.format(bzip2.path()), + 'archive', + '--format', 'tar.bz2', + '--prefix', distdir + '/', + '-o', join_paths(meson.build_root(), '@OUTPUT@'), + 'HEAD', '.'], + output: distdir + '.tar.bz2', + ) +else + tar_bz2 = custom_target('tar.bz2', + command: [perl, '-e', 'exit 1'], + output: distdir + '.tar.bz2', + ) +endif + +alias_target('pgdist', [tar_gz, tar_bz2]) + +# Make the standard "dist" command fail, to prevent accidental use. +# But not if we are in a subproject, in case the parent project wants to +# create a dist using the standard Meson command. +if not meson.is_subproject() + meson.add_dist_script(perl, '-e', 'exit 1') +endif + + + ############################################################### # The End, The End, My Friend ###############################################################