Skip to content

Commit bfeee3b

Browse files
committed
Fix aarch64 musl build, use GHC 9.6.7 and Cabal 3.14
1 parent 1db526a commit bfeee3b

File tree

8 files changed

+64
-59
lines changed

8 files changed

+64
-59
lines changed

nix-tools/cabal.project

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
index-state: 2025-04-06T00:00:00Z
1+
index-state: 2025-04-12T00:00:00Z
2+
3+
-- Needed for building aarch64-linux musl version with GHC 9.6
4+
constraints: containers installed, Cabal >=3.14.1.0
5+
allow-older: Cabal-syntax-json:base, Cabal-syntax-json:containers
26

37
packages: nix-tools
48

nix-tools/flake.lock

+12-12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

nix-tools/nix-tools/lib-cabal2nix/Cabal2Nix.hs

+18-18
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Distribution.Simple.PackageDescription (readGenericPackageDescription)
1010
import Distribution.Verbosity (normal)
1111
import Distribution.Pretty ( pretty, prettyShow )
1212
import Distribution.Utils.ShortText (fromShortText)
13-
import Distribution.Utils.Path (getSymbolicPath)
13+
import Distribution.Utils.Path (getSymbolicPath, makeSymbolicPath)
1414
import Data.Char (toUpper)
1515
import System.FilePath
1616
import Data.ByteString (ByteString)
@@ -97,7 +97,7 @@ data CabalDetailLevel = MinimalDetails | FullDetails deriving (Show, Eq)
9797
cabal2nix :: Bool -> CabalDetailLevel -> Maybe Src -> CabalFile -> IO NExpr
9898
cabal2nix isLocal fileDetails src = \case
9999
(OnDisk path) -> gpd2nix isLocal fileDetails src Nothing
100-
<$> readGenericPackageDescription normal path
100+
<$> readGenericPackageDescription normal Nothing (makeSymbolicPath path)
101101
(InMemory gen _ body) -> gpd2nix isLocal fileDetails src (genExtra <$> gen)
102102
<$> case runParseResult (parseGenericPackageDescription body) of
103103
(_, Left (_, err)) -> error ("Failed to parse in-memory cabal file: " ++ show err)
@@ -137,11 +137,11 @@ instance IsComponent ForeignLib where
137137

138138
instance IsComponent Executable where
139139
getBuildInfo = buildInfo
140-
getMainPath Executable {modulePath = p} = Just p
140+
getMainPath Executable {modulePath = p} = Just (getSymbolicPath p)
141141

142142
instance IsComponent TestSuite where
143143
getBuildInfo = testBuildInfo
144-
getMainPath TestSuite {testInterface = (TestSuiteExeV10 _ p)} = Just p
144+
getMainPath TestSuite {testInterface = (TestSuiteExeV10 _ p)} = Just (getSymbolicPath p)
145145
getMainPath _ = Nothing
146146

147147
instance IsComponent Benchmark where
@@ -211,11 +211,11 @@ toNixPackageDescription isLocal detailLevel pd = mkNonRecSet $
211211
else
212212
[ "detailLevel" $= mkStr (fromString (show detailLevel))
213213
, "licenseFiles" $= toNix (map getSymbolicPath (licenseFiles pd))
214-
, "dataDir" $= mkStr (fromString (dataDir pd))
215-
, "dataFiles" $= toNix (dataFiles pd)
216-
, "extraSrcFiles" $= toNix (extraSrcFiles pd)
217-
, "extraTmpFiles" $= toNix (extraTmpFiles pd)
218-
, "extraDocFiles" $= toNix (extraDocFiles pd)
214+
, "dataDir" $= mkStr (fromString (getSymbolicPath (dataDir pd)))
215+
, "dataFiles" $= toNix (map getSymbolicPath (dataFiles pd))
216+
, "extraSrcFiles" $= toNix (map getSymbolicPath (extraSrcFiles pd))
217+
, "extraTmpFiles" $= toNix (map getSymbolicPath (extraTmpFiles pd))
218+
, "extraDocFiles" $= toNix (map getSymbolicPath (extraDocFiles pd))
219219
]
220220
where
221221
toSetupDepends (Dependency pkg _ libs) = SetupDependency pkg <$> toList libs
@@ -328,22 +328,22 @@ toNixGenericPackageDescription isLocal detailLevel gpd = mkNonRecSet
328328
mkNonRecSet (
329329
[ "depends" $= toNix deps | Just deps <- [shakeTree . fmap ( (>>= depends) . targetBuildDepends . getBuildInfo) $ comp ] ] ++
330330
[ "libs" $= toNix deps | Just deps <- [shakeTree . fmap ( fmap mkSysDep . extraLibs . getBuildInfo) $ comp ] ] ++
331-
[ "frameworks" $= toNix deps | Just deps <- [shakeTree . fmap ( fmap mkSysDep . frameworks . getBuildInfo) $ comp ] ] ++
331+
[ "frameworks" $= toNix deps | Just deps <- [shakeTree . fmap ( fmap mkSysDep . fmap getSymbolicPath . frameworks . getBuildInfo) $ comp ] ] ++
332332
[ "pkgconfig" $= toNix deps | Just deps <- [shakeTree . fmap ( pkgconfigDepends . getBuildInfo) $ comp ] ] ++
333333
[ "build-tools" $= toNix deps | Just deps <- [shakeTree . fmap ( toolDeps . getBuildInfo) $ comp ] ] ++
334334
[ "buildable" $= boolTreeToNix (and <$> b) | Just b <- [shakeTree . fmap ((:[]) . buildable . getBuildInfo) $ comp ] ] ++
335335
if detailLevel == MinimalDetails
336336
then []
337337
else
338338
[ "modules" $= toNix mods | Just mods <- [shakeTree . fmap (fmap ModuleName.toFilePath . modules) $ comp ] ] ++
339-
[ "asmSources" $= toNix src | Just src <- [shakeTree . fmap (asmSources . getBuildInfo) $ comp ] ] ++
340-
[ "cmmSources" $= toNix src | Just src <- [shakeTree . fmap (cmmSources . getBuildInfo) $ comp ] ] ++
341-
[ "cSources" $= toNix src | Just src <- [shakeTree . fmap (cSources . getBuildInfo) $ comp ] ] ++
342-
[ "cxxSources" $= toNix src | Just src <- [shakeTree . fmap (cxxSources . getBuildInfo) $ comp ] ] ++
343-
[ "jsSources" $= toNix src | Just src <- [shakeTree . fmap (jsSources . getBuildInfo) $ comp ] ] ++
344-
[ "hsSourceDirs" $= toNix (fmap getSymbolicPath <$> dir) | Just dir <- [shakeTree . fmap (hsSourceDirs . getBuildInfo) $ comp ] ] ++
345-
[ "includeDirs" $= toNix dir | Just dir <- [shakeTree . fmap (includeDirs . getBuildInfo) $ comp] ] ++
346-
[ "includes" $= toNix dir | Just dir <- [shakeTree . fmap (includes . getBuildInfo) $ comp] ] ++
339+
[ "asmSources" $= toNix (fmap getSymbolicPath <$> src) | Just src <- [shakeTree . fmap (asmSources . getBuildInfo) $ comp ] ] ++
340+
[ "cmmSources" $= toNix (fmap getSymbolicPath <$> src) | Just src <- [shakeTree . fmap (cmmSources . getBuildInfo) $ comp ] ] ++
341+
[ "cSources" $= toNix (fmap getSymbolicPath <$> src) | Just src <- [shakeTree . fmap (cSources . getBuildInfo) $ comp ] ] ++
342+
[ "cxxSources" $= toNix (fmap getSymbolicPath <$> src) | Just src <- [shakeTree . fmap (cxxSources . getBuildInfo) $ comp ] ] ++
343+
[ "jsSources" $= toNix (fmap getSymbolicPath <$> src) | Just src <- [shakeTree . fmap (jsSources . getBuildInfo) $ comp ] ] ++
344+
[ "hsSourceDirs" $= toNix (fmap getSymbolicPath <$> dir) | Just dir <- [shakeTree . fmap (hsSourceDirs . getBuildInfo) $ comp ] ] ++
345+
[ "includeDirs" $= toNix (fmap getSymbolicPath <$> dir) | Just dir <- [shakeTree . fmap (includeDirs . getBuildInfo) $ comp] ] ++
346+
[ "includes" $= toNix (fmap getSymbolicPath <$> dir) | Just dir <- [shakeTree . fmap (includes . getBuildInfo) $ comp] ] ++
347347
[ "mainPath" $= toNix p | Just p <- [shakeTree . fmap (maybeToList . getMainPath) $ comp] ])
348348
where name = fromString $ unUnqualComponentName unQualName
349349
depends (Dependency pkg _ libs) = HaskellLibDependency pkg <$> toList libs

nix-tools/nix-tools/make-install-plan/ProjectPlanOutput.hs

+2-1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import qualified Data.Map as Map
5353
import System.FilePath
5454

5555
import Distribution.Client.ProjectPlanning
56+
import Distribution.Utils.Path (makeSymbolicPath, getSymbolicPath)
5657

5758
-----------------------------------------------------------------------------
5859
-- Writing plan.json files
@@ -230,7 +231,7 @@ encodePlanAsJson distDirLayout elaboratedInstallPlan elaboratedSharedConfig targ
230231
| elabSetupScriptCliVersion elab < mkVersion [3, 7, 0, 0] =
231232
"build-info" J..= J.Null
232233
| otherwise =
233-
"build-info" J..= J.String (buildInfoPref dist_dir)
234+
"build-info" J..= J.String (getSymbolicPath (buildInfoPref (makeSymbolicPath dist_dir)))
234235

235236
packageLocationToJ :: PackageLocation (Maybe FilePath) -> J.Value
236237
packageLocationToJ pkgloc =

nix-tools/nix-tools/nix-tools.cabal

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ common warnings
1515

1616
common cabal-deps
1717
build-depends:
18-
Cabal ^>=3.12,
19-
Cabal-syntax ^>=3.12
18+
Cabal ^>=3.14,
19+
Cabal-syntax ^>=3.14
2020

2121
common cabal-install-deps
2222
import: cabal-deps
2323
build-depends:
24-
cabal-install ^>=3.12,
25-
cabal-install-solver ^>=3.12
24+
cabal-install ^>=3.14,
25+
cabal-install-solver ^>=3.14
2626

2727
library
2828
import: warnings

nix-tools/nix-tools/setup-ghcjs/Setup.hs

+21-21
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import Distribution.Simple.Test.LibV09 (stubName)
2727
import Distribution.Types.Executable (exeName, Executable(..))
2828
import Distribution.Types.Benchmark (Benchmark(..))
2929
import Distribution.Types.UnqualComponentName (unUnqualComponentName)
30-
30+
import Distribution.Utils.Path (makeSymbolicPath, getSymbolicPath)
3131

3232
emarProgram :: Program
3333
emarProgram = simpleProgram "emar"
@@ -36,31 +36,31 @@ buildEMCCLib :: PackageDescription -> LocalBuildInfo -> IO ()
3636
buildEMCCLib desc lbi = do
3737
let verbosity = verbose
3838
-- get build dir
39-
createDirectoryIfMissingVerbose verbosity True ((buildDir lbi) </> "emcc")
39+
createDirectoryIfMissingVerbose verbosity True ((getSymbolicPath (buildDir lbi)) </> "emcc")
4040
--
4141
case library desc of
4242
Just lib -> do
4343
-- Let's see if we are going to export anything. If not there is likely no point in compiling anything
4444
-- from the C code.
4545
names <- forM (jsSources . libBuildInfo $ lib) $ \src -> do
46-
unwords . concatMap (drop 2 . words) . filter (isPrefixOf "// EMCC:EXPORTED_FUNCTIONS") . lines <$> readFile src
46+
unwords . concatMap (drop 2 . words) . filter (isPrefixOf "// EMCC:EXPORTED_FUNCTIONS") . lines <$> readFile (getSymbolicPath src)
4747

4848
unless (null names) $ do
4949
let depIncludeDirs = concatMap IPI.includeDirs (topologicalOrder $ installedPkgs lbi)
5050
-- alright, let's compile all .c files into .o files with emcc, which is the `gcc` program.
5151
forM_ (cSources . libBuildInfo $ lib) $ \src -> do
52-
let dst = (buildDir lbi) </> "emcc" </> (src -<.> "o")
52+
let dst = (getSymbolicPath (buildDir lbi)) </> "emcc" </> (getSymbolicPath src -<.> "o")
5353
createDirectoryIfMissingVerbose verbosity True (takeDirectory dst)
5454
runDbProgram verbosity gccProgram (withPrograms lbi) $
55-
["-c", src, "-o", dst] ++ ["-I" <> incDir | incDir <- (includeDirs . libBuildInfo $ lib) ++ depIncludeDirs]
55+
["-c", getSymbolicPath src, "-o", dst] ++ ["-I" <> getSymbolicPath incDir | incDir <- (includeDirs . libBuildInfo $ lib) ++ map makeSymbolicPath depIncludeDirs]
5656

5757
-- and now construct a canonical `.js_a` file, *if* we have any cSources we turned into objects.
5858
unless (null . cSources . libBuildInfo $ lib) $ do
59-
let dstLib = (buildDir lbi) </> "libEMCC" <> (unPackageName . pkgName . package $ desc) <> ".js_a"
59+
let dstLib = (getSymbolicPath (buildDir lbi)) </> "libEMCC" <> (unPackageName . pkgName . package $ desc) <> ".js_a"
6060
runDbProgram verbosity emarProgram (withPrograms lbi) $
61-
[ "-r", dstLib ] ++ [ (buildDir lbi) </> "emcc" </> (src -<.> "o") | src <- cSources . libBuildInfo $ lib ]
61+
[ "-r", dstLib ] ++ [ getSymbolicPath (buildDir lbi) </> "emcc" </> (getSymbolicPath src -<.> "o") | src <- cSources . libBuildInfo $ lib ]
6262

63-
let expLib = (buildDir lbi) </> "libEMCC" <> (unPackageName . pkgName . package $ desc) <> ".exported.js_a"
63+
let expLib = getSymbolicPath (buildDir lbi) </> "libEMCC" <> (unPackageName . pkgName . package $ desc) <> ".exported.js_a"
6464
writeFile expLib (unwords names)
6565

6666
-- if there's no lib, this is a fairly pointless exercise
@@ -96,19 +96,19 @@ linkCLib libname desc lbi = do
9696
exfns <- concat <$> forM exff (fmap words . readFile)
9797
unless (null libs0 && null exfns) $ do
9898
libs1 <- case libs0 of
99-
[] -> do writeFile (buildDir lbi </> "emcc_linking_dummy.c") ""
99+
[] -> do writeFile (getSymbolicPath (buildDir lbi) </> "emcc_linking_dummy.c") ""
100100
runDbProgram verbosity gccProgram (withPrograms lbi) $
101-
["-c", buildDir lbi </> "emcc_linking_dummy.c", "-o", buildDir lbi </> "emcc_linking_dummy.o"]
102-
return [(buildDir lbi </> "emcc_linking_dummy.o")]
101+
["-c", getSymbolicPath (buildDir lbi) </> "emcc_linking_dummy.c", "-o", getSymbolicPath (buildDir lbi) </> "emcc_linking_dummy.o"]
102+
return [(getSymbolicPath (buildDir lbi) </> "emcc_linking_dummy.o")]
103103
_ -> return libs0
104104

105-
let dst = if libname == "emcc" </> "lib.js" then buildDir lbi
105+
let dst = if libname == "emcc" </> "lib.js" then getSymbolicPath (buildDir lbi)
106106
-- who designed this shit in cabal?
107107
else case comp of
108-
(CTest test@(TestSuite { testInterface = TestSuiteLibV09 _ _ })) -> buildDir lbi </> stubName test </> stubName test ++ "-tmp"
109-
(CTest test@(TestSuite { testInterface = TestSuiteExeV10 _ _ })) -> buildDir lbi </> unUnqualComponentName (testName test) </> unUnqualComponentName (testName test) ++ "-tmp"
110-
(CExe exe) -> buildDir lbi </> unUnqualComponentName (exeName exe) </> unUnqualComponentName (exeName exe) ++ "-tmp"
111-
_ -> componentBuildDir lbi clbi
108+
(CTest test@(TestSuite { testInterface = TestSuiteLibV09 _ _ })) -> getSymbolicPath (buildDir lbi) </> stubName test </> stubName test ++ "-tmp"
109+
(CTest test@(TestSuite { testInterface = TestSuiteExeV10 _ _ })) -> getSymbolicPath (buildDir lbi) </> unUnqualComponentName (testName test) </> unUnqualComponentName (testName test) ++ "-tmp"
110+
(CExe exe) -> getSymbolicPath (buildDir lbi) </> unUnqualComponentName (exeName exe) </> unUnqualComponentName (exeName exe) ++ "-tmp"
111+
_ -> getSymbolicPath (componentBuildDir lbi clbi)
112112
dst' = dst </> libname
113113
createDirectoryIfMissingVerbose verbosity True (takeDirectory dst')
114114
runDbProgram verbosity gccProgram (withPrograms lbi) $
@@ -126,7 +126,7 @@ postBuildHook :: Args -> BuildFlags -> PackageDescription -> LocalBuildInfo -> I
126126
postBuildHook _args flags desc lbi = do
127127
case (takeFileName . programPath <$> lookupProgram ghcProgram (withPrograms lbi)) of
128128
Just "js-unknown-ghcjs-ghc" ->
129-
readBuildTargets silent desc (buildArgs flags) >>= \case
129+
readBuildTargets silent desc (buildTargets flags) >>= \case
130130
[BuildTargetComponent (CLibName _)] -> print "OK. Lib (Build)" >> buildEMCCLib desc lbi
131131
[BuildTargetComponent (CExeName _)] -> print "OK. Exe"
132132
[BuildTargetComponent (CTestName _)] -> print "OK. Test"
@@ -142,7 +142,7 @@ postConfHook args flags desc lbi = do
142142
-- this is technically only needed if the package uses TH somewhere.
143143
linkEMCCTHLib desc lbi
144144
-- only link the final lib if we want to produce an output.
145-
readBuildTargets silent desc (configArgs flags) >>= \case
145+
readBuildTargets silent desc (configureArgs False flags) >>= \case
146146
[BuildTargetComponent (CLibName _)] -> print "OK. Lib" >> postConf simpleUserHooks args flags desc lbi
147147
[BuildTargetComponent (CExeName _)] -> print "OK. Exe (Link)" >> linkEMCCLib desc lbi
148148
[BuildTargetComponent (CTestName _)] -> print "OK. Test (Link)" >> linkEMCCLib desc lbi
@@ -194,7 +194,7 @@ emccBuildHook desc lbi hooks flags = do
194194
--
195195
emccCopyHook :: PackageDescription -> LocalBuildInfo -> UserHooks -> CopyFlags -> IO ()
196196
emccCopyHook desc lbi hooks flags = do
197-
emccLibs <- filterM (\l -> doesFileExist (buildDir lbi </> "lib" <> l <> ".js_a"))
197+
emccLibs <- filterM (\l -> doesFileExist (getSymbolicPath (buildDir lbi) </> "lib" <> l <> ".js_a"))
198198
[ "EMCC" <> (unPackageName . pkgName . package $ desc)
199199
, "EMCC" <> (unPackageName . pkgName . package $ desc) <> ".exported" ]
200200
print $ "EMCC extra lib files: " ++ intercalate ", " emccLibs
@@ -210,7 +210,7 @@ emccCopyHook desc lbi hooks flags = do
210210

211211
emccRegHook :: PackageDescription -> LocalBuildInfo -> UserHooks -> RegisterFlags -> IO ()
212212
emccRegHook desc lbi hooks flags = do
213-
emccLibs <- filterM (\l -> doesFileExist (buildDir lbi </> "lib" <> l <> ".js_a"))
213+
emccLibs <- filterM (\l -> doesFileExist (getSymbolicPath (buildDir lbi) </> "lib" <> l <> ".js_a"))
214214
[ "EMCC" <> (unPackageName . pkgName . package $ desc)
215215
, "EMCC" <> (unPackageName . pkgName . package $ desc) <> ".exported" ]
216216
print $ "EMCC extra lib files: " ++ intercalate ", " emccLibs
@@ -226,7 +226,7 @@ emccRegHook desc lbi hooks flags = do
226226

227227
emccUnregHook :: PackageDescription -> LocalBuildInfo -> UserHooks -> RegisterFlags -> IO ()
228228
emccUnregHook desc lbi hooks flags = do
229-
emccLibs <- filterM (\l -> doesFileExist (buildDir lbi </> "lib" <> l <> ".js_a"))
229+
emccLibs <- filterM (\l -> doesFileExist (getSymbolicPath (buildDir lbi) </> "lib" <> l <> ".js_a"))
230230
[ "EMCC" <> (unPackageName . pkgName . package $ desc)
231231
, "EMCC" <> (unPackageName . pkgName . package $ desc) <> ".exported" ]
232232
print $ "EMCC extra lib files: " ++ intercalate ", " emccLibs

nix-tools/overlay.nix

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
final: _prev:
22

33
let
4-
compiler-nix-name = "ghc9101";
4+
compiler-nix-name = "ghc96";
55

66
nix-tools = nix-tools-set {
77
nix-tools = nix-tools-unchecked;

nix-tools/static/project.nix

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ let
6464

6565
static-nix-tools-project = pkgs.haskell-nix.project' {
6666

67-
compiler-nix-name = "ghc9101";
67+
compiler-nix-name = "ghc96";
6868

6969
src = ../.;
7070

0 commit comments

Comments
 (0)