summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gnu/local.mk2
-rw-r--r--gnu/packages/pascal.scm215
-rw-r--r--gnu/packages/patches/fpc-reproducibility.patch28
3 files changed, 245 insertions, 0 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index d956e52d97..8854698178 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -414,6 +414,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/package-management.scm		\
   %D%/packages/pantheon.scm			\
   %D%/packages/parallel.scm			\
+  %D%/packages/pascal.scm			\
   %D%/packages/password-utils.scm		\
   %D%/packages/patchutils.scm			\
   %D%/packages/pciutils.scm			\
@@ -962,6 +963,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/foomatic-filters-CVE-2015-8327.patch	\
   %D%/packages/patches/foomatic-filters-CVE-2015-8560.patch	\
   %D%/packages/patches/fontconfig-hurd-path-max.patch		\
+  %D%/packages/patches/fpc-reproducibility.patch		\
   %D%/packages/patches/freedink-engine-fix-sdl-hints.patch	\
   %D%/packages/patches/freeimage-unbundle.patch		\
   %D%/packages/patches/fuse-overlapping-headers.patch				\
diff --git a/gnu/packages/pascal.scm b/gnu/packages/pascal.scm
new file mode 100644
index 0000000000..1353e8adfd
--- /dev/null
+++ b/gnu/packages/pascal.scm
@@ -0,0 +1,215 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Kei Kebreau <address@hidden>
+;;;
+;;; 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 commencement)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages gcc)
+  #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages xml)
+  #:use-module (ice-9 match))
+
+(define fpc-bootstrap-i386-3.0.4
+  (origin
+    (method url-fetch)
+    (uri
+     "mirror://sourceforge/freepascal/Linux/3.0.4/fpc-3.0.4.i386-linux.tar")
+    (sha256
+     (base32
+      "05xfgxa6vb0y2ryfsgn21m2kwaxhci6l2zxa3akvlnqminjsjvda"))))
+
+(define fpc-bootstrap-x86_64-3.0.4
+  (origin
+    (method url-fetch)
+    (uri
+     "mirror://sourceforge/freepascal/Linux/3.0.4/fpc-3.0.4.x86_64-linux.tar")
+    (sha256
+     (base32
+      "0xzxh689iyjfmkqkhcqg9plrjmdx82hbyywyyc7jm0n92fpmp5ky"))))
+
+(define-public fpc
+  (package
+    (name "fpc")
+    (version "3.2.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
+                "0f38glyn3ffmqww432snhx2b8wyrq0yj1njkp4zh56lqrvm19fgr"))
+              (patches (search-patches "fpc-reproducibility.patch"))
+              (modules '((guix build utils)))
+              (snippet
+               '(begin
+                  (rename-file "install/doc" "install-doc")
+                  (rename-file "install/man" "install-man")
+                  ;; Contains executables--some of them created by
+                  ;; closed-source compilers.
+                  (delete-file-recursively "install")
+                  (mkdir-p "install")
+                  (rename-file "install-doc" "install/doc")
+                  (rename-file "install-man" "install/man")
+                  (delete-file "fpcsrc/tests/utils/dosbox/exitcode.exe")
+                  #t))))
+    (build-system gnu-build-system)
+    (supported-systems '("i686-linux" "x86_64-linux"))
+    (inputs
+     `(("expat" ,expat)
+       ("glibc" ,glibc)
+       ("ld-wrapper" ,ld-wrapper)
+       ("ncurses" ,ncurses)
+       ("zlib" ,zlib)))
+    (native-inputs
+     ;; FPC is built with FPC, so we need bootstrap binaries.
+     `(("fpc-binary"
+        ,(match (or (%current-target-system)
+                    (%current-system))
+          ("i686-linux" fpc-bootstrap-i386-3.0.4)
+          ;("powerpc64le-linux" fpc-bootstrap-ppc64le-3.0.4)
+          ;("powerpc-linux" fpc-bootstrap-ppc-3.0.4)
+          ("x86_64-linux" fpc-bootstrap-x86_64-3.0.4)
+          (_ fpc-bootstrap-x86_64-3.0.4)))))
+    (arguments
+     `(#:tests? #f ; no tests available
+       #:phases
+       (let ((fpc-bootstrap-path
+              (string-append (getcwd) "/" ,name "-" ,version "/fpc-bin"))
+             (arch ,(match (or (%current-target-system)
+                               (%current-system))
+                     ("i686-linux" "i386")
+                     ("x86_64-linux" "x86_64")
+                     (_ "unknown"))))
+         (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
+                 (invoke "tar" "xvf" (assoc-ref inputs "fpc-binary")))))
+           (add-after 'unpack-bin 'install-bin
+             (lambda* (#:key inputs #:allow-other-keys)
+               (with-directory-excursion
+                 (string-append fpc-bootstrap-path "/fpc-3.0.4."
+                                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")))
+                   ;; Only the base compiler and fpcmake are needed.
+                   (invoke "tar" "xvf" binary-tarball compiler-tarball
+                           fpcmake-tarball)
+                   (invoke "tar" "xvf" compiler-tarball "-C..")
+                   (invoke "tar" "xvf" fpcmake-tarball "-C..")))))
+           (add-after 'patch-source-shebangs 'patch-inline-shebangs
+             (lambda _
+               (substitute* "fpcsrc/compiler/cscript.pas"
+                 (("#!/bin/sh") (string-append "#!" (which "sh"))))
+               #t))
+           (replace 'configure
+             (lambda* (#:key inputs outputs #: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)))
+                 ; TODO: /lib/ld-linux-armhf.so.3
+                 ; TODO: /lib/ld-linux-aarch64.so.1
+                 ; TODO: /lib64/ld64.so.2
+                 ;; Add glibc to ld's search path.
+                 (("if \\(isdll\\) then")
+                  (string-append
+                   "Add('SEARCH_DIR(\""
+                   (assoc-ref inputs "libc") "/lib"
+                   "\")');\n"
+                   "if (isdll) then")))
+               (substitute* "fpcsrc/compiler/options.pas"
+                 (("exepath\\+'../etc/'")
+                  (string-append "'" (assoc-ref outputs "out") "/etc'")))
+               #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/3.0.4"))
+                 (setenv "FPC" fpc)
+                 ;; Specify target operating system using "-T" option
+                 (invoke fpcmake (string-append "-T" arch "-linux"))
+                 (invoke "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)))
+                 (invoke "make" "install" "NOGDB=1"
+                         (string-append "INSTALL_PREFIX=" out))
+                 ;; Remove files that fail RUNPATH validation.
+                 ;; TODO: Fix it instead.
+                 (delete-file (string-append out "/lib/libpas2jslib.so"))
+                 ;; 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"))
+                 (invoke
+                   (string-append out "/lib/fpc/" ,version "/samplecfg")
+                   (string-append out "/lib/fpc/" ,version)
+                   (string-append out "/etc")))))
+           (add-after 'install 'wrap
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (let* ((out (assoc-ref outputs "out"))
+                      (fpc (string-append out "/bin/fpc"))
+                      (ld (assoc-ref inputs "ld-wrapper"))
+                      (glibc (assoc-ref inputs "glibc")))
+                 (wrap-program fpc
+                   `("PATH" ":" prefix (,(string-append ld "/bin")))
+                   `("LIBRARY_PATH" ":" prefix (,(string-append glibc "/lib"))))
+                 #t)))))))
+    ;; fpc invokes gcc, so make sure LIBRARY_PATH et.al are set.
+    ;(native-search-paths (package-native-search-paths gcc))
+    (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 0000000000..619f42b3b5
--- /dev/null
+++ b/gnu/packages/patches/fpc-reproducibility.patch
@@ -0,0 +1,28 @@
+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;