[Haskell-cafe] With cabal.project, what's the story about warning and -Werror compiler flags?

Nicolas Trangez ikke at nicolast.be
Sun Aug 28 13:37:48 UTC 2022


All,

Working on some project, I was wondering about best-practices and
community standards for compiler flags now that `cabal.project` is a
thing.

Before, I put compiler warning flags like `-Wall` in `Ghc-Options` and
`Cc-Options` in `mypackage.cabal` files. The use of `-Werror`, whilst
(IMHO) useful in development and CI was a bit more troublesome, since
having those in `package.cabal` (not under a default-disabled flag) was
frowned upon (and even not allowed by Hackage?)

Having these options in `mypackage.cabal` always felt slightly weird,
since they are in no way required for a package to function: they're
developer options, not user/consumer options. Where `-wavx2` could be a
required `Cc-Options` setting for a package to build/function, `-Wall`
is not.

With the advent of `cabal.project`, it seems to me this is the ideal
place to put developer flags: from what I understood, `cabal.project`
doesn't influence sdist/Hackage distribution, and hence could contain
all kind of GHC and C compiler flags that are useful during development
but not required for a package to build/function, including `-Werror`
(if desired by the project authors).

Does this sound like a reasonable stance?

If it is, I did run into a couple of issues getting things to actually
work. Whilst putting `Ghc-Options` in a `Package mypackage` section in
`cabal.project` seems to work, I'm unable to achieve the same resulsts
for C compiler invocations. Presumably there's a `Gcc-Options` setting
one can use (which is also generated in `cabal.project.local` by `cabal
configure --gcc-options ...`). However, in testing, it appears said
compiler optons are only passed to GCC when compiling, e.g., a HSC2HS
file, but not when compiling a C file part of a `C-Sources` setting
(whilst `Cc-Options` in `mypackage.cabal` are).

Is there some discrepancy between what can be done from `cabal.project`
vs. `mypackage.cabal`? Is this intentional? Am I trying to accomplish
something that isn't/shouldn't be supported by Cabal in the first
place?

Cheers,

Nicolas


More information about the Haskell-Cafe mailing list