[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 0/3] WIP: Go-lang
From: |
Efraim Flashner |
Subject: |
Re: [PATCH 0/3] WIP: Go-lang |
Date: |
Thu, 14 Jan 2016 23:40:05 +0200 |
On Thu, 14 Jan 2016 11:14:50 -0800
Jeff Mickey <address@hidden> wrote:
> * Ludovic Courtès <address@hidden> [2016-01-14 07:08]:
> > Efraim Flashner <address@hidden> skribis:
> >
> >> It seems there's a lot of interest around getting Go packaged in Guix, so I
> >> figured I should post my work so far to the mailinglist. Currently go-1.4
> >> does not have cgo enabled, the go binary keeps on trying to link against
> >> libgcc_s.so.1 (from gcc:lib) and can't find it in the RUNPATH.
> >
> > In GCC, we have a hack that automatically adds gcc:lib to the RUNPATH
> > (look for “libgcc_s” in gcc.scm.) I guess we need to do something
> > similar here.
>
> Aha - ok, I've had the same problem! I've tried injecting it many ways
> and it doesn't work due to the intersection of libgcc_s and glibc.
>
> Efraim - can you successfully run programs that link against glibc? As
> in anything that uses os/user, net, etc? Running the tests as part of
> your build is a big way to pick up on this, I've added the following to
> my go-1.4.3 attempts in my build steps:
>
I haven't ever touched go before, trying to get it packaged was my first time
looking at it so I have no way to check.
I tried looking at Nix's go-1.4 package for inspiration, and I see they have
a lot of sed-magic to remove or modify tests that don't like being sandboxed.
FreeBSD's ports system was also great for a template.
https://svnweb.freebsd.org/ports/head/lang/go14/Makefile?view=markup
https://github.com/NixOS/nixpkgs/blob/788800e437c4a0a25d95e217540bded68804b25e/pkgs/development/compilers/go/1.4.nix
# Disabling the 'os/http/net' tests (they want files not available in
# chroot builds)
rm src/net/{multicast_test.go,parse_test.go,port_test.go}
# !!! substituteInPlace does not seems to be effective.
# The os test wants to read files in an existing path. Just don't let it be
/usr/bin.
sed -i 's,/usr/bin,'"`pwd`", src/os/os_test.go
sed -i 's,/bin/pwd,'"`type -P pwd`", src/os/os_test.go
# Disable the unix socket test
sed -i '/TestShutdownUnix/areturn' src/net/net_test.go
# Disable the hostname test
sed -i '/TestHostname/areturn' src/os/os_test.go
# ParseInLocation fails the test
sed -i '/TestParseInSydney/areturn' src/time/format_test.go
sed -i 's,/etc/protocols,${iana_etc}/etc/protocols,' src/net/lookup_unix.go
'' + lib.optionalString stdenv.isLinux ''
sed -i 's,/usr/share/zoneinfo/,${tzdata}/share/zoneinfo/,'
src/time/zoneinfo_unix.go
# Find the loader dynamically
LOADER="$(find ${libc}/lib -name ld-linux\* | head -n 1)"
# Replace references to the loader
find src/cmd -name asm.c -exec sed -i
"s,/lib/ld-linux.*\.so\.[0-9],$LOADER," {} \;
'' + lib.optionalString stdenv.isDarwin ''
sed -i 's,"/etc","'"$TMPDIR"'",' src/os/os_test.go
sed -i 's,/_go_os_test,'"$TMPDIR"'/_go_os_test,' src/os/path_test.go
sed -i '/TestRead0/areturn' src/os/os_test.go
sed -i '/TestSystemRoots/areturn' src/crypto/x509/root_darwin_test.go
sed -i '/TestDialDualStackLocalhost/areturn' src/net/dial_test.go
# remove IP resolving tests, on darwin they can find fe80::1%lo while
expecting ::1
sed -i '/TestResolveIPAddr/areturn' src/net/ipraw_test.go
sed -i '/TestResolveTCPAddr/areturn' src/net/tcp_test.go
sed -i '/TestResolveUDPAddr/areturn' src/net/udp_test.go
>
> ;; these all have specific file locations they look for
> ;; or in the case of exec_test resets the environment
> ;; before executing binaries they expect.
> (for-each delete-file '("src/net/multicast_test.go"
> "src/net/parse_test.go"
> "src/net/port_test.go"
> "src/os/exec/exec_test.go"))
> (substitute* "src/os/os_test.go"
> (("/bin/pwd") (which "pwd"))
> (("/usr/bin") (dirname (which "pwd")))
> (("TestHostname") "areturn"))
>
> ;; Disable the unix socket test
> (substitute* "src/net/net_test.go"
> (("TestShutdownUnix") "areturn"))
>
> (substitute* "src/net/lookup_unix.go"
> (("/etc/protocols") (string-append iana "protocols")))
>
> ;; ParseInLocation fails the test
> (substitute* "src/time/format_test.go"
> (("TestParseInSydney") "areturn"))
>
> (substitute* "src/time/zoneinfo_unix.go"
> (("/usr/share/zoneinfo/") tz))
>
> ;; exec.Command on os.Args[0] from go run for whatever
> ;; reason doesn't work right now. libgcc_s.so link
> ;; missing crap occurs here as well, this may require
> ;; that 6l-wrapper for go run to work.
> (substitute* "src/syscall/syscall_unix_test.go"
> (("TestPassFD") "areturn"))
>
> (substitute* "src/cmd/6l/asm.c"
> (("char linuxdynld.*$") (string-append "char linuxdynld[] = \"" ld-linux
> "\";\n")))
>
> I'll be trying this later with your packages.
>
> I'd really hesitate on packaging this without runnning the tests, as
> there are lots of ugly corner cases in go's build system.
>
> // codemac
--
Efraim Flashner <address@hidden> אפרים פלשנר
GPG key = A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted
pgplEUUmSFL1D.pgp
Description: OpenPGP digital signature
- Re: [PATCH 2/3] gnu: Add go-1.4., (continued)
[PATCH 1/3] gnu: gccgo: Update to 4.9., Efraim Flashner, 2016/01/12
[PATCH 3/3] gnu: Add go-1.5., Efraim Flashner, 2016/01/12
Re: [PATCH 0/3] WIP: Go-lang, Ludovic Courtès, 2016/01/14
Re: [PATCH 0/3] WIP: Go-lang, Jeff Mickey, 2016/01/14