From a13b0cdcad51eb25153919c5498a5d686d9f70cc Mon Sep 17 00:00:00 2001 From: Matthew Jordan Date: Tue, 17 May 2016 11:47:28 -0400 Subject: [PATCH] gnu: Add go. * gnu/packages/golang.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Modified file. Co-authored by: Efraim Flashner --- gnu/local.mk | 1 + gnu/packages/golang.scm | 379 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 380 insertions(+) create mode 100644 gnu/packages/golang.scm diff --git a/gnu/local.mk b/gnu/local.mk index 4bbded9..346ed5a 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -147,6 +147,7 @@ GNU_SYSTEM_MODULES = \ gnu/packages/gnustep.scm \ gnu/packages/gnuzilla.scm \ gnu/packages/gnu-pw-mgr.scm \ + gnu/packages/golang.scm \ gnu/packages/gperf.scm \ gnu/packages/gprolog.scm \ gnu/packages/gps.scm \ diff --git a/gnu/packages/golang.scm b/gnu/packages/golang.scm new file mode 100644 index 0000000..c2e95a8 --- /dev/null +++ b/gnu/packages/golang.scm @@ -0,0 +1,379 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2015, 2016 Efraim Flashner +;;; Copyright © 2016 Matthew Jordan +;;; +;;; This file is an addendum 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 . + +(define-module (gnu packages golang) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix utils) + #:use-module (guix download) + #:use-module (guix packages) + #:use-module (guix build-system gnu) + #:use-module (gnu packages admin) + #:use-module (gnu packages rc) + #:use-module (gnu packages gcc) + #:use-module (gnu packages base) + #:use-module (gnu packages perl) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages pcre) + #:use-module (srfi srfi-1)) + +;; According to https://golang.org/doc/install/gccgo, gccgo-4.8.2 includes a +;; complete go-1.1.2 implementation, gccgo-4.9 includes a complete go-1.2 +;; implementation, and gccgo-5 a complete implementation of go-1.4. Ultimately +;; we hope to build go-1.5+ with a bootstrap process using gccgo-5. As of +;; go-1.5, go cannot be bootstrapped without go-1.4, so we need to use go-1.4 or +;; gccgo-5. Mips is not officially supported, but it should work if it is +;; bootstrapped. + +(define-public go-1.4 + (package + (name "go") + (version "1.4.3") + (source + (origin + (method url-fetch) + (uri (string-append "https://storage.googleapis.com/golang/" + name version ".src.tar.gz")) + (sha256 + (base32 + "0na9yqilzpvq0bjndbibfp07wr796gf252y471cip10bbdqgqiwr")))) + (build-system gnu-build-system) + (outputs '("out" + "doc" + "tests")) + (arguments + `(#:phases + (modify-phases %standard-phases + (delete 'configure) + ;; figure out how to set LD_LIBRARY_PATH in gcc@4.9:lib + (delete 'validate-runpath) + (add-after 'patch-generated-file-shebangs 'chdir + (lambda _ (chdir "src"))) + (add-before 'build 'prebuild + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((gccgo (assoc-ref inputs "gccgo")) + (gcclib (string-append (assoc-ref inputs "gcc:lib") "/lib")) + (ld (string-append + (assoc-ref inputs "glibc") "/lib")) + (loader (car (find-files ld "^ld-linux.+"))) + (libgcc (string-append (assoc-ref inputs "gcc:lib") "/lib")) + (net-base (assoc-ref inputs "net-base")) + (tzdata-path + (string-append (assoc-ref inputs "tzdata") "/share/zoneinfo")) + (output (assoc-ref outputs "out"))) + ;; Disabling net/ tests + (for-each + (lambda (srcfile) + (let ((srcfile (string-append "net/" srcfile))) + (if (file-exists? srcfile) + (delete-file srcfile)))) + '("multicast_test.go" "parse_test.go" "port_test.go")) + (substitute* "os/os_test.go" + (("/usr/bin") (getcwd)) + (("/bin/pwd") (which "pwd"))) + ;; Disable the unix socket test + (system* "sed" "-i" "/TestShutdownUnix/areturn" "net/net_test.go") + ;; Disable network timeout test + (system* "sed" "-i" "/TestDialTimeout/areturn" "net/dial_test.go") + ;; Disable the hostname test + (system* "sed" "-i" "/TestHostname/areturn" "os/os_test.go") + ;; ParseInLocation fails the test + (system* "sed" "-i" "/TestParseInSydney/areturn" "time/format_test.go") + (system* "sed" "-i" "/TestEcho/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestCommandRelativeName/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestCatStdin/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestCatGoodAndBadFile/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestExitStatus/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestPipes/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestStdinClose/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestPassFD(/areturn" "syscall/syscall_unix_test.go") + (system* "sed" "-i" "/TestExtraFiles/areturn" "os/exec/exec_test.go") + (substitute* "net/lookup_unix.go" + (("/etc/protocols") (string-append net-base "/etc/protocols"))) + (substitute* "time/zoneinfo_unix.go" + (("/usr/share/zoneinfo/") tzdata-path)) + (substitute* + (find-files "cmd" "asm.c") + (("/lib/ld-linux.*\\.so\\.[0-9]") loader))))) + (replace 'build + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((gccgo (assoc-ref inputs "gccgo")) + (output (assoc-ref outputs "out"))) + (setenv "CC" (which "gcc")) + (setenv "GOOS" "linux") + (setenv "GOROOT" (getcwd)) + (setenv "GOROOT_BOOTSTRAP" gccgo) + (setenv "GOROOT_FINAL" output) + ;; figure out how to set LD_LIBRARY_PATH in gcc@4.9:lib + (setenv "LD_LIBRARY_PATH" (getenv "LIBRARY_PATH")) + (setenv "CGO_ENABLED" "1") + (zero? (system* "sh" "all.bash"))))) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((output (assoc-ref outputs "out")) + (docs (assoc-ref outputs "doc")) + (tests (assoc-ref outputs "tests"))) + (copy-recursively "../test" tests) + (delete-file-recursively "../test") + (copy-recursively "../api" (string-append docs "/api")) + (delete-file-recursively "../api") + (copy-recursively "../doc" (string-append docs "/doc")) + (delete-file-recursively "../doc") + (copy-recursively "../" output))))) + #:tests? #f)) + (inputs + `(("which" ,which) + ("tzdata" ,tzdata) + ("pkg-config" ,%pkg-config) + ("pcre" ,pcre))) + (native-inputs + `(("gccgo" ,gccgo-4.9) + ("gcc:out" ,gcc-4.9 "out") + ("net-base" ,net-base) + ("rc" ,rc) + ("perl" ,perl))) + (propagated-inputs + `(("gcc:lib" ,gcc-4.9 "lib") + ("glibc" ,glibc))) + (home-page "https://golang.org/") + (synopsis "Compiled, statically typed language developed by Google") + (description "Go, also commonly referred to as golang, is a programming + language developed at Google. Designed primarily for systems programming, it + is a compiled, statically typed language in the tradition of C and C++, with +garbage collection, various safety features and in the style of communicating +sequential processes (CSP) concurrent programming features added.") + (license license:bsd-3))) + +(define-public go-1.5 + (package + (inherit go-1.4) + (name "go") + (version "1.5.4") + (source + (origin + (method url-fetch) + (uri (string-append "https://storage.googleapis.com/golang/" + name version ".src.tar.gz")) + (sha256 + (base32 + "14xwn2pr3g4i1h8qpyrjjdmq1pgvzkagk4aqsp841hfxwyyclah0")))) + (arguments + `(#:phases + (modify-phases %standard-phases + (delete 'configure) + ;; figure out how to set LD_LIBRARY_PATH in gcc@4.9:lib + (delete 'validate-runpath) + (add-after 'patch-generated-file-shebangs 'chdir + (lambda _ (chdir "src"))) + (add-before 'build 'prebuild + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((gccgo (assoc-ref inputs "gccgo")) + (gcclib (string-append (assoc-ref inputs "gcc:lib") "/lib")) + (ld (string-append + (assoc-ref inputs "glibc") "/lib")) + (loader (car (find-files ld "^ld-linux.+"))) + (libgcc (string-append (assoc-ref inputs "gcc:lib") "/lib")) + (net-base (assoc-ref inputs "net-base")) + (tzdata-path + (string-append (assoc-ref inputs "tzdata") "/share/zoneinfo")) + (output (assoc-ref outputs "out"))) + ;; Disabling net/ tests + (for-each + (lambda (srcfile) + (let ((srcfile (string-append "net/" srcfile))) + (if (file-exists? srcfile) + (delete-file srcfile)))) + '("multicast_test.go" "parse_test.go" "port_test.go")) + (substitute* "os/os_test.go" + (("/usr/bin") (getcwd)) + (("/bin/pwd") (which "pwd"))) + ;; Disable the unix socket test + (system* "sed" "-i" "/TestShutdownUnix/areturn" "net/net_test.go") + ;; Disable network timeout test + (system* "sed" "-i" "/TestDialTimeout/areturn" "net/dial_test.go") + ;; Disable the hostname test + (system* "sed" "-i" "/TestHostname/areturn" "os/os_test.go") + ;; ParseInLocation fails the test + (system* "sed" "-i" "/TestParseInSydney/areturn" "time/format_test.go") + (system* "sed" "-i" "/TestEcho/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestCommandRelativeName/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestCatStdin/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestCatGoodAndBadFile/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestExitStatus/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestPipes/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestStdinClose/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestIgnorePipeErrorOnSuccess/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestPassFD(/areturn" "syscall/syscall_unix_test.go") + (system* "sed" "-i" "/TestExtraFiles/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestIPv4MulticastListener(/areturn" "net/listen_test.go") + (system* "sed" "-i" "/TestCloneNEWUSERAndRemapNoRootDisableSetgroups/areturn" "syscall/exec_linux_test.go") + + (substitute* "net/lookup_unix.go" + (("/etc/protocols") (string-append net-base "/etc/protocols"))) + (substitute* "time/zoneinfo_unix.go" + (("/usr/share/zoneinfo/") tzdata-path)) + (substitute* + (find-files "cmd" "asm.c") + (("/lib/ld-linux.*\\.so\\.[0-9]") loader))))) + (replace 'build + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((gccgo (assoc-ref inputs "gccgo")) + (output (assoc-ref outputs "out"))) + (setenv "CC" (which "gcc")) + (setenv "GOOS" "linux") + (setenv "GOROOT" (getcwd)) + (setenv "GOROOT_BOOTSTRAP" gccgo) + (setenv "GOROOT_FINAL" output) + ;; figure out how to set LD_LIBRARY_PATH in gcc@4.9:lib + (setenv "LD_LIBRARY_PATH" (getenv "LIBRARY_PATH")) + (setenv "CGO_ENABLED" "1") + (zero? (system* "sh" "all.bash"))))) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((output (assoc-ref outputs "out")) + (docs (assoc-ref outputs "doc")) + (tests (assoc-ref outputs "tests"))) + (copy-recursively "../test" tests) + (delete-file-recursively "../test") + (copy-recursively "../api" (string-append docs "/api")) + (delete-file-recursively "../api") + (copy-recursively "../doc" (string-append docs "/doc")) + (delete-file-recursively "../doc") + (copy-recursively "../" output))))) + #:tests? #f)) + (native-inputs + `(("gccgo" ,go-1.4) + ,@(alist-delete "gccgo" (package-native-inputs go-1.4)))))) + +(define-public go + (package + (inherit go-1.4) + (name "go") + (version "1.6.2") + (source + (origin + (method url-fetch) + (uri (string-append "https://storage.googleapis.com/golang/" + name version ".src.tar.gz")) + (sha256 + (base32 + "1k5wy5ijll5aacj1m6xxnjfjw6x9f255ml3f1jiicw031mshnyvq")))) ;; 1.6.2 + ;; "0ipivhc34df8h439h5d81m0h1jz0gsy71m67ljrgk6rswj6cwv59")))) ;; 1.6 + ;; "0gqrlzd6c2k9rqiq7zr4pzq8dcj4zakjc2gmzj52kcjixv6m6jqx")))) ;; 1.6.1 + (arguments + `(#:phases + (modify-phases %standard-phases + (delete 'configure) + ;; figure out how to set LD_LIBRARY_PATH in gcc@4.9:lib + (delete 'validate-runpath) + (add-after 'patch-generated-file-shebangs 'chdir + (lambda _ (chdir "src"))) + (add-before 'build 'prebuild + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((gccgo (assoc-ref inputs "gccgo")) + (gcclib (string-append (assoc-ref inputs "gcc:lib") "/lib")) + (ld (string-append + (assoc-ref inputs "glibc") "/lib")) + (loader (car (find-files ld "^ld-linux.+"))) + (libgcc (string-append (assoc-ref inputs "gcc:lib") "/lib")) + (net-base (assoc-ref inputs "net-base")) + (tzdata-path + (string-append (assoc-ref inputs "tzdata") "/share/zoneinfo")) + (output (assoc-ref outputs "out"))) + (for-each + (lambda (srcfile) + (let ((srcfile (string-append "net/" srcfile))) + (if (file-exists? srcfile) + (delete-file srcfile)))) + '("listen_test.go" "parse_test.go")) + ;; '("multicast_test.go" "parse_test.go" "port_test.go")) + ;; (delete-file "syscall/exec_linux_test.go") + (substitute* "os/os_test.go" + (("/usr/bin") (getcwd)) + (("/bin/pwd") (which "pwd"))) + ;; Disable the unix socket test + (system* "sed" "-i" "/TestShutdownUnix/areturn" "net/net_test.go") + ;; Disable network timeout test + (system* "sed" "-i" "/TestDialTimeout/areturn" "net/dial_test.go") + ;; Disable the hostname test + (system* "sed" "-i" "/TestHostname/areturn" "os/os_test.go") + ;; ParseInLocation fails the test + (system* "sed" "-i" "/TestParseInSydney/areturn" "time/format_test.go") + (system* "sed" "-i" "/TestEcho/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestCommandRelativeName/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestCatStdin/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestCatGoodAndBadFile/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestExitStatus/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestPipes/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestStdinClose/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestIgnorePipeErrorOnSuccess/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" "/TestPassFD(/areturn" "syscall/syscall_unix_test.go") + (system* "sed" "-i" "/TestExtraFiles/areturn" "os/exec/exec_test.go") + ;; (system* "sed" "-i" "/TestIPv4MulticastListener(/areturn" "net/listen_test.go") + (system* "sed" "-i" "/TestCloneNEWUSERAndRemapNoRootDisableSetgroups/areturn" "syscall/exec_linux_test.go") + (system* "sed" "-i" "/TestLookupPort/areturn" "net/lookup_test.go") + (system* "sed" "-i" "/TestOutputStderrCapture/areturn" "os/exec/exec_test.go") + (system* "sed" "-i" ",src/cmd/api/run.go,ireturn nil" "cmd/dist/test.go") + (system* "sed" "-i" ",TestCoverageWithCgo,areturn" "cmd/go/go_test.go") + + ;; fix shebang for testar script + (substitute* "../misc/cgo/testcarchive/test.bash" + (("#!/usr/bin/env") (string-append "#!" (which "env")))) + (substitute* "net/lookup_unix.go" + (("/etc/protocols") (string-append net-base "/etc/protocols"))) + (substitute* "net/port_unix.go" + (("/etc/services") (string-append net-base "/etc/services"))) + (substitute* "time/zoneinfo_unix.go" + (("/usr/share/zoneinfo/") tzdata-path)) + (substitute* + (find-files "cmd" "asm.c") + (("/lib/ld-linux.*\\.so\\.[0-9]") loader))))) + (replace 'build + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((gccgo (assoc-ref inputs "gccgo")) + (output (assoc-ref outputs "out"))) + (setenv "CC" "gcc") + (setenv "GOOS" "linux") + (setenv "GOROOT" (string-append (getcwd) "../")) + (setenv "GOROOT_BOOTSTRAP" gccgo) + (setenv "GOROOT_FINAL" output) + (setenv "GOGC" "400") + (setenv "PATH" + (string-append + (getenv "GOROOT_FINAL") "/bin:" + (getenv "GOROOT") "/bin:" (getenv "PATH"))) + ;; figure out how to set LD_LIBRARY_PATH in gcc@4.9:lib + (setenv "LD_LIBRARY_PATH" (getenv "LIBRARY_PATH")) + (setenv "CGO_ENABLED" "1") + (zero? (system* "sh" "make.bash"))))) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((output (assoc-ref outputs "out")) + (docs (assoc-ref outputs "doc")) + (tests (assoc-ref outputs "tests"))) + (copy-recursively "../test" tests) + (delete-file-recursively "../test") + (copy-recursively "../api" (string-append docs "/api")) + (delete-file-recursively "../api") + (copy-recursively "../doc" (string-append docs "/doc")) + (delete-file-recursively "../doc") + (copy-recursively "../" output))))) + #:tests? #f)) + (native-inputs + `(("gccgo" ,go-1.4) + ,@(alist-delete "gccgo" (package-native-inputs go-1.4)))))) -- 2.7.4