Kei Kebreau <k...@openmailbox.org> writes:

> This is a patch that adds a package for the Free Pascal Compiler.
> Can someone verify that this builds reproducibly on an i386 machine?

This update allows the compiler to find its configuration file.
From 10b52891b6fd522231081e5735ce5287060dff21 Mon Sep 17 00:00:00 2001
From: Kei Kebreau <k...@openmailbox.org>
Date: Thu, 26 Jan 2017 22:58:22 -0500
Subject: [PATCH] gnu: Add fpc.

* gnu/packages/pascal.scm: New file.
* gnu/packages/patches/fpc-reproducibility.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add pascal.scm.
(dist_patch_DATA): Register patch.
---
 gnu/local.mk                                   |   4 +-
 gnu/packages/pascal.scm                        | 173 +++++++++++++++++++++++++
 gnu/packages/patches/fpc-reproducibility.patch |  39 ++++++
 3 files changed, 215 insertions(+), 1 deletion(-)
 create mode 100644 gnu/packages/pascal.scm
 create mode 100644 gnu/packages/patches/fpc-reproducibility.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 59fc1a82c..fb24f32fb 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -4,7 +4,7 @@
 # Copyright © 2016 Mathieu Lirzin <m...@gnu.org>
 # Copyright © 2013, 2014, 2015, 2016 Mark H Weaver <m...@netris.org>
 # Copyright © 2016 Chris Marusich <cmmarus...@gmail.com>
-# Copyright © 2016 Kei Kebreau <k...@openmailbox.org>
+# Copyright © 2016, 2017 Kei Kebreau <k...@openmailbox.org>
 # Copyright © 2016 Rene Saavedra <ren...@openmailbox.org>
 # Copyright © 2016 Adonay "adfeno" Felipe Nogueira 
<https://libreplanet.org/wiki/User:Adfeno> <adf...@openmailbox.org>
 # Copyright © 2016, 2017 Ricardo Wurmus <rek...@elephly.net>
@@ -290,6 +290,7 @@ GNU_SYSTEM_MODULES =                                \
   %D%/packages/ots.scm                         \
   %D%/packages/package-management.scm          \
   %D%/packages/parallel.scm                    \
+  %D%/packages/pascal.scm                      \
   %D%/packages/password-utils.scm              \
   %D%/packages/patchutils.scm                  \
   %D%/packages/pciutils.scm                    \
@@ -554,6 +555,7 @@ dist_patch_DATA =                                           
\
   %D%/packages/patches/fltk-shared-lib-defines.patch           \
   %D%/packages/patches/fltk-xfont-on-demand.patch              \
   %D%/packages/patches/fontforge-svg-modtime.patch             \
+  %D%/packages/patches/fpc-reproducibility.patch               \
   %D%/packages/patches/freeimage-CVE-2015-0852.patch           \
   %D%/packages/patches/freeimage-CVE-2016-5684.patch           \
   %D%/packages/patches/gawk-shell.patch                                \
diff --git a/gnu/packages/pascal.scm b/gnu/packages/pascal.scm
new file mode 100644
index 000000000..7b9b6aa5c
--- /dev/null
+++ b/gnu/packages/pascal.scm
@@ -0,0 +1,173 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Kei Kebreau <k...@openmailbox.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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.
+;;;
+;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages pascal)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages bootstrap)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages xml))
+
+(define fpc-bootstrap-x86_64-3.0.0
+  (origin
+    (method url-fetch)
+    (uri
+     "mirror://sourceforge/freepascal/Linux/3.0.0/fpc-3.0.0.x86_64-linux.tar")
+    (sha256
+     (base32
+      "1m2xx3nda45cb3zidbjgdr8kddd19zk0khvp7xxdlclszkqscln9"))))
+
+(define fpc-bootstrap-i386-3.0.0
+  (origin
+    (method url-fetch)
+    (uri
+     "mirror://sourceforge/freepascal/Linux/3.0.0/fpc-3.0.0.i386-linux.tar")
+    (sha256
+     (base32
+      "0h3f1dgs1zsx7vvk9kg67anjvgw5sslfbmjblif7ishbcp3k3g5k"))))
+
+(define-public fpc
+  (let ((arch (if (string-prefix? "x86_64" (or (%current-target-system)
+                                               (%current-system)))
+                  "x86_64"
+                  "i386")))
+    (package
+      (name "fpc")
+      (version "3.0.0")
+      (source (origin
+                (method url-fetch)
+                (uri (string-append "mirror://sourceforge/freepascal/Source/"
+                                    version "/fpcbuild-" version ".tar.gz"))
+                (file-name (string-append name "-" version ".tar.gz"))
+                (sha256
+                 (base32
+                  "1v40bjp0kvsi8y0mndqvvhnsqjfssl2w6wpfww51j4rxblfkp4fm"))
+                (patches (search-patches "fpc-reproducibility.patch"))))
+      (build-system gnu-build-system)
+      (supported-systems '("i686-linux" "x86_64-linux"))
+      (inputs
+       `(("expat" ,expat)
+         ("ncurses" ,ncurses)
+         ("zlib" ,zlib)))
+      (native-inputs
+       ;; FPC is built with FPC, so we need bootstrap binaries.
+       `(("fpc-binary"
+          ,(if (string= arch "x86_64")
+               fpc-bootstrap-x86_64-3.0.0
+               fpc-bootstrap-i386-3.0.0))))
+      (arguments
+       `(#:tests? #f ; no tests available
+         #:phases
+         (let ((fpc-bootstrap-path
+                (string-append (getcwd) "/" ,name "-" ,version "/fpc-bin")))
+           (modify-phases %standard-phases
+             (add-after 'unpack 'unpack-bin
+               (lambda* (#:key inputs #:allow-other-keys)
+                 (mkdir-p fpc-bootstrap-path)
+                 (with-directory-excursion fpc-bootstrap-path
+                   (copy-file (assoc-ref inputs "fpc-binary")
+                              "fpc-bin.tar")
+                   (zero? (system* "tar" "xvf" "fpc-bin.tar")))))
+             (add-after 'unpack-bin 'install-bin
+               (lambda* (#:key inputs #:allow-other-keys)
+                 (with-directory-excursion
+                     (string-append fpc-bootstrap-path "/fpc-" ,version "."
+                                    ,arch "-linux")
+                   (let ((binary-tarball
+                          (string-append "binary." ,arch "-linux.tar"))
+                         (compiler-tarball
+                          (string-append "base." ,arch "-linux.tar.gz"))
+                         (fpcmake-tarball
+                          (string-append "utils-fpcm." ,arch "-linux.tar.gz")))
+                     (and
+                      ;; Only the base compiler and fpcmake are needed.
+                      (zero? (system* "tar" "xvf" binary-tarball
+                                      compiler-tarball
+                                      fpcmake-tarball))
+                      (zero? (system* "tar" "xvf" compiler-tarball "-C.."))
+                      (zero? (system* "tar" "xvf" fpcmake-tarball "-C..")))))))
+             (replace 'configure
+               (lambda* (#:key inputs #:allow-other-keys)
+                 (substitute* "fpcsrc/compiler/systems/t_linux.pas"
+                   ;; Point to the current glibc dynamic linker.
+                   (("/lib/ld-linux.so.2")
+                    (string-append (assoc-ref inputs "libc")
+                                   ,(glibc-dynamic-linker)))
+                   (("/lib64/ld-linux-x86-64.so.2")
+                    (string-append (assoc-ref inputs "libc")
+                                   ,(glibc-dynamic-linker)))
+                   ;; Add glibc to ld's search path.
+                   (("if \\(isdll\\) then")
+                    (string-append
+                     "Add('SEARCH_DIR(\""
+                     (assoc-ref inputs "libc") "/lib"
+                     "\")');\n"
+                     "if (isdll) then")))
+                 #t))
+             (replace 'build
+               (lambda* (#:key inputs #:allow-other-keys)
+                 (let* ((fpc-bin (string-append fpc-bootstrap-path "/bin"))
+                        (fpc (string-append fpc-bin "/fpc"))
+                        (fpcmake (string-append fpc-bin "/fpcmake")))
+                   ;; The fpc binary needs to run the ppc[arch] binary (which
+                   ;; does the actual compiling) in this directory.
+                   (setenv "PATH"
+                          (string-append (getenv "PATH") ":"
+                                         fpc-bootstrap-path
+                                         "/lib/fpc/" ,version))
+                   (setenv "FPC" fpc)
+                   (and
+                    ;; Specify target operating system using "-T" option
+                    (zero? (system* fpcmake
+                                    (string-append "-T" ,arch "-linux")))
+                    (zero? (system* "make" "build" "NOGDB=1"))))))
+             (replace 'install
+               (lambda* (#:key outputs #:allow-other-keys)
+                 (let* ((out (assoc-ref outputs "out"))
+                       ;; This is the suffix of the ppc[arch] binary.
+                       (suffix (if (string= ,arch "x86_64")
+                                         "x64"
+                                         "386"))
+                       (ppc (string-append "ppc" suffix)))
+                   (system* "make" "install" "NOGDB=1"
+                            (string-append "INSTALL_PREFIX=" out))
+                   ;; Add a symlink to the ppc[arch] binary so fpc works.
+                   (symlink (string-append out "/lib/fpc/" ,version "/" ppc)
+                            (string-append out "/bin/" ppc))
+                   ;; Install the example configuration file.
+                   (mkdir (string-append out "/etc"))
+                   (zero?
+                    (system*
+                     (string-append out "/lib/fpc/" ,version "/samplecfg")
+                     (string-append out "/lib/fpc/" ,version)
+                     (string-append out "/etc"))))))))))
+      (home-page "http://www.freepascal.org";)
+      (synopsis "The Free Pascal Compiler")
+      (description
+       "Free Pascal is a professional Object Pascal compiler.  It supports the
+Turbo Pascal 7.0, Delphi, and Mac Pascal dialects.  Free Pascal also supports
+many useful extensions to the Pascal programming language.")
+      ;; The majority of the software included is licensed under the GPLv2
+      ;; or later.  For more licensing details, see the appropriate files in
+      ;; the install/doc directory of the source distribution.
+      (license license:gpl2+))))
diff --git a/gnu/packages/patches/fpc-reproducibility.patch 
b/gnu/packages/patches/fpc-reproducibility.patch
new file mode 100644
index 000000000..133c1d7e8
--- /dev/null
+++ b/gnu/packages/patches/fpc-reproducibility.patch
@@ -0,0 +1,39 @@
+Remove/patch metadata timestamps for reproducibility.
+
+diff -ur fpcbuild-3.0.0.old/fpcsrc/packages/fpmkunit/src/fpmkunit.pp 
fpcbuild-3.0.0/fpcsrc/packages/fpmkunit/src/fpmkunit.pp
+--- fpcbuild-3.0.0.old/fpcsrc/packages/fpmkunit/src/fpmkunit.pp        
2015-11-04 16:17:00.000000000 -0500
++++ fpcbuild-3.0.0/fpcsrc/packages/fpmkunit/src/fpmkunit.pp    2017-01-26 
16:25:29.327339282 -0500
+@@ -3779,7 +3779,7 @@
+       Values[KeyName]:=Name;
+       Values[KeyVersion]:=Version;
+       // TODO Generate checksum based on PPUs
+-      InstalledChecksum:=DateTimeToFileDate(Now);
++      InstalledChecksum:=0;
+       Values[KeyChecksum]:=IntToStr(InstalledChecksum);
+       Values[KeyCPU]:=CPUToString(ACPU);
+       Values[KeyOS]:=OSToString(AOS);
+diff -ur fpcbuild-3.0.0.old/fpcsrc/utils/fpcmkcfg/fpcmkcfg.pp 
fpcbuild-3.0.0/fpcsrc/utils/fpcmkcfg/fpcmkcfg.pp
+--- fpcbuild-3.0.0.old/fpcsrc/utils/fpcmkcfg/fpcmkcfg.pp       2013-06-01 
18:27:16.000000000 -0400
++++ fpcbuild-3.0.0/fpcsrc/utils/fpcmkcfg/fpcmkcfg.pp   2017-01-26 
16:24:22.949044903 -0500
+@@ -234,8 +234,8 @@
+   TemplateParser.Values['FPCTARGETOS'] := BuildOSTarget;
+   TemplateParser.Values['FPCBIN'] := 'fpc';
+   TemplateParser.Values['PWD'] := GetCurrentDir;
+-  TemplateParser.Values['BUILDDATE'] := DateToStr(Date);
+-  TemplateParser.Values['BUILDTIME'] := TimeToStr(Time);
++  TemplateParser.Values['BUILDDATE'] := '';
++  TemplateParser.Values['BUILDTIME'] := '';
+ 
+   TemplateParser.Values['LOCALREPOSITORY'] := GetDefaultLocalRepository;
+   TemplateParser.Values['LOCALBASEPATH'] := GetDefaultLocalBasepath;
+diff -ur fpcbuild-3.0.0.old/install/man/Makefile 
fpcbuild-3.0.0/install/man/Makefile
+--- fpcbuild-3.0.0.old/install/man/Makefile    2011-06-19 14:40:37.000000000 
-0400
++++ fpcbuild-3.0.0/install/man/Makefile        2017-01-26 16:25:55.024227566 
-0500
+@@ -31,5 +31,5 @@
+       $(GINSTALL) -d -m 755 $(INSTALL_MANDIR)/man5
+       $(GINSTALL) -c -m 644 man1/*.1 $(INSTALL_MANDIR)/man1
+       $(GINSTALL) -c -m 644 man5/*.5 $(INSTALL_MANDIR)/man5
+-      find man1/*.1 -exec gzip -9f $(INSTALL_MANDIR)/'{}' \;
+-      find man5/*.5 -exec gzip -9f $(INSTALL_MANDIR)/'{}' \;
++      find man1/*.1 -exec gzip -9fn $(INSTALL_MANDIR)/'{}' \;
++      find man5/*.5 -exec gzip -9fn $(INSTALL_MANDIR)/'{}' \;
-- 
2.11.0

Attachment: signature.asc
Description: PGP signature

Reply via email to