@@ -141,7 +141,7 @@ exDbPkgs = map (either exInstName exAvName)
141
141
142
142
exAvSrcPkg :: ExampleAvailable -> SourcePackage
143
143
exAvSrcPkg ex =
144
- let (libraryDeps, testSuites) = splitTopLevel (CD. libraryDeps (exAvDeps ex))
144
+ let (libraryDeps, testSuites, exts ) = splitTopLevel (CD. libraryDeps (exAvDeps ex))
145
145
in SourcePackage {
146
146
packageInfoId = exAvPkgId ex
147
147
, packageSource = LocalTarballPackage " <<path>>"
@@ -160,27 +160,31 @@ exAvSrcPkg ex =
160
160
}
161
161
, C. genPackageFlags = concatMap extractFlags
162
162
(CD. libraryDeps (exAvDeps ex))
163
- , C. condLibrary = Just $ mkCondTree libraryDeps
163
+ , C. condLibrary = Just $ mkCondTree (extsLib exts) libraryDeps
164
164
, C. condExecutables = []
165
- , C. condTestSuites = map (\ (t, deps) -> (t, mkCondTree deps))
165
+ , C. condTestSuites = map (\ (t, deps) -> (t, mkCondTree mempty deps))
166
166
testSuites
167
167
, C. condBenchmarks = []
168
168
}
169
169
}
170
170
where
171
- -- Split the set of dependencies into the set of dependencies of the library
172
- -- and the dependencies of the test suites.
171
+ -- Split the set of dependencies into the set of dependencies of the library,
172
+ -- the dependencies of the test suites and extensions .
173
173
splitTopLevel :: [ExampleDependency ]
174
174
-> ( [ExampleDependency ]
175
175
, [(ExampleTestName , [ExampleDependency ])]
176
+ , [Extension ]
176
177
)
177
- splitTopLevel [] = ([] , [] )
178
+ splitTopLevel [] = ([] , [] , [] )
178
179
splitTopLevel (ExTest t a: deps) =
179
- let (other, testSuites) = splitTopLevel deps
180
- in (other, (t, a): testSuites)
180
+ let (other, testSuites, exts) = splitTopLevel deps
181
+ in (other, (t, a): testSuites, exts)
182
+ splitTopLevel (ExExt ext: deps) =
183
+ let (other, testSuites, exts) = splitTopLevel deps
184
+ in (other, testSuites, ext: exts)
181
185
splitTopLevel (dep: deps) =
182
- let (other, testSuites) = splitTopLevel deps
183
- in (dep: other, testSuites)
186
+ let (other, testSuites, exts ) = splitTopLevel deps
187
+ in (dep: other, testSuites, exts )
184
188
185
189
-- Extract the total set of flags used
186
190
extractFlags :: ExampleDependency -> [C. Flag ]
@@ -197,11 +201,11 @@ exAvSrcPkg ex =
197
201
extractFlags (ExExt _) = []
198
202
extractFlags (ExLang _) = []
199
203
200
- mkCondTree :: Monoid a => [ExampleDependency ] -> DependencyTree a
201
- mkCondTree deps =
204
+ mkCondTree :: Monoid a => a -> [ExampleDependency ] -> DependencyTree a
205
+ mkCondTree x deps =
202
206
let (directDeps, flaggedDeps) = splitDeps deps
203
207
in C. CondNode {
204
- C. condTreeData = mempty -- irrelevant to the solver
208
+ C. condTreeData = x -- Necessary for language extensions
205
209
, C. condTreeConstraints = map mkDirect directDeps
206
210
, C. condTreeComponents = map mkFlagged flaggedDeps
207
211
}
@@ -217,14 +221,17 @@ exAvSrcPkg ex =
217
221
-> (C. Condition C. ConfVar
218
222
, DependencyTree a , Maybe (DependencyTree a ))
219
223
mkFlagged (f, a, b) = ( C. Var (C. Flag (C. FlagName f))
220
- , mkCondTree a
221
- , Just (mkCondTree b)
224
+ , mkCondTree mempty a
225
+ , Just (mkCondTree mempty b)
222
226
)
223
227
224
- -- Split a set of dependencies into the set of unconditional dependencies
225
- -- and the set of dependencies guarded by a flag.
228
+ -- Split a set of dependencies into direct dependencies and flagged
229
+ -- dependencies. A direct dependency is a tuple of the name of package and
230
+ -- maybe its version (no version means any version) meant to be converted
231
+ -- to a 'C.Dependency' with 'mkDirect' for example. A flagged dependency is
232
+ -- the set of dependencies guarded by a flag.
226
233
--
227
- -- TODO: Maybe Int indicates dependency on a particular package
234
+ -- TODO: Take care of flagged language extensions
228
235
splitDeps :: [ExampleDependency ]
229
236
-> ( [(ExamplePkgName , Maybe Int )]
230
237
, [(ExampleFlagName , [ExampleDependency ], [ExampleDependency ])]
@@ -242,16 +249,18 @@ exAvSrcPkg ex =
242
249
in (directDeps, (f, a, b): flaggedDeps)
243
250
splitDeps (ExTest _ _: _) =
244
251
error " Unexpected nested test"
245
- splitDeps (ExExt _ext: deps) =
246
- splitDeps deps
247
- splitDeps (ExLang _lang: deps) =
248
- splitDeps deps
252
+ splitDeps (_: deps) = splitDeps deps
249
253
250
254
-- Currently we only support simple setup dependencies
251
255
mkSetupDeps :: [ExampleDependency ] -> [C. Dependency ]
252
256
mkSetupDeps deps =
253
257
let (directDeps, [] ) = splitDeps deps in map mkDirect directDeps
254
258
259
+ -- A 'C.Library' with just the given extensions in its 'BuildInfo'
260
+ extsLib :: [Extension ] -> C. Library
261
+ extsLib es = mempty { C. libBuildInfo = mempty { C. otherExtensions = es } }
262
+
263
+
255
264
exAvPkgId :: ExampleAvailable -> C. PackageIdentifier
256
265
exAvPkgId ex = C. PackageIdentifier {
257
266
pkgName = C. PackageName (exAvName ex)
@@ -279,15 +288,21 @@ exInstIdx :: [ExampleInstalled] -> C.PackageIndex.InstalledPackageIndex
279
288
exInstIdx = C.PackageIndex. fromList . map exInstInfo
280
289
281
290
exResolve :: ExampleDb
291
+ -- List of extensions supported by the compiler.
292
+ -> [Extension ]
282
293
-> [ExamplePkgName ]
283
294
-> Bool
284
295
-> ([String ], Either String CI.InstallPlan. InstallPlan )
285
- exResolve db targets indepGoals = runProgress $
296
+ exResolve db exts targets indepGoals = runProgress $
286
297
resolveDependencies C. buildPlatform
287
- ( C. unknownCompilerInfo C. buildCompilerId C. NoAbiTag )
298
+ compiler
288
299
Modular
289
300
params
290
301
where
302
+ defaultCompiler = C. unknownCompilerInfo C. buildCompilerId C. NoAbiTag
303
+ compiler = if null exts
304
+ then defaultCompiler
305
+ else defaultCompiler { C. compilerInfoExtensions = Just exts }
291
306
(inst, avai) = partitionEithers db
292
307
instIdx = exInstIdx inst
293
308
avaiIdx = SourcePackageDb {
0 commit comments