3
0
Fork 0
forked from mirrors/nixpkgs

Initial support for cross-compiling ghc

This commit is contained in:
Shea Levy 2016-11-15 16:59:09 -05:00
parent f477bc98be
commit 845b56d25a
8 changed files with 263 additions and 42 deletions

View file

@ -0,0 +1,19 @@
diff --git a/rts/LinkerInternals.h b/rts/LinkerInternals.h
--- a/rts/LinkerInternals.h
+++ b/rts/LinkerInternals.h
@@ -303,4 +303,14 @@
# define OBJFORMAT_MACHO
#endif
+/* In order to simplify control flow a bit, some references to mmap-related
+ definitions are blocked off by a C-level if statement rather than a CPP-level
+ #if statement. Since those are dead branches when !RTS_LINKER_USE_MMAP, we
+ just stub out the relevant symbols here
+*/
+#if !RTS_LINKER_USE_MMAP
+#define munmap(x,y) /* nothing */
+#define MAP_ANONYMOUS 0
+#endif
+
#endif /* LINKERINTERNALS_H */

View file

@ -0,0 +1,22 @@
diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c
--- a/rts/sm/Storage.c
+++ b/rts/sm/Storage.c
@@ -1314,7 +1314,7 @@
------------------------------------------------------------------------- */
#if (defined(arm_HOST_ARCH) || defined(aarch64_HOST_ARCH)) && defined(ios_HOST_OS)
-void sys_icache_invalidate(void *start, size_t len);
+#include <libkern/OSCacheControl.h>
#endif
/* On ARM and other platforms, we need to flush the cache after
@@ -1327,7 +1327,7 @@
(void)exec_addr;
#elif (defined(arm_HOST_ARCH) || defined(aarch64_HOST_ARCH)) && defined(ios_HOST_OS)
/* On iOS we need to use the special 'sys_icache_invalidate' call. */
- sys_icache_invalidate(exec_addr, ((unsigned char*)exec_addr)+len);
+ sys_icache_invalidate(exec_addr, len);
#elif defined(__GNUC__)
/* For all other platforms, fall back to a libgcc builtin. */
unsigned char* begin = (unsigned char*)exec_addr;

View file

@ -0,0 +1,158 @@
diff --git a/includes/rts/OSThreads.h b/includes/rts/OSThreads.h
--- a/includes/rts/OSThreads.h
+++ b/includes/rts/OSThreads.h
@@ -15,7 +15,12 @@
#ifndef RTS_OSTHREADS_H
#define RTS_OSTHREADS_H
-#if defined(THREADED_RTS) /* to near the end */
+#if defined(HAVE_PTHREAD_H) && !defined(mingw32_HOST_OS)
+#define BUILD_OSTHREAD_POSIX
+#endif
+
+
+#if defined(THREADED_RTS) || defined(BUILD_OSTHREAD_POSIX) /* to near end */
#if defined(HAVE_PTHREAD_H) && !defined(mingw32_HOST_OS)
@@ -205,13 +210,25 @@
void releaseThreadNode (void);
#endif // !CMINUSMINUS
-#else
+#endif /* defined(THREADED_RTS) || defined(BUILD_OSTHREAD_POSIX) */
+
+#ifndef THREADED_RTS
+
+#ifdef ACQUIRE_LOCK
+// If we have pthreads, we pull in the threading primitives even when the RTS
+// isn't threaded, but we expect these macros to be noops on non-threaded RTS.
+
+#undef ACQUIRE_LOCK
+#undef RELEASE_LOCK
+#undef ASSERT_LOCK_HELD
+
+#endif
#define ACQUIRE_LOCK(l)
#define RELEASE_LOCK(l)
#define ASSERT_LOCK_HELD(l)
-#endif /* defined(THREADED_RTS) */
+#endif
#ifndef CMINUSMINUS
//
diff --git a/rts/posix/OSThreads.c b/rts/posix/OSThreads.c
--- a/rts/posix/OSThreads.c
+++ b/rts/posix/OSThreads.c
@@ -35,7 +35,7 @@
#endif
#endif
-#if defined(THREADED_RTS)
+#if defined(THREADED_RTS) || defined(BUILD_OSTHREAD_POSIX)
#include "RtsUtils.h"
#include "Task.h"
@@ -225,47 +225,6 @@
return NULL;
}
-int
-forkOS_createThread ( HsStablePtr entry )
-{
- pthread_t tid;
- int result = pthread_create(&tid, NULL,
- forkOS_createThreadWrapper, (void*)entry);
- if(!result)
- pthread_detach(tid);
- return result;
-}
-
-void freeThreadingResources (void) { /* nothing */ }
-
-uint32_t
-getNumberOfProcessors (void)
-{
- static uint32_t nproc = 0;
-
- if (nproc == 0) {
-#if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
- nproc = sysconf(_SC_NPROCESSORS_ONLN);
-#elif defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_CONF)
- nproc = sysconf(_SC_NPROCESSORS_CONF);
-#elif defined(darwin_HOST_OS)
- size_t size = sizeof(uint32_t);
- if(sysctlbyname("hw.logicalcpu",&nproc,&size,NULL,0) != 0) {
- if(sysctlbyname("hw.ncpu",&nproc,&size,NULL,0) != 0)
- nproc = 1;
- }
-#elif defined(freebsd_HOST_OS)
- size_t size = sizeof(uint32_t);
- if(sysctlbyname("hw.ncpu",&nproc,&size,NULL,0) != 0)
- nproc = 1;
-#else
- nproc = 1;
-#endif
- }
-
- return nproc;
-}
-
#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETAFFINITY)
// Schedules the thread to run on CPU n of m. m may be less than the
// number of physical CPUs, in which case, the thread will be allowed
@@ -353,6 +312,51 @@
pthread_kill(id, SIGPIPE);
}
+#endif /* defined(THREADED_RTS) || defined(BUILD_OSTHREAD_POSIX) */
+
+#if defined(THREADED_RTS)
+
+int
+forkOS_createThread ( HsStablePtr entry )
+{
+ pthread_t tid;
+ int result = pthread_create(&tid, NULL,
+ forkOS_createThreadWrapper, (void*)entry);
+ if(!result)
+ pthread_detach(tid);
+ return result;
+}
+
+void freeThreadingResources (void) { /* nothing */ }
+
+uint32_t
+getNumberOfProcessors (void)
+{
+ static uint32_t nproc = 0;
+
+ if (nproc == 0) {
+#if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
+ nproc = sysconf(_SC_NPROCESSORS_ONLN);
+#elif defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_CONF)
+ nproc = sysconf(_SC_NPROCESSORS_CONF);
+#elif defined(darwin_HOST_OS)
+ size_t size = sizeof(uint32_t);
+ if(sysctlbyname("hw.logicalcpu",&nproc,&size,NULL,0) != 0) {
+ if(sysctlbyname("hw.ncpu",&nproc,&size,NULL,0) != 0)
+ nproc = 1;
+ }
+#elif defined(freebsd_HOST_OS)
+ size_t size = sizeof(uint32_t);
+ if(sysctlbyname("hw.ncpu",&nproc,&size,NULL,0) != 0)
+ nproc = 1;
+#else
+ nproc = 1;
+#endif
+ }
+
+ return nproc;
+}
+
#else /* !defined(THREADED_RTS) */
int

View file

@ -0,0 +1,17 @@
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -437,7 +437,11 @@
else
CrossCompilePrefix=""
fi
-TargetPlatformFull="${TargetPlatform}"
+# Despite its similarity in name to TargetPlatform, TargetPlatformFull is used
+# in calls to subproject configure scripts and thus must be set to the autoconf
+# triple, not the normalized GHC triple that TargetPlatform is set to.
+# It may be better to just do away with the GHC triples all together.
+TargetPlatformFull="${target}"
AC_SUBST(CrossCompiling)
AC_SUBST(CrossCompilePrefix)
AC_SUBST(TargetPlatformFull)

View file

@ -1,20 +0,0 @@
--- ghc/compiler/main/SysTools.hs 2016-11-09 14:03:05.304528147 -0500
+++ ghc2/compiler/main/SysTools.hs 2016-11-09 14:00:19.712934686 -0500
@@ -421,7 +421,7 @@
args1 = map Option (getOpts dflags opt_c)
args2 = args0 ++ args1 ++ args
mb_env <- getGccEnv args2
- runSomethingResponseFile dflags cc_filter "C Compiler" p args2 mb_env
+ runSomethingFiltered dflags cc_filter "C Compiler" p args2 mb_env
where
-- discard some harmless warnings from gcc that we can't turn off
cc_filter = unlines . doFilter . lines
@@ -911,7 +911,7 @@
args1 = map Option (getOpts dflags opt_l)
args2 = args0 ++ linkargs ++ args1 ++ args
mb_env <- getGccEnv args2
- runSomethingResponseFile dflags ld_filter "Linker" p args2 mb_env
+ runSomethingFiltered dflags ld_filter "Linker" p args2 mb_env
where
ld_filter = case (platformOS (targetPlatform dflags)) of
OSSolaris2 -> sunos_ld_filter

View file

@ -1,27 +1,35 @@
{ stdenv, fetchgit, bootPkgs, perl, gmp, ncurses, libiconv, binutils, coreutils
, autoconf, automake, happy, alex
, autoconf, automake, happy, alex, cross ? null
}:
let
inherit (bootPkgs) ghc;
in stdenv.mkDerivation rec {
version = "8.1.20161109";
commonBuildInputs = [ ghc perl autoconf automake happy alex ];
version = "8.1.20161115";
commonPreConfigure = ''
sed -i -e 's|-isysroot /Developer/SDKs/MacOSX10.5.sdk||' configure
'' + stdenv.lib.optionalString (!stdenv.isDarwin) ''
export NIX_LDFLAGS="$NIX_LDFLAGS -rpath $out/lib/ghc-${version}"
'' + stdenv.lib.optionalString stdenv.isDarwin ''
export NIX_LDFLAGS+=" -no_dtrace_dof"
'';
in stdenv.mkDerivation (rec {
inherit version;
name = "ghc-${version}";
rev = "2e8463b232054b788b73e6551947a9434aa76009";
rev = "017d11e0a36866b05ace32ece1af11adf652a619";
src = fetchgit {
url = "git://git.haskell.org/ghc.git";
inherit rev;
sha256 = "12nxai5qqnw42syhd0vzl2f9f8z28rc0fsa7g771dyzpqglak90l";
sha256 = "091zpb9vqqy4jqh4q7sz04dh1yfdczaaikbxi5ppim01gzbxwn65";
};
patches = [
./ghc-HEAD-dont-pass-linker-flags-via-response-files.patch # https://github.com/NixOS/nixpkgs/issues/10752
];
postUnpack = ''
pushd ghc-${builtins.substring 0 7 rev}
chmod -R +w ghc
pushd ghc
echo ${version} >VERSION
echo ${rev} >GIT_COMMIT_ID
patchShebangs .
@ -29,20 +37,14 @@ in stdenv.mkDerivation rec {
popd
'';
buildInputs = [ ghc perl autoconf automake happy alex ];
buildInputs = commonBuildInputs;
enableParallelBuilding = true;
preConfigure = ''
sed -i -e 's|-isysroot /Developer/SDKs/MacOSX10.5.sdk||' configure
'' + stdenv.lib.optionalString (!stdenv.isDarwin) ''
export NIX_LDFLAGS="$NIX_LDFLAGS -rpath $out/lib/ghc-${version}"
'' + stdenv.lib.optionalString stdenv.isDarwin ''
export NIX_LDFLAGS+=" -no_dtrace_dof"
'';
preConfigure = commonPreConfigure;
configureFlags = [
"--with-cc=${stdenv.cc}/bin/cc"
"CC=cc"
"--with-gmp-includes=${gmp.dev}/include" "--with-gmp-libraries=${gmp.out}/lib"
"--with-curses-includes=${ncurses.dev}/include" "--with-curses-libraries=${ncurses.out}/lib"
] ++ stdenv.lib.optional stdenv.isDarwin [
@ -76,4 +78,22 @@ in stdenv.mkDerivation rec {
inherit (ghc.meta) license platforms;
};
}
} // stdenv.lib.optionalAttrs (cross != null) {
name = "${cross.config}-ghc-${version}";
# Some fixes for cross-compilation to iOS. See https://phabricator.haskell.org/D2710 (D2711,D2712,D2713)
patches = [ ./D2710.patch ./D2711.patch ./D2712.patch ./D2713.patch ];
preConfigure = commonPreConfigure + ''
sed 's|#BuildFlavour = quick-cross|BuildFlavour = perf-cross|' mk/build.mk.sample > mk/build.mk
'';
configureFlags = [
"CC=${cross.config}-cc"
"--target=${cross.config}"
];
buildInputs = commonBuildInputs ++ [ stdenv.ccCross stdenv.binutilsCross ];
dontSetConfigureCross = true;
})

View file

@ -4855,7 +4855,7 @@ in
# Haskell and GHC
haskell = callPackage ./haskell-packages.nix { };
haskell = callPackage ./haskell-packages.nix { inherit crossSystem; };
haskellPackages = haskell.packages.ghc801.override {
overrides = config.haskellPackageOverrides or (self: super: {});

View file

@ -1,4 +1,4 @@
{ pkgs, callPackage, stdenv }:
{ pkgs, callPackage, stdenv, crossSystem }:
rec {
@ -50,6 +50,10 @@ rec {
bootPkgs = packages.ghc7103;
inherit (bootPkgs) alex happy;
};
# TODO: how should we support multiple versions of this?
ghcCross = compiler.ghcHEAD.override {
cross = crossSystem;
};
ghcNokinds = callPackage ../development/compilers/ghc/nokinds.nix rec {
bootPkgs = packages.ghc784;
inherit (bootPkgs) alex happy;
@ -121,6 +125,7 @@ rec {
ghc = compiler.ghcHEAD;
compilerConfig = callPackage ../development/haskell-modules/configuration-ghc-head.nix { };
};
# TODO Support for ghcCross here
ghcNokinds = callPackage ../development/haskell-modules {
ghc = compiler.ghcNokinds;
compilerConfig = callPackage ../development/haskell-modules/configuration-ghc-nokinds.nix { };