Update GPG key for signing flatpaks.
[pspp] / build-pspp
index 7cc875656ba299ecc98c4bd3cb5d434ab2a78ad1..b449a5c89c5efee0df14c94dfed2243e0a58b530 100755 (executable)
@@ -27,8 +27,10 @@ where TARBALL is the name of a tarball produced by "make dist"
 
 Options:
   --help            Print this usage message and exit
+  --ssw=TARBALL     Get ssw from TARBALL instead of from Git.
   --no-binary       Build source tarballs but no binaries.
-  --batch           Do not print progress to stdout."""
+  --batch           Do not print progress to stdout.
+  --no-perl         Do not build Perl module."""
           % (sys.argv[0], sys.argv[0]))
     sys.exit(0)
 
@@ -115,6 +117,7 @@ def write_timing(id, time):
 
 
 def fail():
+    set_var("result", "failure")
     sys.stderr.write("Build failed, refer to:\n\t%s\nfor details.\n" % logfile)
     sys.exit(1)
 
@@ -163,12 +166,91 @@ def ref_to_commit(ref, repo='.'):
     return backquotes("cd %s && %s rev-parse %s" % (repo, GIT, ref))
 
 
+def add_commit_to_version(name, commit, dir, extra_news = None):
+    abbrev_commit = commit[:6]
+
+    # Extract version number.
+    start_step("Extract %s repository version number" % name)
+    fields = backquotes("cd %s && autoconf -t AC_INIT" % dir).split(':')
+    file, line, macro, package, repo_version = fields[:5]
+    rest = fields[5:]
+    set_var("%s_repo_version" % name, repo_version)
+
+    # Is this a "gnits" mode tree?
+    start_step("Checking %s Automake mode" % name)
+
+    am_mode = "gnu"
+    for s in open("%s/Makefile.am" % dir):
+        if "gnits" in s:
+            am_mode = "gnits"
+            break
+    LOG.write("%s Automake mode is %s\n" % (name, am_mode))
+
+    # Generate version number for build.
+    # We want to append -g012345, but if we're in Gnits mode and the
+    # version number already has a hyphen, we have to omit it.
+    start_step("Generate %s build version number" % name)
+    version = repo_version
+    if '-' not in version:
+        version += '-'
+    version += 'g' + abbrev_commit
+    set_var("%s_version" % name, version)
+
+    # Append -g012345 to configure.ac version number.
+    start_step("Updating %s version number in %s" % (name, file))
+    fullname = "%s/%s" % (dir, file)
+    NEWFILE = open("%s.new" % fullname, "w")
+    ln = 1
+    for s in open(fullname):
+        if ln != int(line):
+            NEWFILE.write(s)
+        else:
+            NEWFILE.write("AC_INIT([%s], [%s]" % (package, version))
+            for field in rest:
+                NEWFILE.write(", [%s]" % field)
+            NEWFILE.write(")\n")
+        ln += 1
+    NEWFILE.close()
+    os.rename("%s.new" % fullname, fullname)
+
+    # Add note to beginning of NEWS (otherwise "make dist" fails).
+    start_step("Updating %s NEWS" % name)
+    fullname = "%s/NEWS" % name
+    NEWFILE = open("%s.new" % fullname, "w")
+    found_changes = False
+    for s in open(fullname):
+        if not found_changes and (s.startswith('Changes') or repo_version in s):
+            found_changes = True
+            NEWFILE.write("""\
+Changes from %(repo_version)s to %(version)s:
+
+ * Built from PSPP commit %(revision)s
+   in branch %(branch)s on builder %(builder)s.
+
+"""
+                          % {'repo_version': repo_version,
+                             'version': version,
+                             'revision': commit,
+                             'branch': branch,
+                             'builder': builder})
+            if extra_news:
+                NEWFILE.write(extra_news)
+                NEWFILE.write('\n')
+
+        NEWFILE.write(s)
+    NEWFILE.close()
+    os.rename("%s.new" % fullname, fullname)
+
+    return version
+
 try:
     opts, args = getopt.gnu_getopt(sys.argv[1:], "ho:",
                                    ["help",
                                     "binary", "no-binary",
                                     "batch", "no-batch",
+                                    "no-perl",
                                     "output=",
+                                    "ssw=",
                                     "builder=", "build-number="])
 except getopt.GetoptError as err:
     # print help information and exit:
@@ -180,6 +262,8 @@ batch = not os.isatty(1)
 builddir = None
 build_number = None
 builder = None
+build_perl = True
+ssw = "https://git.savannah.gnu.org/git/ssw.git master"
 for o, a in opts:
     if o in ("-h", "--help"):
         print_usage()
@@ -197,6 +281,10 @@ for o, a in opts:
         builder = a
     elif o == "--build-number":
         build_number = a
+    elif o == "--no-perl":
+        build_perl = False
+    elif o == "--ssw":
+        ssw = a
     else:
         assert False, "unhandled option"
 if builder is None:
@@ -246,9 +334,6 @@ set_var("build_number", build_number)
 
 GIT = "git --git-dir=%s/.git" % topdir
 
-# ssw = "https://alpha.gnu.org/gnu/ssw/spread-sheet-widget-0.4.tar.gz"
-ssw = "https://git.savannah.gnu.org/git/ssw.git master"
-
 if ssw.endswith('.tar.gz'):
     ssw_basename = os.path.basename(ssw)
     ssw_file = '%s/%s' % (topdir, ssw_basename)
@@ -262,9 +347,6 @@ if len(args) == 2:
         if not Path(ssw_file).exists():
             start_step("Retrieve spread-sheet-widget tarball %s" % ssw_file)
             run("wget -O %s %s" % (ssw_file, ssw))
-
-        start_step("Extract %s into %s" % (ssw_file, ssw_dir))
-        run("tar xzf %s" % ssw_file)
     elif ' ' in ssw:
         ssw_url, ssw_ref = ssw.split()
 
@@ -273,13 +355,29 @@ if len(args) == 2:
 
         start_step("Check out %s in ssw" % ssw_ref)
         run("cd %s && git checkout %s" % (ssw_dir, ssw_ref))
-        set_var("ssw_commit", ref_to_commit("HEAD", "ssw"))
+        ssw_commit = ref_to_commit("HEAD", "ssw")
+        set_var("ssw_commit", ssw_commit)
+
+        ssw_version = add_commit_to_version("ssw", ssw_commit, "ssw")
 
         start_step("Bootstrap ssw")
-        run("cd %s && ./bootstrap" % ssw_dir)
+        run("cd ssw && ./bootstrap")
+
+        start_step("Configure ssw source")
+        run("cd ssw && mkdir _build && cd _build && ../configure",
+            "configure")
+
+        start_step("Make ssw source tarball")
+        run("cd ssw/_build && make -j128 dist", "dist")
+        ssw_dir = "spread-sheet-widget-%s" % ssw_version
+        ssw_file = "ssw/_build/%s.tar.gz" % ssw_dir
+        save_result("ssw source distribution", ssw_file)
     else:
         assert False
 
+    start_step("Extract %s into %s" % (ssw_file, ssw_dir))
+    run("tar xzf %s" % ssw_file)
+
     start_step("Configure spread-sheet-widget")
     run("cd %s && ./configure --prefix=''" % ssw_dir)
 
@@ -299,57 +397,12 @@ if len(args) == 2:
     set_var("pspp_ref", "refs/builds/%s/pspp" % build_number)
     revision = ref_to_commit("refs/builds/%s/pspp" % build_number)
     set_var("pspp_commit", revision)
-    abbrev_commit = revision[:6]
 
     # Extract source.
     start_step("Extract branch into source directory")
     run("%s archive --format=tar --prefix=pspp/ refs/builds/%s/pspp | tar xf -"
         % (GIT, build_number))
 
-    # Extract version number.
-    start_step("Extract repository version number")
-    fields = backquotes("cd pspp && autoconf -t AC_INIT").split(':')
-    file, line, macro, package, repo_version = fields[:5]
-    rest = fields[5:]
-    set_var("repo_version", repo_version)
-
-    # Is this a "gnits" mode tree?
-    start_step("Checking Automake mode")
-
-    am_mode = "gnu"
-    for s in open("pspp/Makefile.am"):
-        if "gnits" in s:
-            am_mode = "gnits"
-            break
-    LOG.write("Automake mode is %s\n" % am_mode)
-
-    # Generate version number for build.
-    # We want to append -g012345, but if we're in Gnits mode and the
-    # version number already has a hyphen, we have to omit it.
-    start_step("Generate build version number")
-    version = repo_version
-    if '-' not in version:
-        version += '-'
-    version += 'g' + abbrev_commit
-    set_var("version", version)
-
-    # Append -g012345 to configure.ac version number.
-    start_step("Updating version number in %s" % file)
-    fullname = "pspp/%s" % file
-    NEWFILE = open("%s.new" % fullname, "w")
-    ln = 1
-    for s in open(fullname):
-        if ln != int(line):
-            NEWFILE.write(s)
-        else:
-            NEWFILE.write("AC_INIT([%s], [%s]" % (package, version))
-            for field in rest:
-                NEWFILE.write(", [%s]" % field)
-            NEWFILE.write(")\n")
-        ln += 1
-    NEWFILE.close()
-    os.rename("%s.new" % fullname, fullname)
-
     # Get Gnulib commit number.
     start_step("Reading README.Git to find Gnulib commit number")
     fullname = "pspp/README.Git"
@@ -362,36 +415,11 @@ if len(args) == 2:
     if gnulib_commit is None:
         sys.stderr.write("%s does not specify a Git commit number\n"
                          % fullname)
-        sys.exit(1)
+        fail()
     set_var("gnulib_commit", gnulib_commit)
 
-    # Add note to beginning of NEWS (otherwise "make dist" fails).
-    start_step("Updating NEWS")
-    fullname = "pspp/NEWS"
-    NEWFILE = open("%s.new" % fullname, "w")
-    found_changes = False
-    for s in open(fullname):
-        if not found_changes and s.startswith('Changes'):
-            found_changes = True
-            NEWFILE.write("""\
-Changes from %(repo_version)s to %(version)s:
-
- * Built from PSPP commit %(revision)s
-   in branch %(branch)s on builder %(builder)s.
-
- * Built from Gnulib commit %(gnulib_commit)s.
-
-"""
-                          % {'repo_version': repo_version,
-                             'version': version,
-                             'revision': revision,
-                             'branch': branch,
-                             'builder': builder,
-                             'gnulib_commit': gnulib_commit})
-
-        NEWFILE.write(s)
-    NEWFILE.close()
-    os.rename("%s.new" % fullname, fullname)
+    version = add_commit_to_version("pspp", revision, "pspp",
+                                    " * Built from Gnulib commit %(gnulib_commit)s.\n")
 
     # If we don't already have that Gnulib commit, update Gnulib.
     rc = os.system("%s rev-parse --verify --quiet %s^0 > /dev/null"
@@ -422,7 +450,7 @@ Changes from %(repo_version)s to %(version)s:
 
     # Distribute.
     start_step("Make source tarball")
-    run("cd pspp/_build && make -j$(nproc) dist", "dist")
+    run("cd pspp/_build && make -j128 dist", "dist")
     tarname = "pspp-%s.tar.gz" % version
     tarball = save_result("source distribution", "pspp/_build/%s" % tarname, 1)
 
@@ -434,14 +462,13 @@ Changes from %(repo_version)s to %(version)s:
 
     # Build examples for user manual.
     start_step("Build examples for user manual")
-    run("cd pspp/_build && make -j$(nproc) example-outputs example-html")
+    run("cd pspp/_build && make -j$(nproc) figure-spvs figure-txts figure-texis figure-htmls")
 
     # Build user manual
     start_step("Build user manual")
     run("cd pspp && "
         "GENDOCS_TEMPLATE_DIR=%s %s/gendocs.sh -s doc/pspp.texi -I doc "
-        "-I _build/doc/examples -I doc/examples "
-        "-o %s/user-manual --email bug-gnu-pspp@gnu.org "
+        "-I _build/doc -o %s/user-manual --email bug-gnu-pspp@gnu.org "
         "pspp \"GNU PSPP User Manual\"" % (topdir, topdir, resultsdir),
         "user-manual")
     saved_result("User Manual", "user-manual")
@@ -483,18 +510,20 @@ if build_binary:
     start_step("Configuring")
     run("chmod -R a-w %s/%s" % (builddir, tarball_dir))
     run("chmod u+w %s/%s" % (builddir, tarball_dir))
-    run("chmod -R u+w %s/%s/perl-module" % (builddir, tarball_dir))
+    if build_perl:
+        run("chmod -R u+w %s/%s/perl-module" % (builddir, tarball_dir))
     run("mkdir %s/%s/_build" % (builddir, tarball_dir))
     run("chmod a-w %s/%s" % (builddir, tarball_dir))
     ok = try_run(
         "cd %(builddir)s/%(tarball_dir)s/_build && ../configure "
-        "--with-perl-module --enable-relocatable --prefix='' "
+        "--%(perl)s-perl-module --enable-relocatable --prefix='' "
         "PKG_CONFIG_PATH=$PWD/../../../source/%(ssw_dir)s/inst/lib/pkgconfig "
         "CPPFLAGS=\"-I$PWD/../../../source/%(ssw_dir)s/inst/include\" "
-        "LDFLAGS=\"-L$PWD/../../../source/%(ssw_dir)s/inst/lib\""
+        "LDFLAGS=\"-L$PWD/../../../source/%(ssw_dir)s/inst/lib\" "
         % {"builddir": builddir,
            "tarball_dir": tarball_dir,
-           "ssw_dir": ssw_dir},
+           "ssw_dir": ssw_dir,
+           "perl": "with" if build_perl else "without"},
         "bin-configure")
     for basename in ("config.h", "config.log"):
         save_result_if_exists("build configuration",
@@ -505,21 +534,23 @@ if build_binary:
 
     start_step("Build")
     run("cd %s/%s/_build && make -j$(nproc)" % (builddir, tarball_dir), "build")
-    run("cd %s/%s/_build/perl-module && perl Makefile.PL && make -j$(nproc)"
-        % (builddir, tarball_dir), "build Perl module")
+    if build_perl:
+        run("cd %s/%s/_build/perl-module && perl Makefile.PL && make -j$(nproc)"
+            % (builddir, tarball_dir), "build Perl module")
 
     start_step("Install")
     run("cd %s/%s/_build && make -j$(nproc) install DESTDIR=$PWD/pspp-%s"
         % (builddir, tarball_dir, binary_version), "install")
     run("cd ../source/%s && make -j$(nproc) install DESTDIR=%s/%s/_build/pspp-%s"
         % (ssw_dir, builddir, tarball_dir, binary_version))
-    run("cd %s/%s/_build/perl-module && "
-        "make -j$(nproc)  install DESTDIR=%s/%s/_build/pspp-%s"
-        % (builddir, tarball_dir, builddir, tarball_dir, binary_version),
-        "install Perl module")
-    run("cd %s/%s/_build/perl-module && "
-        "make -j$(nproc) install DESTDIR=$PWD/inst"
-        % (builddir, tarball_dir))
+    if build_perl:
+        run("cd %s/%s/_build/perl-module && "
+            "make -j$(nproc)  install DESTDIR=%s/%s/_build/pspp-%s"
+            % (builddir, tarball_dir, builddir, tarball_dir, binary_version),
+            "install Perl module")
+        run("cd %s/%s/_build/perl-module && "
+            "make -j$(nproc) install DESTDIR=$PWD/inst"
+            % (builddir, tarball_dir))
 
     start_step("Make binary distribution")
     run("cd %s/%s/_build && tar cfz pspp-%s.tar.gz pspp-%s"
@@ -543,10 +574,11 @@ if build_binary:
         % (builddir, tarball_dir, binary_version), "uninstall")
 
     start_step("Check uninstall")
-    run("(cd %s/%s/_build/perl-module/inst && find -type f -print) | "
-        "(cd %s/%s/_build/pspp-%s && xargs rm)"
-        % (builddir, tarball_dir,
-           builddir, tarball_dir, binary_version), "uninstall Perl module")
+    if build_perl:
+        run("(cd %s/%s/_build/perl-module/inst && find -type f -print) | "
+            "(cd %s/%s/_build/pspp-%s && xargs rm)"
+            % (builddir, tarball_dir,
+               builddir, tarball_dir, binary_version), "uninstall Perl module")
     run("cd %s/%s/_build && "
         "make -j$(nproc) distuninstallcheck distuninstallcheck_dir=$PWD/pspp-%s"
         % (builddir, tarball_dir, binary_version),
@@ -555,3 +587,4 @@ if build_binary:
     # distcleancheck
 
 start_step("Success")
+set_var("result", "success")