Skip to content

Commit 0f98376

Browse files
committed
Check release builds component for component, instead of all together
1 parent 11f3a58 commit 0f98376

File tree

2 files changed

+89
-6
lines changed

2 files changed

+89
-6
lines changed

.github/workflows/check-release-builds.yml

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,16 @@ jobs:
4141
os: ["ubuntu-latest", "macOS-latest", "windows-latest"]
4242
ghc-version: ["9.2", "9.4", "9.6", "9.8", "9.10", "9.12"]
4343
cabal-version: ["3.12"]
44+
exclude:
45+
# this configuration leads to a linker error when building/running the
46+
# cabal-list-public-library-targets script.
47+
- os: "windows-latest"
48+
ghc-version: "9.2"
49+
cabal-version: "3.12"
4450

4551
env:
4652
tag-name: ${{ github.ref_name }}
47-
release-build-target: |
48-
${{ startsWith(github.ref_name, 'blockio') && './blockio/blockio.cabal' || startsWith(github.ref_name, 'bloomfilter-blocked') && './bloomfilter-blocked/bloomfilter-blocked.cabal' || startsWith(github.ref_name, 'lsm-tree') && './lsm-tree/lsm-tree.cabal' }}
53+
release-build-target: ${{ startsWith(github.ref_name, 'blockio') && './blockio/blockio.cabal' || startsWith(github.ref_name, 'bloomfilter-blocked') && './bloomfilter-blocked/bloomfilter-blocked.cabal' || startsWith(github.ref_name, 'lsm-tree') && './lsm-tree/lsm-tree.cabal' }}
4954

5055
steps:
5156
- name: 🗄️ Print release build target
@@ -101,8 +106,10 @@ jobs:
101106
key: check-release-build-${{ runner.os }}-ghc-${{ steps.setup-haskell.outputs.ghc-version }}-cabal-${{ steps.setup-haskell.outputs.cabal-version }}
102107
with:
103108
path: ${{ steps.setup-haskell.outputs.cabal-store }}
104-
key: ${{ env.key }}-plan-${{ hashFiles('dist-newstyle/cache/plan.json') }}
105-
restore-keys: ${{ env.key }}-
109+
key: ${{ env.key }}-tag-${{ env.tag-name }}-plan-${{ hashFiles('dist-newstyle/cache/plan.json') }}
110+
restore-keys: |
111+
${{ env.key }}-tag-${{ env.tag-name }}-
112+
${{ env.key }}-
106113
107114
- name: 🛠️ Build Cabal dependencies
108115
run: |
@@ -118,6 +125,9 @@ jobs:
118125
key: ${{ steps.cache-cabal.outputs.cache-primary-key }}
119126

120127
- name: 🏗️ Build
128+
shell: sh
121129
run: |
122-
cabal build all \
123-
--project-file="cabal.project.temp"
130+
./scripts/cabal-list-public-library-targets.hs '${{ env.release-build-target }}' | \
131+
tail -n +2 | \
132+
tr -d '\r' | \
133+
xargs -L 1 sh -c 'echo "$0" && cabal build --project-file=cabal.project.temp "$0"'
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#!/usr/bin/env cabal
2+
{- cabal:
3+
build-depends:
4+
, base >=4.16
5+
, bytestring >=0.11
6+
, Cabal-syntax ^>=3.10 || ^>=3.12
7+
8+
ghc-options:
9+
-Wall -Wcompat -Wincomplete-uni-patterns
10+
-Wincomplete-record-updates -Wpartial-fields -Widentities
11+
-Wredundant-constraints -Wmissing-export-lists
12+
-Wno-unticked-promoted-constructors -Wunused-packages
13+
14+
ghc-options: -Werror=missing-deriving-strategies
15+
16+
ghc-options: -Werror
17+
18+
ghc-options: -Wmissing-import-lists
19+
-}
20+
{-# LANGUAGE LambdaCase #-}
21+
22+
module Main (main) where
23+
24+
import Control.Monad (forM_)
25+
import qualified Data.ByteString as BS
26+
import Data.Maybe (mapMaybe)
27+
import Distribution.PackageDescription.Parsec
28+
(parseGenericPackageDescriptionMaybe)
29+
import Distribution.Types.CondTree (ignoreConditions)
30+
import qualified Distribution.Types.GenericPackageDescription as GenericPackageDescription
31+
import Distribution.Types.Library (libVisibility)
32+
import Distribution.Types.LibraryVisibility
33+
(LibraryVisibility (LibraryVisibilityPrivate, LibraryVisibilityPublic))
34+
import Distribution.Types.PackageDescription (package)
35+
import Distribution.Types.PackageId (pkgName)
36+
import Distribution.Types.PackageName (unPackageName)
37+
import Distribution.Types.UnqualComponentName (unUnqualComponentName)
38+
import System.Environment (getArgs)
39+
import System.IO (hPutStrLn, stderr)
40+
41+
-- | Given a cabal file, list all public libraries in that cabal file (including
42+
-- the main library) and print them as valid cabal targets.
43+
--
44+
-- For example:
45+
--
46+
-- @
47+
-- ❯ ./scripts/cabal-list-public-library-targets.hs ./blockio/blockio.cabal
48+
-- Finding sub-libraries with public visibility in './blockio/blockio.cabal' ...
49+
-- blockio:blockio
50+
-- blockio:sim
51+
-- @
52+
main :: IO ()
53+
main = do
54+
cabalFiles <- getArgs
55+
forM_ cabalFiles $ \cabalFile -> do
56+
putStrLn ("Finding sub-libraries with public visibility in '" ++ cabalFile ++ "' ...")
57+
cabalContent <- BS.readFile cabalFile
58+
case parseGenericPackageDescriptionMaybe cabalContent of
59+
Nothing -> hPutStrLn stderr $ "error: Could not parse '" <> cabalFile <> "'"
60+
Just genericPackageDescription -> do
61+
let packageDescription = GenericPackageDescription.packageDescription genericPackageDescription
62+
packageName = unPackageName $ pkgName $ package packageDescription
63+
subLibraries = GenericPackageDescription.condSubLibraries genericPackageDescription
64+
publicSubLibraries = mapMaybe isPublic subLibraries
65+
mkCabalTarget s = packageName ++ ":" ++ s
66+
forM_ (packageName : publicSubLibraries) $ \n ->
67+
putStrLn $ mkCabalTarget n
68+
where
69+
isPublic (componentName, condTree) =
70+
let vis = libVisibility (fst $ ignoreConditions condTree) in
71+
case vis of
72+
LibraryVisibilityPublic -> Just (unUnqualComponentName componentName)
73+
LibraryVisibilityPrivate -> Nothing

0 commit comments

Comments
 (0)