Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Workaround for ghcjs hardcoding to linux #511

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ let iosSupport = system == "x86_64-darwin";
inherit (self) lib;
haskellLib = self.haskell.lib;
inherit
system
useFastWeak useReflexOptimizer enableLibraryProfiling enableTraceReflexEvents
useTextJSString enableExposeAllUnfoldings
haskellOverlays;
Expand Down
5 changes: 3 additions & 2 deletions haskell-overlays/default.nix
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{ lib
{ system
, lib
, haskellLib
, nixpkgs
, useFastWeak, useReflexOptimizer, enableLibraryProfiling, enableTraceReflexEvents
Expand Down Expand Up @@ -112,7 +113,7 @@ rec {

# Just for GHCJS
ghcjs = import ./ghcjs.nix {
inherit lib haskellLib nixpkgs fetchgit fetchFromGitHub useReflexOptimizer;
inherit system lib haskellLib nixpkgs fetchgit fetchFromGitHub useReflexOptimizer;
};
ghcjs-fast-weak = import ./ghcjs-fast-weak {
inherit lib;
Expand Down
16 changes: 14 additions & 2 deletions haskell-overlays/ghcjs.nix
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
{ lib, haskellLib, nixpkgs, fetchgit, fetchFromGitHub, useReflexOptimizer }:
{ system, lib, haskellLib, nixpkgs, fetchgit, fetchFromGitHub, useReflexOptimizer }:

with haskellLib;

self: super: {
self: super:

let dontHardcodeLinux = package: cabalFile:
if ! self.ghc.isGhcjs then package
else nixpkgs.haskell.lib.overrideCabal package (drv: {
postPatch = (drv.postPatch or "") + nixpkgs.lib.optionalString (system == "x86_64-darwin") ''
substituteInPlace ${cabalFile}.cabal --replace 'if os(linux)' 'if os(linux) && !impl(ghcjs)'
substituteInPlace ${cabalFile}.cabal --replace 'if os(osx)' 'if os(linux) && impl(ghcjs)'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this right? if os(osx) gets translated to if os(linux) ...?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it is right...an explanation is worthy.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Talked to @alexfmpe. So basically this is just a very confusing way of writing it. Because of the hardcoding in GHCJS, os(linux) == true and true && x == x so why are we confounding this substitution?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't want the os(linux) patches to get applied, so we change the os(linux) conditional to only apply when GHCJS isn't being used. Since GHCJS always thinks it's running on Linux, we change the os(osx) patches to os(linux) patches.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

because we don't want to apply the actual os(linux) patches (since we're really on macOS)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GHCJS thinks we're on Linux, but that doesn't mean we should apply the Linux patches, instead we need to trick GHCJS into applying the macOS patches

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so we say "these linux patches are not for you, silly GHCJS, but these other (actually macOS) linux patches are!"

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note the replacement only happens if system == "x86_64-darwin"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense. Thanks.

'';
});
in {
_dep = super._dep or {} // {
ghcjsBaseSrc = fetchgit {
url = "https://github.com/ghcjs/ghcjs-base.git";
Expand Down Expand Up @@ -82,4 +92,6 @@ self: super: {
sha256 = "1sy51nz096sv91nxqk6yk7b92b5a40axv9183xakvki2nc09yhqg";
};
}));

foundation = dontHardcodeLinux super.foundation "foundation";
}