-
Notifications
You must be signed in to change notification settings - Fork 37
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Use a code generator for singletons-base's test suite
This replaces `singletons-base`'s custom `Setup.hs` script with a `cabal` code generator. This finally allows `singletons-base` to have a `Simple` build type, but at the (relatively less extreme) cost of requiring `Cabal-3.8` or later in order to build. Remarkably, everything that the custom `Setup.hs` script did can be done in a much simpler way with a `cabal` code generator, as all of the information that the `singletons-base` test suite needs to invoke GHC can be inferred from the arguments passed to a code generator. One downside is that due to haskell/cabal#8421, the code generator must be implemented in a standalone executable package (`singletons-base-code-generator`). Until that `cabal` issue is fixed, we will need to upload `singletons-base-code-generator` to Hackage with each `singletons` release. Fixes #532.
- Loading branch information
1 parent
8babd09
commit 26f07f6
Showing
11 changed files
with
214 additions
and
170 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
Changelog for the `singletons-base-code-generator` project | ||
========================================================== | ||
|
||
0.1 [????.??.??] | ||
---------------- | ||
* Initial release. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
Copyright (c) 2022-2024, Ryan Scott | ||
All rights reserved. | ||
|
||
Redistribution and use in source and binary forms, with or without | ||
modification, are permitted provided that the following conditions are met: | ||
|
||
1. Redistributions of source code must retain the above copyright notice, this | ||
list of conditions and the following disclaimer. | ||
|
||
2. Redistributions in binary form must reproduce the above copyright notice, | ||
this list of conditions and the following disclaimer in the documentation | ||
and/or other materials provided with the distribution. | ||
|
||
3. Neither the name of the author nor the names of its contributors may be | ||
used to endorse or promote products derived from this software without | ||
specific prior written permission. | ||
|
||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
`singletons-base-code-generator` | ||
================================ | ||
|
||
[![Hackage](https://img.shields.io/hackage/v/singletons-base-code-generator.svg)](http://hackage.haskell.org/package/singletons-base-code-generator) | ||
|
||
A [`cabal` code | ||
generator](https://cabal.readthedocs.io/en/stable/cabal-package-description-file.html#pkg-field-test-suite-code-generators) | ||
used in the test suite for the | ||
[`singletons-base`](https://hackage.haskell.org/package/singletons-base) | ||
library. |
43 changes: 43 additions & 0 deletions
43
singletons-base-code-generator/singletons-base-code-generator.cabal
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
cabal-version: 3.8 | ||
name: singletons-base-code-generator | ||
version: 0.1 | ||
synopsis: Code generator for the singletons-base test suite | ||
homepage: http://www.github.com/goldfirere/singletons | ||
category: Dependent Types | ||
author: Ryan Scott <[email protected]> | ||
maintainer: Ryan Scott <[email protected]> | ||
bug-reports: https://github.com/goldfirere/singletons/issues | ||
stability: experimental | ||
tested-with: GHC == 9.10.1 | ||
extra-doc-files: CHANGES.md | ||
extra-source-files: README.md | ||
license: BSD-3-Clause | ||
license-file: LICENSE | ||
build-type: Simple | ||
description: | ||
A [@cabal@ code | ||
generator](https://cabal.readthedocs.io/en/stable/cabal-package-description-file.html#pkg-field-test-suite-code-generators) | ||
used in the test suite for the | ||
[@singletons-base@](https://hackage.haskell.org/package/singletons-base) | ||
library. | ||
|
||
source-repository this | ||
type: git | ||
location: https://github.com/goldfirere/singletons.git | ||
subdir: singletons-base-code-generator | ||
tag: v0.1 | ||
|
||
source-repository head | ||
type: git | ||
location: https://github.com/goldfirere/singletons.git | ||
subdir: singletons-base-code-generator | ||
branch: master | ||
|
||
executable singletons-base-code-generator | ||
hs-source-dirs: src | ||
ghc-options: -Wall -Wcompat -threaded | ||
default-language: GHC2021 | ||
main-is: SingletonsBaseCodeGenerator.hs | ||
build-depends: base >= 4.20 && < 4.21, | ||
directory >= 1.2 && < 1.4, | ||
filepath >= 1.3 && < 1.6 |
62 changes: 62 additions & 0 deletions
62
singletons-base-code-generator/src/SingletonsBaseCodeGenerator.hs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
-- | A @cabal@ code generator used in the test suite for the @singletons-base@ | ||
-- library. This records all of the GHC flags used when building | ||
-- @singletons-base@ so that when the test suite invokes GHC, it can find the | ||
-- locally built version of @singletons-base@ and its dependencies. | ||
module Main (main) where | ||
|
||
import Data.List (isPrefixOf) | ||
import System.Directory (createDirectoryIfMissing, getCurrentDirectory) | ||
import System.Environment (getArgs) | ||
import System.FilePath ((</>), (<.>)) | ||
|
||
|
||
main :: IO () | ||
main = do | ||
-- The directory in which singletons-base and its test suite are located. This | ||
-- only works under the assumption that cabal will navigate to that directory | ||
-- before invoking the code generator. This is always the case when I've | ||
-- tested it, but if this assumption does not hold in general, we may need to | ||
-- revisit this assumption. | ||
singletonsBaseDir <- getCurrentDirectory | ||
args <- getArgs | ||
(tgt, rest) <- | ||
case args of | ||
(tgt:allFlags) -> pure (tgt, allFlags) | ||
[] -> fail "Expected at least one argument for code generator" | ||
ghcFlags <- takeGhcArgs rest | ||
-- Filter out GHC language extensions and warnings, as the singletons-base | ||
-- test suite wants to have finer-grained control over these. | ||
let ghcFlags' = filter (\flag -> not (isLangExtension flag || isWarning flag)) ghcFlags | ||
createDirectoryIfMissing True tgt | ||
writeFile (tgt </> generatedFileName <.> "hs") $ unlines | ||
[ "module " ++ generatedFileName ++ " where" | ||
, "" | ||
, "ghcFlags :: [String]" | ||
, "ghcFlags = " ++ show ghcFlags' | ||
, "" | ||
, "rootDir :: FilePath" | ||
, "rootDir = " ++ show singletonsBaseDir | ||
] | ||
putStrLn generatedFileName | ||
|
||
-- | @cabal@ code generators have a convention that GHC-specific arguments are | ||
-- separated from the rest of the @cabal@-specific arguments using @--@. | ||
-- Assuming this convention, this function looks up the GHC-specific arguments. | ||
takeGhcArgs :: [String] -> IO [String] | ||
takeGhcArgs ("--":xs) = pure xs | ||
takeGhcArgs (_:xs) = takeGhcArgs xs | ||
takeGhcArgs [] = fail "Expected -- to separate arguments" | ||
|
||
-- | Returns 'True' if a GHC command-line argument corresponds to a language | ||
-- extension (e.g., @-XTypeFamilies@). | ||
isLangExtension :: String -> Bool | ||
isLangExtension = isPrefixOf "-X" | ||
|
||
-- | Returns 'True' if a GHC command-line argument corresponds to a warning flag | ||
-- (e.g., @-Wtabs@). | ||
isWarning :: String -> Bool | ||
isWarning flag = any (`isPrefixOf` flag) ["-W", "-fwarn", "-fno-warn"] | ||
|
||
-- | The name of the generated file containing the GHC flags. | ||
generatedFileName :: String | ||
generatedFileName = "SingletonsBaseGHCFlags" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.