# 10. Package Description Format Specification History¶

Package descriptions need to specify the version of the specification they need to be interpreted in via the cabal-version declaration. The following list describes changes that occurred in each version of the cabal specification relative to the respective preceding published version.

Note

The sequence of specification version numbers is not contiguous because it’s synchronised with the version of the Cabal library. As a consequence, only even versions are considered proper published versions of the specification as odd versions of the Cabal library denote unreleased development branches which have no stability guarantee.

## 10.1. cabal-version: 3.4¶

• License fields use identifiers from SPDX License List version 3.9 2020-05-15
• Dependencies to sublibraries have to be specified explicitly, even for current package. This way you can have an internal library with the same name as some external dependency.
• Remove -any and -none syntax for version ranges Use >=0 and <0 respectively.
• default-language is optional. The Default value is to use the compiler’s default language.
• mixins field allow specifying a sublibrary.

## 10.2. cabal-version: 3.0¶

• Added the extra-dynamic-library-flavours field to specify non-trivial variants of dynamic flavours. It is extra-library-flavours but for shared libraries. Mainly useful for GHC’s RTS library.

• Free text fields (e.g. description) preserve empty lines and indentation. In other words, you don’t need to add dots for blank lines.

• License fields use identifiers from SPDX License List version 3.6 2019-07-10

• Remove deprecated hs-source-dir, extensions and build-tools fields.

• Common stanzas are now allowed also in the beginning of conditional sections. In other words, the following is valid

library
import deps

if flag(foo)
import foo-deps

• Allow redundant leading or trailing commas in package fields with optional commas, such as exposed-modules

• Require fields with optional commas to consistently omit or place commas between elements.

• Changed the behavior of extra-bundled-libraries field. The naming convention of dynamic library files (e.g. generated by a custom build script) has changed. For library names prefixed with “C”, the dynamic library file name(s) must be of the form lib<library-name>.<dyn-library-extension>* instead of the old libC<library-name>-ghc<ghc-flavour><ghc-version>.<dyn-library-extension>

• New set-notation syntax for == and ^>= operators, see build-depends field documentation for examples.

• Allow more whitespace in mixins field

• Wildcards are disallowed in pkgconfig-depends, Yet the pkgconfig format is relaxed to accept e.g. versions like 1.1.0h.

• New autogen-includes for specifying install-includes which are autogenerated (e.g. by a configure script).

• New asm-sources and asm-options fields added for supporting bundled foreign routines implemented in assembler.

• New cmm-sources and cmm-options fields added for supporting bundled foreign primops implemented in C–.

## 10.3. cabal-version: 2.4¶

• Wildcard matching has been expanded. All previous wildcard expressions are still valid; some will match strictly more files than before. Specifically:
• Double-star (**) wildcards are now accepted for recursive matching immediately before the final slash; they must be followed by a filename wildcard (e.g., foo/**/*.html is valid; foo/**/bar/*.html and foo/**/**/*.html, foo/**/bar.html are all invalid). As ** was an error in globs before, this does not affect any existing .cabal files that previously worked.
• Wildcards now match when the pattern’s extensions form a suffix of the candidate file’s extension, rather than requiring strict equality (e.g., previously *.html did not match foo.en.html, but now it does).
• License fields use identifiers from SPDX License List version 3.2 2018-07-10

## 10.6. cabal-version: 1.24¶

• New custom-setup stanza and custom-setup:setup-depends field added for specifying dependencies of custom Setup.hs scripts.
• CPP Macros VERSION_$pkgname and MIN_VERSION_$pkgname are now also generated for the current package.
• New CPP Macros CURRENT_COMPONENT_ID and CURRENT_PACKAGE_KEY.
• New extra-framework-dirs field added for specifying extra locations to find OS X frameworks.

## 10.10. cabal-version: 1.16¶

Todo

this needs to be researched; there were only few changes between 1.12 and 1.18;