From 62d13640007c409b65911480c52194a0cf1088c8 Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Wed, 15 Jun 2022 16:50:21 +0200
Subject: [PATCH] [distrib] improves make-distrib

---
 .gitlab-ci.yml              |  11 ++--
 devel_tools/make-distrib.sh | 106 ++++++++++++++++++++++++++++++++----
 2 files changed, 103 insertions(+), 14 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 24b6ca8b6ad..82555d9c220 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -25,6 +25,10 @@ variables:
 
 build-distrib-tarball:
   stage: build
+  variables:
+    OPEN_SOURCE: "yes"
+    CI_LINK: "yes"
+    HDRCK: "frama-c-hdrck"
   script:
     - nix-shell nix/pkgs.nix -A ocaml-ng.ocamlPackages_$OCAML.frama-c-checkers-shell
         --run 'autoconf && ./devel_tools/make-distrib.sh'
@@ -32,7 +36,7 @@ build-distrib-tarball:
     - nix
   artifacts:
     paths:
-      - frama-c.tar.gz
+      - ./*.tar.gz
     expire_in: 1 week
 
 check-no-old-frama-c:
@@ -240,12 +244,11 @@ manuals:
 #     OCAML: "4_13"
 #   <<: *ocaml
 
-
 src-distrib-tests:
   stage: distrib_and_compatibility
   script:
-    - mkdir extracted && tar -xzf frama-c.tar.gz -C ./extracted
-    - nix-build extracted/frama-c/nix/pkgs.nix -A ocaml-ng.ocamlPackages_$OCAML.src-distrib-tests
+    - mkdir extracted && tar -xzf frama-c.tar.gz --strip-components 1 -C ./extracted
+    - nix-build extracted/nix/pkgs.nix -A ocaml-ng.ocamlPackages_$OCAML.src-distrib-tests
   tags:
     - nix
 
diff --git a/devel_tools/make-distrib.sh b/devel_tools/make-distrib.sh
index 840704c4706..42fd20c9282 100755
--- a/devel_tools/make-distrib.sh
+++ b/devel_tools/make-distrib.sh
@@ -28,21 +28,107 @@ if [ ! -f configure ] ; then
   exit 2
 fi
 
-EXTERNAL_PLUGINS=$(find src/plugins -type d -name ".git" | sed "s/.git//")
+################################################################################
+# Configuration
 
-FRAMAC="frama-c.tar"
-git archive HEAD -o $FRAMAC --prefix "frama-c/"
+if [ -z ${OPEN_SOURCE+x} ]; then
+  echo "OPEN_SOURCE variable not set, defaults to 'no'"
+  OPEN_SOURCE="no"
+fi
+
+if [ -z ${HDRCK+x} ]; then
+  HDRCK="dune exec -- frama-c-hdrck"
+fi
+
+if [ -z ${VERSION+x} ]; then
+  VERSION=$(cat VERSION | sed "s,~,-,")
+fi
+
+if [ -z ${VERSION_CODENAME+x} ]; then
+  VERSION_CODENAME=$(cat VERSION_CODENAME)
+fi
+
+if [ -z ${CI_LINK+x} ]; then
+  CI_LINK="no"
+fi
 
-ACC=$FRAMAC
+FRAMAC="frama-c-$VERSION-$VERSION_CODENAME"
+FRAMAC_TAR="$FRAMAC.tar"
+
+################################################################################
+# Prepare archive
+
+
+git archive HEAD -o $FRAMAC_TAR --prefix "$FRAMAC/"
+
+TAR_ACC=$FRAMAC_TAR
+
+EXTERNAL_PLUGINS=$(find src/plugins -type d -name ".git" | sed "s/\/.git//")
 
 for plugin in $EXTERNAL_PLUGINS ; do
    TAR="$(basename $plugin).tar"
-   git -C $plugin archive HEAD -o $TAR --prefix "frama-c/$plugin/"
-   ACC="$ACC $plugin$TAR"
+   git -C $plugin archive HEAD -o $TAR --prefix "$FRAMAC/$plugin/"
+   TAR_ACC="$TAR_ACC $plugin/$TAR"
+done
+
+tar --concatenate --file=$TAR_ACC
+tar rf $FRAMAC_TAR configure --transform "s,^,$FRAMAC/,"
+
+################################################################################
+# Prepare header options
+
+if [[ "$OPEN_SOURCE" == "yes" ]]; then
+  HEADER_KIND="open-source"
+  HEADER_OPT=
+else
+  HEADER_KIND="close-source"
+  HEADER_OPT="-update"
+fi
+
+################################################################################
+# Prepare header spec
+
+HEADER_SPEC="header-spec.txt"
+git ls-files -z | git check-attr --stdin -z header_spec > $HEADER_SPEC
+
+HEADER_DIRS="-header-dirs headers/$HEADER_KIND"
+
+for plugin in $EXTERNAL_PLUGINS ; do
+  git -C $plugin ls-files -z |\
+  git -C $plugin check-attr --stdin -z header_spec |\
+  xargs --null -n3 printf "$plugin/%s\n%s\n%s\n" |\
+  tr '\n' '\0' >> $HEADER_SPEC
 done
 
-tar --concatenate --file=$ACC
-tar rf $FRAMAC configure --transform 's,^,frama-c/,'
-gzip -9 < $FRAMAC > $FRAMAC.gz
+PLUGINS=$(find src/plugins -type d -mindepth 1 -maxdepth 1)
+
+for plugin in $PLUGINS ; do
+  HEADER_DIRS="$HEADER_DIRS -header-dirs $plugin/headers/$HEADER_KIND"
+done
+
+################################################################################
+# Headers
+
+TMP_DIR=$(mktemp -d)
+echo $TMP_DIR
+tar xf $FRAMAC_TAR -C $TMP_DIR
+
+$HDRCK $HEADER_OPT $HEADER_DIRS -spec-format="3-zeros" -C "$TMP_DIR/$FRAMAC" $HEADER_SPEC
+echo $VERSION > $TMP_DIR/$FRAMAC/VERSION
+echo $VERSION_CODENAME > $TMP_DIR/$FRAMAC/VERSION_CODENAME
+
+################################################################################
+# Finalize archive
+
+tar czf $FRAMAC_TAR.gz -C $TMP_DIR $FRAMAC
+
+if [[ "$CI_LINK" == "yes" ]]; then
+  ln $FRAMAC_TAR.gz "frama-c.tar.gz"
+fi
+
+################################################################################
+# Cleaning
 
-rm -f $ACC
+rm -rf $HEADER_SPEC
+rm -rf $TAR_ACC
+rm -rf $TMP_DIR
-- 
GitLab