1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069
|
<div class="hidden-warning"><a href="https://docs.haskellstack.org/"><img src="https://cdn.jsdelivr.net/gh/commercialhaskell/stack/doc/img/hidden-warning.svg"></a></div>
# Configuration and customisation
Stack is configured by the content of YAML files. Some Stack operations can also
be customised by the use of scripts.
!!! info
A Haskell package is an organised collection of Haskell code and related
files. It is described by a Cabal file or a `package.yaml` file (which can
be used to generate a Cabal file). The package description is itself part of
the package. Its file is located in the root directory of a project package
or dependency located locally.
A Stack project is a local directory that contains a Stack project-level
configuration file (`stack.yaml`, by default). A project may relate to more
than one project package. A single-package project's directory will usually
also be the project package's root directory.
## YAML configuration
Stack's YAML configuration options break down into
[project-specific](#project-specific-configuration) options and
[non-project-specific](#non-project-specific-configuration) options. The former
are configured at the project level. The latter are configured at the project
level or globally.
The **project-level** configuration file (`stack.yaml`, by default) contains
project-specific options and may contain non-project-specific options. However,
non-project-specific options in the project-level configuration file in the
`global-project` directory (see below) are ignored by Stack.
Stack obtains project-level configuration from one of the following (in order of
preference):
1. A file specified by the `--stack-yaml` command line option.
2. A file specified by the `STACK_YAML` environment variable.
3. A file named `stack.yaml` in the current directory or an ancestor directory.
4. A file name `stack.yaml` in the `global-project` directory in the
[Stack root](stack_root.md).
The **global** configuration file (`config.yaml`) contains only
non-project-specific options. The location of this file depends on the operating
system and whether Stack is configured to use the XDG Base Directory
Specification.
=== "Unix-like"
`config.yaml` is located in `/etc/stack` (for system-wide options); and/or
in the [Stack root](stack_root.md) (for user-specific options).
=== "Windows"
`config.yaml` is located in the [Stack root](stack_root.md).
=== "XDG Base Directory Specification"
On Unix-like operating systems and Windows, Stack can be configured to
follow the XDG Base Directory Specification if the environment variable
`STACK_XDG` is set to any non-empty value. However, Stack will ignore that
configuration if the [Stack root](stack_root.md) location has been set on
the command line or the `STACK_ROOT` environment variable exists.
If Stack is following the XDG Base Directory Specification, the location of
`config.yaml` (for user-specific options) is `<XDG_CONFIG_HOME>/stack`. If
the `XDG_CONFIG_HOME` environment variable does not exist, the default is
`~/.config/stack` on Unix-like operating systems and `%APPDIR%\stack` on
Windows.
This page is intended to document fully all YAML configuration options. If you
identify any inaccuracies or incompleteness, please update the page, and if
you're not sure how, open an issue labeled "question".
If you wish to understand the difference between a `stack.yaml` files and a
Cabal file (named `<package_name>.cabal`), see the
[stack.yaml vs a Cabal file](stack_yaml_vs_cabal_package_file.md) documentation.
## Project-specific configuration
Project-specific configuration options are valid only in a project-level
configuration file (`stack.yaml`, by default).
Each of the Haskell packages to which a Stack project relates is either a
**project package** that is part of the project and located locally or a package
on which one or more of the project packages depends (directly or indirectly).
The latter is referred to as a **dependency** and it may be located locally or
elsewhere.
!!! info
Project packages are built by default. Dependencies are only built when
needed. Building can target individual components of a project package. The
individual components of dependencies cannot be targeted. Test suite and
benchmark components of a project package can be built and run. The library
and executable components of a dependency, and only those components, are
built when the dependency is needed.
In your project-specific options, you specify both **which project packages** to
build and **which dependencies to use** when building these packages.
A dependency specified as an [extra-dep](#extra-deps) will shadow a package of
the same name specified in a [snapshot](#snapshot). A project package will
shadow a dependency of the same name.
### snapshot
Command line equivalent (takes precedence):
[`--snapshot`](global_flags.md#snapshot-option) or
[`--resolver`](global_flags.md#resolver-option) option
The `snapshot` key specifies which snapshot is to be used for this project. A
snapshot defines a GHC version, the package version of packages available for
installation, and various settings like build flags. It is also called a
resolver since a snapshot states how dependencies are resolved. There are
currently four snapshot types:
* LTS Haskell snapshots, e.g. `snapshot: lts-22.21`
* Stackage Nightly snapshots, e.g. `snapshot: nightly-2024-05-06`
* No snapshot, just use packages shipped with the compiler. For GHC this looks
like `snapshot: ghc-9.6.5`
* Custom snapshot, via a URL or relative file path. For further information, see
the [snapshot and package location](pantry.md) documentation.
Each of these snapshots will also determine what constraints are placed on the
compiler version. See the [compiler-check](#compiler-check) option for some
additional control over compiler version.
A package version specified in a snapshot can be shadowed by an
[extra-dep](#extra-deps) of the same name or a [project package](#packages) of
the same name.
### resolver
`resolver` and [`snapshot`](#snapshot) are synonyms. Only one of these keys is
permitted, not both.
### packages
Default:
~~~yaml
packages:
- .
~~~
The `packages` key specifies a list of the project packages that are part of
your project. These are specified via paths to local directories. A path is
considered relative to the directory containing the project-level configuration
file (`stack.yaml`, by default). For example, if the `stack.yaml` file is
located at `/dir1/dir2/stack.yaml`, and has:
~~~yaml
packages:
- my-package
- dir3/my-other-package
~~~
the configuration means "project packages in directories `/dir1/dir2/my-package`
and `/dir1/dir2/dir3/my-other-package`".
The `packages` key is optional. The default value, '`.`', means that the
project has a single project package located in the current directory.
A project package will shaddow a dependency of the same name.
A package version specified in a snapshot can be shadowed by an
[extra-dep](#extra-deps) of the same name or a [project package](#packages) of
the same name.
Each specified project package directory must have a valid Cabal file or Hpack
`package.yaml` file present. Any subdirectories of the directory are not
searched for Cabal files. A subdirectory has to be specified as an independent
item in the list of project packages.
A project package is different from a dependency (located locally or elsewhere)
specified as an [extra-dep](#extra-deps) or via a [snapshot](#snapshot). For
example:
* a project package will be built by default by commanding
[`stack build`](build_command.md) without specific targets. A dependency will
only be built if it is needed; and
* test suites and benchmarks may be built and run for a project package. They
are never run for a dependency.
### extra-deps
Default: `[]`
The `extra-deps` key specifies a list of extra dependencies on top of what is
defined in the [snapshot](#snapshot). A dependency may come from either a Pantry
package location or a local file path.
A Pantry package location is one or three different kinds of sources:
* the package index (Hackage);
* an archive (a tarball or zip file, either local or over HTTP or HTTPS); or
* a Git or Mercurial repository.
For further information on the format for specifying a Pantry package location,
see the [Pantry](pantry.md) documentation. For example:
~~~yaml
extra-deps:
# The latest revision of a package in the package index (Hackage):
- acme-missiles-0.3
# A specific revision of a package in the package index (Hackage):
- acme-missiles-0.3@rev:0
# An *.tar.gz archive file over HTTPS:
- url: https://github.com/example-user/my-repo/archive/08c9b4cdf977d5bcd1baba046a007940c1940758.tar.gz
subdirs:
- my-package
# A Git repository at a specific commit:
- git: https://github.com/example-user/my-repo.git
commit: '08c9b4cdf977d5bcd1baba046a007940c1940758'
# An archive of files at a point in the history of a GitHub repository
# (identified by a specific commit):
- github: example-user/my-repo
commit: '08c9b4cdf977d5bcd1baba046a007940c1940758'
subdirs:
- my-package
~~~
!!! note
GHC boot packages are special. An extra-dep with the same package name and
version as a GHC boot package will be ignored.
!!! note
The `commit:` key expects a YAML string. A commit hash, or partial hash,
comprised only of digits represents a YAML number, unless it is enclosed in
quotation marks.
For a local file path source, the path is considered relative to the directory
containing the `stack.yaml` file. For example, if the `stack.yaml` is located
at `/dir1/dir2/stack.yaml`, and has:
~~~yaml
extra-deps:
- my-package
- dir3/my-other-package
~~~
the configuration means "extra-deps packages in directories
`/dir1/dir2/my-package` and `/dir1/dir2/dir3/my-other-package`".
!!! note
A local file path that has the format of a package identifier will be
interpreted as a reference to a package on Hackage. Prefix it with `./` to
avoid that confusion.
!!! note
A specified extra-dep that does not have the format of a valid Pantry
package location (for example, a reference to a package on Hackage that
omits the package's version) will be interpreted as a local file path.
An extra-dep will shadow a dependency specified in a [snapshot](#snapshot) of
the same name. An extra-dep can be shadowed by a [project package](#packages) of
the same name.
!!! info
Some Haskell packages published on Hackage, for example `base` and `ghc`,
are referred to as 'wired-in' to one or more versions of GHC or as 'magic'.
They can be distinguished from normal packages by the contents of their
Cabal files: GHC's `-this-unit-id` option is set as the name of the package
without a version. For example, the `base.cabal` for `base-4.19.1.0`
includes:
~~~yaml
-- We need to set the unit id to base (without a version number)
-- as it's magic.
ghc-options: -this-unit-id base
~~~
The GHC boot packages that are 'wired-in' cannot be shaddowed with different
versions of the same package. Given their dependencies, the use of these
boot packages in a build plan may limit what can be specified as an
extra-dep.
For example, GHC boot package `ghc-9.8.2` has a dependency on `process`. Its
`*.conf` file identifies the dependency as `process-1.6.18.0-4fb7`. If
package `ghc-9.8.2` is part of a build plan and a different version of
`process` is specified as an extra-dep, during a build, Stack will identify
that the build plan refers to two versions of `process` and warn that the
build is likely to fail.
Stack treats the following as the names of 'wired-in' packages: `base`,
`dph-par`, `dph-seq`, `ghc-bignum`, `ghc-prim`, `ghc`, `integer-gmp`,
`integer-simple`, `interactive`, `rts` and `template-haskell`.
### flags
Default: `{}`
Command line equivalent (takes precedence):
[`stack build --flag`](build_command.md#-flag-option) option
Cabal flags can be set for each package separately. For example:
~~~yaml
flags:
package-name:
flag-name: true
~~~
This overrides all Cabal flag specifications (if any) for the specified packages
in the snapshot.
!!! note
For a package included directly in the snapshot, if the Cabal flag
specifications differ from the Cabal flag specifications (if any) in the
snapshot, then the package will automatically be promoted to be an
[extra-dep](#extra-deps).
!!! note
In order to set a Cabal flag for a GHC boot package, the package must be
specified as an [extra-dep](#extra-deps).
### drop-packages
[:octicons-tag-24: 2.1.1](https://github.com/commercialhaskell/stack/releases/tag/v2.1.1)
Default: `[]`
Packages which, when present in the snapshot specified in the
[`snapshot`](#snapshot) or [`resolver`](#resolver) key, should not be included
in our project. This can be used for a few different purposes, e.g.:
* Ensure that packages you don't want used in your project cannot be used in a
`package.yaml` file (e.g., for license reasons)
* When using a custom GHC build, avoid incompatible packages (see this
[comment](https://github.com/commercialhaskell/stack/pull/4655#issuecomment-477954429)).
~~~yaml
drop-packages:
- buggy-package
- package-with-unacceptable-license
~~~
!!! info
Stackage snapshots LTS Haskell 14.27 (GHC 8.6.5) and earlier, and Nightly
2022-02-08 (GHC 8.8.2) and earlier, included directly the `Cabal` package.
Later snapshots do not include directly that package (which is a GHC boot
package).
For the older Stackage snapshots, it could be handy to drop the
snapshot-specified `Cabal` package, to avoid building that version of the
package. For the later snapshots, there is no package version to drop.
### user-message
If present, specifies a message to be displayed every time the configuration is
loaded by Stack. It can serve as a reminder for the user to review the
configuration and make any changes if needed. The user can delete this message
if the generated configuration is acceptable.
For example, a user-message is inserted by `stack init` when it omits packages
or adds external dependencies, namely:
~~~yaml
user-message: ! 'Warning: Some packages were found to be incompatible with the resolver
and have been left commented out in the packages section.
Warning: Specified resolver could not satisfy all dependencies. Some external packages
have been added as dependencies.
You can omit this message by removing it from stack.yaml
'
~~~
### custom-preprocessor-extensions
Default: `[]`
Command line equivalent: `--customer-preprocessor-extensions` option
In order for Stack to be aware of any custom preprocessors you are using, add
their extensions here
~~~yaml
custom-preprocessor-extensions:
- erb
~~~
TODO: Add a simple example of how to use custom preprocessors.
### extra-package-dbs
[:octicons-tag-24: 0.1.6.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.6.0)
Default: `[]`
A list of relative or absolute paths to package databases. These databases will
be added on top of GHC's global package database before the addition of other
package databases.
!!! warning
Use of this feature may result in builds that are not reproducible, as Stack
has no control over the contents of the extra package databases.
### curator
:octicons-beaker-24: Experimental
[:octicons-tag-24: 2.1.0.1](https://github.com/commercialhaskell/stack/releases/tag/v2.1.0.1)
Default: `{}`
Configuration intended for use only by the
[`curator` tool](https://github.com/commercialhaskell/curator), which uses Stack
to build packages. For given package names (which need not exist in the
project), Stack can be configured to ignore (skip) silently building test
suites, building benchmarks and/or creating Haddock documentation or to expect
that building test suites, building benchmarks and/or creating Haddock
documentation will fail.
For example:
~~~yaml
curator:
skip-test:
- my-package1
expect-test-failure:
- my-package2
skip-bench:
- my-package3
expect-benchmark-failure:
- my-package4
skip-haddock:
- my-package5
expect-haddock-failure:
- my-package6
~~~
## Non-project-specific configuration
Non-project configuration options can be included in a project-level
configuration file (`stack.yaml`, by default) or in global configuration files
(`config.yaml`). However, non-project-specific options in the project-level
configuration file in the `global-project` directory are ignored by Stack. The
options below are listed in alphabetic order.
### allow-different-user
[:octicons-tag-24: 1.0.1.0](https://github.com/commercialhaskell/stack/releases/tag/v1.0.1.0)
Restrictions: POSIX systems only.
Default: `false`
Command line equivalent (takes precedence): `--[no-]allow-different-user` flag
Allow users other than the owner of the [Stack root](stack_root.md) to use the
Stack installation.
~~~yaml
allow-different-user: true
~~~
The intention of this option is to prevent file permission problems, for example
as the result of a Stack command executed under `sudo`.
The option is automatically enabled when Stack is re-spawned in a Docker
process.
### allow-newer
[:octicons-tag-24: 0.1.8.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.8.0)
Default: `false`
Whether to ignore version bounds in Cabal files. This also ignores lower bounds.
The name `allow-newer` is chosen to match the commonly-used Cabal option.
~~~yaml
allow-newer: true
~~~
### allow-newer-deps
:octicons-beaker-24: Experimental
[:octicons-tag-24: 2.9.3](https://github.com/commercialhaskell/stack/releases/tag/v2.9.3)
Default: `none`
Determines a subset of packages to which `allow-newer` should apply. This option
has no effect (but warns) if `allow-newer` is `false`.
~~~yaml
allow-newer-deps:
- foo
- bar
~~~
### apply-ghc-options
[:octicons-tag-24: 0.1.6.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.6.0)
Default: `locals`
Related command line:
[`stack build --ghc-options`](build_command.md#-ghc-options-option) option
Determines to which packages any GHC command line options specified on the
command line are applied. Possible values are: `everything` (all packages,
project packages or otherwise), `locals` (all project packages, targets or
otherwise), and `targets` (all project packages that are targets).
!!! note
The use of `everything` can break invariants about your snapshot database.
!!! info
Before Stack 0.1.6.0, the default value was `targets`.
### apply-prog-options
[:octicons-tag-24: 2.11.1](https://github.com/commercialhaskell/stack/releases/tag/v2.11.1)
Default: `locals`
Related command line:
[`stack build --PROG-option`](build_command.md#-prog-option-options) options
Determines to which packages all and any `--PROG-option` command line options
specified on the command line are applied. Possible values are: `everything`
(all packages, project packages or otherwise), `locals` (all project packages,
targets or otherwise), and `targets` (all project packages that are targets).
!!! note
The use of `everything` can break invariants about your snapshot database.
### arch
Default: The machine architecture on which Stack is running.
Command line equivalent (takes precedence):
[`--arch`](global_flags.md#-arch-option) option
Stack identifies different GHC executables by platform (operating system and
machine architecture), (optional) GHC variant and (optional) GHC build.
See [`setup-info`](#setup-info).
`arch` sets the machine architecture. Values can be those recognized by Cabal
(the library) (which are case-insensitive and include `i386`, `x86_64`, and
`aarch64` / `arm64`), or other values (which are case-sensitive and treated as
an unknown 'other' architecture of the specified name).
By default, Stack will warn the user if the specified machine architecture is an
unknown 'other' architecture. The warning can be muted; see
[`notify-if-arch-unknown`](#notify-if-arch-unknown)
!!! note
The machine architecture on which Stack is running is as classified by
Cabal (the library). Cabal does not distinguish between certain
architectures. Examples are `ppc64`/`powerpc64`/`powerpc64le` (classified as
`ppc64`) and `arm`/`armel`/`armeb` (classified as `arm`).
!!! note
As Cabal (the library) does not distinguish between machine architectures
`powerpc64` and `powerpc64le`, the latter can be specified in Stack's
configuration as an 'other' architecture, such as `arch: ppc64le`.
### build
[:octicons-tag-24: 1.1.0](https://github.com/commercialhaskell/stack/releases/tag/v1.1.0)
Default:
~~~yaml
build:
library-profiling: false
executable-profiling: false
library-stripping: true
executable-stripping: true
# NOTE: global usage of haddock can cause build failures when documentation is
# incorrectly formatted. This could also affect scripts which use Stack.
haddock: false
haddock-arguments:
# Additional arguments passed to haddock. The corresponding command line
# option is --haddock-arguments. Example of use:
#
# haddock-args:
# - "--css=/home/user/my-css"
haddock-args: []
# The corresponding command line flag is --[no-]open.
open-haddocks: false
# If Stack is configured to build Haddock documentation, defaults to true.
haddock-deps: false
# The configuration is ignored, if haddock-for-hackage: true.
haddock-internal: false
# The configuration is ignored, if haddock-for-hackage: true.
haddock-hyperlink-source: true
# If specified, implies haddock-internal: false and
# haddock-hyperlink-source: true. Since Stack 2.15.1.
haddock-for-hackage: false
copy-bins: false
copy-compiler-tool: false
prefetch: false
keep-going: false
keep-tmp-files: false
# These are inadvisable to use in your global configuration, as they make the
# Stack build command line behave quite differently.
force-dirty: false
test: false
test-arguments:
rerun-tests: true # Rerun successful tests
# The corresponding command line option is --test-arguments. Example of use:
#
# additional-args:
# - "--fail-fast"
additional-args: []
coverage: false
no-run-tests: false
bench: false
benchmark-opts:
# Example of use:
#
# benchmark-arguments: "--csv bench.csv"
benchmark-arguments: ""
no-run-benchmarks: false
reconfigure: false
cabal-verbosity: normal
cabal-verbose: false
split-objs: false
skip-components: [] # --skip
# Since Stack 1.8. Starting with Stack 2.0, the default is true
interleaved-output: true
# Since Stack 2.13.1. Available options are none, count-only, capped and full.
progress-bar: capped
# Since Stack 1.10.
ddump-dir: ""
~~~
Command line equivalents (take precedence): Yes, see below.
Allows setting build options which are usually specified on the command line.
The meanings of these settings correspond directly with the command line flags
of the same name. For further information, see the
[`stack build` command](build_command.md) documentation and the
[users guide](GUIDE.md#the-build-command).
### casa
[:octicons-tag-24: 2.13.1](https://github.com/commercialhaskell/stack/releases/tag/v2.13.1)
Default:
~~~yaml
casa:
enable: true # Use a Casa server?
repo-prefix: https://casa.stackage.org # Unless casa-repo-prefix is set.
max-keys-per-request: 1280 # Maximum number of keys per request.
~~~
This option specifies whether or not Stack should use a Casa
(content-addressable storage archive) server to cache Cabal files and all other
files in packages; and, if so, the prefix for the URL used to pull information
from the server and the maximum number of keys per request. For further
information, see this blog post about
[Casa and Stack](https://www.fpcomplete.com/blog/casa-and-stack/).
`repo-prefix` replaces [`casa-repo-prefix`](#casa-repo-prefix) (which is
deprecated) and has precedence if both keys are set.
### casa-repo-prefix
[:octicons-tag-24: 2.3.1](https://github.com/commercialhaskell/stack/releases/tag/v2.3.1)
Deprecated in favour of [`casa`](#casa), which takes precedence if present.
Default: `https://casa.stackage.org`
This option specifies the prefix for the URL used to pull information from the
Casa server.
### color
Command line equivalent (takes precedence): `--color` option
This option specifies when to use color in output. The option is used as
`color: <WHEN>`, where `<WHEN>` is 'always', 'never', or 'auto'. On Windows
versions before Windows 10, for terminals that do not support color codes, the
default is 'never'; color may work on terminals that support color codes.
(The British English spelling (colour) is also accepted. In yaml configuration
files, the American spelling is the alternative that has priority.)
### compiler
[:octicons-tag-24: 0.1.8.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.8.0)
Command line equivalent (takes precedence): `--compiler` option
Overrides the compiler version in the snapshot. Note that the `compiler-check`
flag also applies to the version numbers. This uses the same syntax as compiler
snapshots like `ghc-9.6.5`. This can be used to override the compiler for a
Stackage snapshot, like this:
~~~yaml
snapshot: lts-22.21
compiler: ghc-9.6.4
compiler-check: match-exact
~~~
#### Building GHC from source
:octicons-beaker-24: Experimental
[:octicons-tag-24: 2.1.1](https://github.com/commercialhaskell/stack/releases/tag/v2.1.1)
Stack supports building the GHC compiler from source, using
[Hadrian](https://gitlab.haskell.org/ghc/ghc/blob/master/hadrian/README.md) (the
build system for GHC). The GHC version to build and to use is defined by a a Git
commit ID and a Hadrian "flavour", with the following syntax:
~~~yaml
compiler: ghc-git-<commit_id>-<Hadrian_flavour>
~~~
In the following example the commit ID is "5be7ad..." and the flavour is
"quick":
~~~yaml
compiler: ghc-git-5be7ad7861c8d39f60b7101fd8d8e816ff50353a-quick
~~~
By default, the code is retrieved from the main GHC repository. If you want to
select another repository, use the `compiler-repository` option:
~~~yaml
compiler-repository: git://my/ghc/repository
# default
# compiler-repository: https://gitlab.haskell.org/ghc/ghc.git
~~~
Stack does not check the compiler version when it uses a compiler built from
source. It is assumed that the built compiler is recent enough as Stack doesn't
enable any known workaround to make older compilers work.
Building the compiler can take a very long time (more than one hour). For faster
build times, use Hadrian flavours that disable documentation generation.
#### Bootstrap compiler
Building GHC from source requires a working GHC (known as the bootstrap
compiler). As we use a Stack based version of Hadrian (`hadrian/build-stack` in
GHC sources), the bootstrap compiler is configured into `hadrian/stack.yaml` and
fully managed by Stack.
!!! note
For some commit IDs, the snapshot specified in `hadrian/stack.yaml`
specifies a version of GHC that cannot be used to build GHC. This results in
GHC's `configure` script reporting messages similar to the following before
aborting:
~~~text
checking version of ghc... 9.0.2
configure: error: GHC version 9.2 or later is required to compile GHC.
~~~
The resolution is: (1) to specify an alternative snapshot (one that
specifies a sufficiently recent version of GHC) on the command line, using
Stack's option `--snapshot <snapshot>`. Stack will use that snapshot when
running GHC's `configure` script; and (2) to set the contents of the `STACK`
environment variable to be `stack --snapshot <snapshot>`. Hadrian's
`build-stack` script wil refer to that environment variable for the Stack
command it uses.
#### Hadrian prerequisites
The Hadrian build system has certain
[prerequisites](https://gitlab.haskell.org/ghc/ghc/-/wikis/building/preparation).
It requires certain versions of the `happy` and `alex` executables on the PATH.
Stack will build and install `happy` and `alex`, if not already on the PATH.
=== "macOS"
Hadrian requires, or case use, certain tools or Python packages that do not
come with macOS by default and that need to be installed using `brew` or
`pip3` (Python). Hadrian's LaTeX documentation also requires the
[DejaVu fonts](https://dejavu-fonts.github.io/) to be installed.
~~~zsh
brew install python@3.11
# GHC uses a Python script named `boot`.
brew install automake
# Tool for generating GNU Standards-compliant Makefiles.
brew install texinfo
# Official documentation format of the GNU project.
pip3 install -U sphinx
# Sphinx is the Python documentation generator.
brew install --cask mactex
# MacTeX: Full TeX Live distribution with GUI applications
~~~
=== "Windows"
Hadrian requires, or can use, certain MSYS2 or Python packages that do not
come with the Stack-supplied MSYS2 by default and need to be installed
using `pacman` (MSYS2) or `pip` (Python). Hadrian's LaTeX documentation also
requires the [DejaVu fonts](https://dejavu-fonts.github.io/) to be
installed.
~~~pwsh
stack exec -- pacman --sync --refresh
# Synchronize MSYS2 package databases
stack exec -- pacman --sync mingw-w64-x86_64-python-pip
# The PyPA recommended tool (pip) for installing Python packages. Also
# installs Python as a dependency. GHC uses a Python script named `boot`.
# The package must be the one from the `mingw64` MSYS2 repository, as Python
# from the `msys` repository cannot interpret Windows file paths correctly.
stack exec -- pacman --sync mingw-w64-x86_64-autotools
# The GNU autotools build system, including `autoreconf`, `aclocal`
# and `make`. GHC uses a sh script named `configure` which is itself created
# from a file named `configure.ac`.
stack exec -- pacman --sync patch
# A utility to apply patch files to original sources.
stack exec -- pacman --sync texinfo
# Utilities to work with and produce manuals, ASCII text, and on-line
# documentation from a single source file, including `makeinfo`.
stack exec -- pacman --sync mingw-w64-x86_64-ca-certificates
# Common CA (certificate authority) certificates.
stack exec -- pip install -U sphinx
# Sphinx is the Python documentation generator.
~~~
Hadrian may require certain LaTeX packages and may prompt for these to be
installed duing the build process.
#### Global packages
The GHC compiler you build from sources may depend on unreleased versions of
some global packages (e.g. Cabal). It may be an issue if a package you try to
build with this compiler depends on such global packages because Stack may not
be able to find versions of those packages (on Hackage, etc.) that are
compatible with the compiler.
The easiest way to deal with this issue is to drop the offending packages as
follows. Instead of using the packages specified in the snapshot, the global
packages bundled with GHC will be used.
~~~yaml
drop-packages:
- Cabal
- ...
~~~
Another way to deal with this issue is to add the relevant packages as
`extra-deps` built from source. To avoid mismatching versions, you can use
exactly the same commit id you used to build GHC as follows:
~~~
extra-deps:
- git: https://gitlab.haskell.org/ghc/ghc.git
commit: '5be7ad7861c8d39f60b7101fd8d8e816ff50353a'
subdirs:
- libraries/Cabal/Cabal
- libraries/...
~~~
### compiler-check
[:octicons-tag-24: 0.1.4.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.4.0)
Default: `match-minor`
Specifies how the compiler version in the snapshot is matched against concrete
versions. Valid values:
* `match-minor`: make sure that the first three components match, but allow
patch-level differences. For example< 7.8.4.1 and 7.8.4.2 would both match
7.8.4. This is useful to allow for custom patch levels of a compiler.
* `match-exact`: the entire version number must match precisely
* `newer-minor`: the third component can be increased, e.g. if your snapshot is
`ghc-7.10.1`, then 7.10.2 will also be allowed. This was the default up
through Stack 0.1.3
### concurrent-tests
[:octicons-tag-24: 0.1.2.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.2.0)
Default: `true`
This option specifies whether test suites should be executed concurrently with
each other. The default is `true` since this is usually fine and it often means
that tests can complete earlier. However, if some test suites require exclusive
access to some resource, or require a great deal of CPU or memory resources,
then it makes sense to set this to `false`.
~~~yaml
concurrent-tests: false
~~~
### configure-options
[:octicons-tag-24: 2.1.1](https://github.com/commercialhaskell/stack/releases/tag/v2.1.1)
Related command line (takes precedence):
[`stack build --PROG-option`](build_command.md#prog-option-options) options
`configure-options` can specify Cabal (the library) options (including
`--PROG-option` or `--PROG-options` options) for the configure step of the Cabal
build process for a named package, all project packages that are targets (using
the `$targets` key), all project packages (targets or otherwise) (using the
`$locals` key), or all packages (project packages or otherwise) (using the
`$everything` key).
~~~yaml
configure-options:
$everything:
- --with-gcc
- /some/path
$locals:
- --happy-option=--ghc
$targets:
# Only works on platforms where GHC supports linking against shared Haskell
# libraries:
- --enable-executable-dynamic
my-package:
- --another-flag
~~~
On platforms where GHC supports linking against shared Haskell libraries (that
currently excludes Windows), Cabal's `--enable-executable-dynamic` flag (which
implies `--enable-shared`, unless `--disable-shared` is specified) links
dependent Haskell libraries into executables dynamically.
### connection-count
Default: `8`
Integer indicating how many simultaneous downloads are allowed to happen.
### default-template
Default: `new-template` in the
[stack-templates](https://github.com/commercialhaskell/stack-templates/)
repository.
This option specifies which template to use with `stack new`, when none is
specified. Other templates are listed in the
[stack-templates](https://github.com/commercialhaskell/stack-templates/)
repository. See the output of `stack templates`.
### docker
Command line equivalents: `--docker-*` flags and options (see
`stack --docker-help` for details).
For further information, see the
[Docker integration](docker_integration.md#configuration) documentation.
### dump-logs
[:octicons-tag-24: 1.3.0](https://github.com/commercialhaskell/stack/releases/tag/v1.3.0)
Default: `warning`
Command line equivalent (takes precedence): `--[no-]dump-logs` flag
In the case of *non-interleaved* output and *more than one* target package,
Stack sends the build output from GHC for each target package to a log file,
unless an error occurs that prevents that. For further information, see the
[`stack build --[no-]interleaved-output` flag](build_command.md#-no-interleaved-output-flag)
documentation.
The value of the `dump-logs` key controls what, if any, log file content is sent
('dumped') to the standard error stream of the console at the end of the build.
Possible values are:
~~~yaml
dump-logs: none # don't dump the content of any log files
dump-logs: warning # dump the content of any log files that include GHC warnings
dump-logs: all # dump the content of all log files
~~~
At the command line, `--no-dump-logs` is equivalent to `dump-logs: none` and
`--dump-logs` is equivalent to `dump-logs: all`.
If GHC reports an error during the build and a log file is created, that build
output will be included in the log file. Stack will also report errors during
building to the standard error stream. That stream can be piped to a file. For
example, for a file named `stderr.log`:
~~~text
stack --no-dump-logs --color always build --no-interleaved-output 2> stderr.log
~~~
### extra-include-dirs
Default: `[]`
Command line equivalent: `--extra-include-dirs` option (repeat for each
directory)
A list of extra paths to be searched for header files. Paths should be absolute
~~~yaml
extra-include-dirs:
- /opt/foo/include
~~~
Since these are system-dependent absolute paths, it is recommended that you
specify these in your `config.yaml` file. If you control the build environment
in your project's ``stack.yaml``, perhaps through docker or other means, then it
may well make sense to include these there as well.
### extra-lib-dirs
Default: `[]`
Command line equivalent: `--extra-lib-dirs` option (repeat for each directory)
A list of extra paths to be searched for libraries. Paths should be absolute
~~~yaml
extra-lib-dirs:
- /opt/foo/lib
~~~
Since these are system-dependent absolute paths, it is recommended that you
specify these in your `config.yaml` file. If you control the build environment
in your project's ``stack.yaml``, perhaps through Docker or other means, then it
may well make sense to include these there as well.
### extra-path
[:octicons-tag-24: 0.1.4.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.4.0)
This option specifies additional directories to prepend to the PATH. These will
be used when resolving the location of executables, and will also be visible in
the PATH of processes run by Stack.
For example, to prepend `/path-to-some-dep/bin` to your PATH:
~~~yaml
extra-path:
- /path-to-some-dep/bin
~~~
Other paths added by Stack - things like the project's binary directory and the
compiler's binary directory - will take precedence over those specified here
(the automatic paths get prepended).
### ghc-build
[:octicons-tag-24: 1.3.0](https://github.com/commercialhaskell/stack/releases/tag/v1.3.0)
Default: `standard`
Command line equivalent (takes precedence): `--ghc-build` option
Stack identifies different GHC executables by platform (operating system and
machine architecture), (optional) GHC variant and (optional) GHC build.
See [`setup-info`](#setup-info).
`ghc-build` specifies a specialized architecture for the GHC executable.
Normally this is determined automatically, but it can be overridden. Possible
arguments include `standard`, `gmp4`, `nopie`, `tinfo6`, `tinfo6-libc6-pre232`,
`tinfo6-nopie`, `ncurses6`, `int-native` and `integersimple`.
### ghc-options
[:octicons-tag-24: 0.1.4.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.4.0)
Default: `{}`
Related command line (takes precedence):
[`stack build --ghc-options`](build_command.md#-ghc-options-option) option
GHC command line options can be specified for a package in its Cabal file
(including one created from a `package.yaml` file). This option augments and, if applicable (see below), overrides any such GHC command line options.
`ghc-options` can specify GHC command line options for a named package, all
project packages that are targets (using the `$targets` key), all project
packages (targets or otherwise) (using the `$locals` key), or all packages
(project packages or otherwise) (using the `$everything` key).
~~~yaml
ghc-options:
"$everything": -O2
"$locals": -Wall
"$targets": -Werror
some-package: -DSOME_CPP_FLAG
~~~
GHC's command line options are _order-dependent_ and evaluated from left to
right. Later options can override the effect of earlier ones. Stack applies
options (as applicable) in the order of `$everything`, `$locals`, `$targets`,
and then those for the named package. Any GHC command line options for a package
specified at Stack's command line are applied after those specified in Stack's
YAML configuration files.
Since Stack 1.6.1, setting a GHC options for a specific package will
automatically promote it to a project package (much like setting a custom
package flag). However, setting options via `$everything` on all flags will not
do so (see
[GitHub discussion](https://github.com/commercialhaskell/stack/issues/849#issuecomment-320892095)
for reasoning). This can lead to unpredictable behavior by affecting your
snapshot packages.
!!! info
Before Stack 1.6.1, the key `*` (then deprecated) had the same function as
the key `$everything`.
### ghc-variant
[:octicons-tag-24: 0.1.5.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.5.0)
Default: `standard`
Command line equivalent (takes precedence): `--ghc-variant` option
Stack identifies different GHC executables by platform (operating system and
machine architecture), (optional) GHC variant and (optional) GHC build.
See [`setup-info`](#setup-info).
`ghc-variant` specifies a variant of the GHC executable. Known values are:
* `standard`: Use the standard GHC binary distribution
* `int-native`: From GHC 9.4.1, use a GHC bindist that uses the Haskell-native
big-integer
[backend](https://downloads.haskell.org/~ghc/9.0.2/docs/html/users_guide/9.0.1-notes.html#highlights).
For further information, see this [article](https://iohk.io/en/blog/posts/2020/07/28/improving-haskells-big-numbers-support/).
* `integersimple`: Use a GHC bindist that uses
[integer-simple instead of GMP](https://ghc.haskell.org/trac/ghc/wiki/ReplacingGMPNotes)
* any other value: Use a custom GHC bindist. You should specify
[setup-info](#setup-info) or [setup-info-locations](#setup-info-locations)
so `stack setup` knows where to download it,
or pass the `stack setup --ghc-bindist` argument on the command-line
This option is incompatible with `system-ghc: true`.
### hackage-base-url
[:octicons-tag-24: 1.9.1](https://github.com/commercialhaskell/stack/releases/tag/v1.9.1)
Default: `https://hackage.haskell.org/`
Sets the address of the Hackage server to upload the package to.
~~~yaml
hackage-base-url: https://hackage.example.com/
~~~
### hide-source-paths
Default: `true`
([:octicons-tag-24: 2.1.1](https://github.com/commercialhaskell/stack/releases/tag/v2.1.1))
Whether to use the `-fhide-source-paths` option by default for GHC >= 8.2:
~~~yaml
hide-source-paths: false
~~~
Build output when enabled:
~~~text
...
[1 of 2] Compiling Lib
[2 of 2] Compiling Paths_test_pr
...
~~~
Build output when disabled:
~~~text
...
[1 of 2] Compiling Lib ( src/Lib.hs, .stack-work/dist/x86_64-linux-tinfo6/Cabal-2.4.0.1/build/Lib.o )
...
~~~
### hide-th-loading
Default: `true`
Strip out the "Loading ..." lines from GHC build output, produced when using
Template Haskell.
### ignore-revision-mismatch
(Removed 1.11)
This flag was introduced in Stack 1.6, and removed on the move to Pantry. You
will receive a warning if this configuration value is set.
### install-ghc
Default: `true`
([:octicons-tag-24: 1.5.0](https://github.com/commercialhaskell/stack/releases/tag/v1.5.0))
Command line equivalent (takes precedence): `--[no-]install-ghc` flag
Whether or not to automatically install GHC when necessary.
### jobs
Default: the number of CPUs (cores) that the machine has.
Command line equivalent (takes precedence):
[`-j`, `--jobs` option](global_flags.md#-jobs-or-j-option)
Specifies the number of concurrent jobs (principally, Stack actions during
building - see further below) to run.
When [building GHC from source](#building-ghc-from-source), specifies the
`-j[<n>]` flag of GHC's Hadrian build system.
In some circumstances, the default can cause some machines to run out of memory
during building. If those circumstances arise, specify `jobs: 1`.
This configuration option is distinct from GHC's own `-j[<n>]` flag, which
relates to parallel compilation of modules within a package.
### local-bin-path
Default (on Unix-like operating systems): `~/.local/bin`
Default (on Windows): `%APPDATA%\local\bin`
Command line equivalent (takes precedence): `--local-bin-path` option
Specifies the target directory for
[`stack build --copy-bins`](build_command.md#-no-copy-bins-flag) and
`stack install`. An absolute or relative path can be specified.
If the project-level configuration is provided in the `global-project` directory
in the [Stack root](stack_root.md), a relative path is assumed to be relative to
the current directory. Otherwise, it is assumed to be relative to the directory
of the project-level configuration file.
### local-programs-path
[:octicons-tag-24: 1.3.0](https://github.com/commercialhaskell/stack/releases/tag/v1.3.0)
This overrides the location of the Stack 'programs' directory, where tools like
GHC get installed. The path must be an absolute one.
Stack's defaults differ between Unix-like operating systems and Windows.
=== "Unix-like"
Default: `programs` directory in the [Stack root](stack_root.md).
=== "Windows"
Default: `%LOCALAPPDATA%\Programs\stack`, if the `%LOCALAPPDATA%`
environment variable exists. Otherwise, the `programs` directory in the
[Stack root](stack_root.md).
The MSYS2 tool is also installed in the Stack 'programs' directory.
!!! warning
If there is a space character in the path to Stack's 'programs'
directory this may cause problems with building packages that make use
of the GNU project's `autoconf` package and `configure` shell script
files. That may be the case particularly if there is no corresponding
short name ('8 dot 3' name) for the directory in the path with the space
(which may be the case if '8 dot 3' names have been stripped or their
creation not enabled by default). If there are problems building, it
will be necessary to specify an alternative path that does not contain
space characters. Examples of packages on Hackage that make use of
`configure` are `network` and `process`.
### modify-code-page
[:octicons-tag-24: 0.1.6.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.6.0)
Restrictions: Windows systems only.
Default: `true`
Command line equivalent (takes precedence): `--[no-]modify-code-page` flag
Whether to modify the code page for UTF-8 output.
~~~yaml
modify-code-page: false
~~~
### nix
[:octicons-tag-24: 0.1.10.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.10.0)
Default:
~~~yaml
nix:
enable: false # Except on NixOS, where `enable: true`
pure: true
packages: []
shell-file:
nix-shell-options: []
path: []
add-gc-roots: false
~~~
Command line equivalents: `--nix-*` flags and options (see `stack --nix-help`
for details).
For further information, see the
[Nix integration](nix_integration.md#configuration) documentation.
### notify-if-arch-unknown
[:octicons-tag-24: 2.15.1](https://github.com/commercialhaskell/stack/releases/tag/v2.15.1)
Default: `true`
If the specified machine architecture value is unknown to Cabal (the library),
should Stack notify the user of that?
### notify-if-cabal-untested
[:octicons-tag-24: 2.15.1](https://github.com/commercialhaskell/stack/releases/tag/v2.15.1)
Default: `true`
If Stack has not been tested with the version of Cabal (the library) that has
been found, should Stack notify the user of that?
### notify-if-ghc-untested
[:octicons-tag-24: 2.15.1](https://github.com/commercialhaskell/stack/releases/tag/v2.15.1)
Default: `true`
If Stack has not been tested with the version of GHC that is being used, should
Stack notify the user of that?
### notify-if-nix-on-path
[:octicons-tag-24: 2.15.1](https://github.com/commercialhaskell/stack/releases/tag/v2.15.1)
Default: `true`
If Stack's integration with the Nix package manager is not enabled, should Stack
notify the user if a `nix` executable is on the PATH?
### package-index
[:octicons-tag-24: 2.9.3](https://github.com/commercialhaskell/stack/releases/tag/v2.9.3)
Default:
~~~yaml
package-index:
download-prefix: https://hackage.haskell.org/
hackage-security:
keyids:
- 0a5c7ea47cd1b15f01f5f51a33adda7e655bc0f0b0615baa8e271f4c3351e21d
- 1ea9ba32c526d1cc91ab5e5bd364ec5e9e8cb67179a471872f6e26f0ae773d42
- 2c6c3627bd6c982990239487f1abd02e08a02e6cf16edb105a8012d444d870c3
- 51f0161b906011b52c6613376b1ae937670da69322113a246a09f807c62f6921
- fe331502606802feac15e514d9b9ea83fee8b6ffef71335479a2e68d84adc6b0
key-threshold: 3
ignore-expiry: true
~~~
Takes precedence over the `package-indices` key, which is deprecated.
Specify the package index. The index must use the
[Hackage Security](https://hackage.haskell.org/package/hackage-security) format.
This setting is most useful for providing a mirror of the official Hackage
server for
* bypassing a firewall; or
* faster downloads.
If the setting specifies an index that does not mirror Hackage, it is likely
that will result in significant breakage, including most snapshots failing to
work.
In the case of Hackage, the keys of its root key holders are contained in the
`haskell-infra/hackage-root-keys`
[repository](https://github.com/haskell-infra/hackage-root-keys). The Hackage
package index is signed. A signature is valid when three key holders have
signed. The Hackage timestamp is also signed. A signature is valid when one key
holder has signed.
If the `hackage-security` key is absent, the Hackage Security configuration will
default to that for the official Hackage server.
`key-threshold` specifies the minimum number of keyholders that must have signed
the package index for it to be considered valid.
`ignore-expiry` specifies whether or not the expiration of timestamps should be
ignored.
### package-indices
[:octicons-tag-24: 2.1.1](https://github.com/commercialhaskell/stack/releases/tag/v2.1.1)
Deprecated in favour of [`package-index`](#package-index), which takes
precedence if present.
Default:
~~~yaml
package-indices:
- download-prefix: https://hackage.haskell.org/
hackage-security:
keyids:
- 0a5c7ea47cd1b15f01f5f51a33adda7e655bc0f0b0615baa8e271f4c3351e21d
- 1ea9ba32c526d1cc91ab5e5bd364ec5e9e8cb67179a471872f6e26f0ae773d42
- 2c6c3627bd6c982990239487f1abd02e08a02e6cf16edb105a8012d444d870c3
- 51f0161b906011b52c6613376b1ae937670da69322113a246a09f807c62f6921
- fe331502606802feac15e514d9b9ea83fee8b6ffef71335479a2e68d84adc6b0
key-threshold: 3
ignore-expiry: true
~~~
!!! info
Before Stack 2.1.3, the default for `ignore-expiry` was `false`. For more
information, see
[issue #4928](https://github.com/commercialhaskell/stack/issues/4928).
!!! info
Before Stack 2.1.1, Stack had a different approach to `package-indices`. For
more information, see
[issue #4137](https://github.com/commercialhaskell/stack/issues/4137).
Specify the package index. For further information, see the `package-index`
[documentation](#package-index).
### pvp-bounds
[:octicons-tag-24: 0.1.5.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.5.0)
Default: `none`
Command line equivalent (takes precedence): `stack sdist --pvp-bounds` option or
`stack upload --pvp-bounds` option
!!! warning
As of Stack 1.6.0, this feature does not reliably work, due to issues with
the Cabal library's printer. Stack will generate a warning when a lossy
conversion occurs, in which case you may need to disable this setting. For
further information, see issue
[#3550](https://github.com/commercialhaskell/stack/issues/3550).
When using the `sdist` and `upload` commands, this setting determines whether
the Cabal file's dependencies should be modified to reflect PVP lower and upper
bounds.
#### Basic use
Values are `none` (unchanged), `upper` (add upper bounds), `lower` (add
lower bounds), and both (and upper and lower bounds). The algorithm Stack
follows is:
* If an upper or lower bound (other than `>= 0` - 'any version') already exists
on a dependency, it is left alone
* When adding a lower bound, Stack looks at the current version specified by
`stack.yaml`, and sets it as the lower bound (e.g., `foo >= 1.2.3`)
* When adding an upper bound, Stack sets it as less than the next major version
(e.g., `foo < 1.3`)
~~~yaml
pvp-bounds: none
~~~
For further information, see the announcement
[blog post](https://www.fpcomplete.com/blog/2015/09/stack-pvp).
#### Use with Cabal file revisions
[:octicons-tag-24: 1.5.0](https://github.com/commercialhaskell/stack/releases/tag/v1.5.0)
Each of the values listed above supports adding `-revision` to the end of the
value, e.g. `pvp-bounds: both-revision`. This means that, when uploading to
Hackage, Stack will first upload your tarball with an unmodified Cabal file, and
then upload a Cabal file revision with the PVP bounds added.
This can be useful - especially combined with the
[Stackage no-revisions feature](http://www.snoyman.com/blog/2017/04/stackages-no-revisions-field) -
as a method to ensure PVP compliance without having to proactively fix bounds
issues for Stackage maintenance.
### recommend-stack-upgrade
[:octicons-tag-24: 2.1.1](https://github.com/commercialhaskell/stack/releases/tag/v2.1.1)
Default: `true`
When Stack notices that a new version of Stack is available, should it notify
the user?
### rebuild-ghc-options
[:octicons-tag-24: 0.1.6.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.6.0)
Default: `false`
Should Stack rebuild a package when its GHC options change?
The default value reflects that, in most cases, GHC options are used to affect
optimization levels and warning behavior, for which GHC does not recompile the
modules.
!!! info
Before Stack 0.1.6.0, Stack rebuilt a package when its GHC options changed.
### require-stack-version
Default: `"-any"`
Require a version of Stack within the specified range
([cabal-style](https://www.haskell.org/cabal/users-guide/developing-packages.html#build-information))
to be used for this project. Example: `require-stack-version: "== 0.1.*"`
### save-hackage-creds
[:octicons-tag-24: 1.5.0](https://github.com/commercialhaskell/stack/releases/tag/v1.5.0)
Default: `true`
Controls whether, when using `stack upload`, the user's Hackage username and
password are stored in a local file.
~~~yaml
save-hackage-creds: true
~~~
### setup-info
[:octicons-tag-24: 0.1.5.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.5.0)
The `setup-info` dictionary specifies download locations for tools to be
installed during set-up, such as GHC or, on Windows, 7z and MSYS2. The
dictionary maps `('Tool', 'Platform', 'Version')` to the location where it can
be obtained. For example, mapping `(GHC, 64-bit Windows, 9.2.3)` to the URL
hosting the archive file for GHC's installation.
Possible usages of this configuration option are:
1. Using Stack offline or behind a firewall.
2. Extending the tools known to Stack, such as cutting-edge versions of GHC or
builds for custom Linux distributions (for use with the
[ghc-variant](#ghc-variant) option).
By default, Stack obtains the dictionary from
[stack-setup-2.yaml](https://github.com/commercialhaskell/stackage-content/raw/master/stack/stack-setup-2.yaml).
The `setup-info` dictionary is constructed in the following order:
1. `setup-info` in the YAML configuration - inline configuration
2. `--setup-info-yaml` command line arguments - URLs or paths. Multiple
locations may be specified.
3. `setup-info-locations` in the YAML configuration - URLs or paths. See further
below.
The format of this key is the same as in the default
[stack-setup-2.yaml](https://github.com/commercialhaskell/stackage-content/raw/master/stack/stack-setup-2.yaml).
For example, GHC 9.2.3 of custom variant `myvariant` (see further below) on
64-bit Windows:
~~~yaml
setup-info:
ghc:
windows64-custom-myvariant:
9.2.3:
url: "https://example.com/ghc-9.2.3-x86_64-unknown-mingw32-myvariant.tar.xz"
~~~
'Platforms' are pairs of an operating system and a machine architecture (for
example, 32-bit i386 or 64-bit x86-64) (represented by the
`Cabal.Distribution.Systems.Platform` type). Stack currently (version 2.15.1)
supports the following pairs in the format of the `setup-info` key:
|Operating system|I386 arch|X86_64 arch|Other machine architectures |
|----------------|---------|-----------|------------------------------------------------------------|
|Linux |linux32 |linux64 |AArch64: linux-aarch64, Arm: linux-armv7, Sparc: linux-sparc|
|OSX |macosx |macosx | |
|Windows |windows32|windows64 | |
|FreeBSD |freebsd32|freebsd64 |AArch64: freebsd-aarch64 |
|OpenBSD |openbsd32|openbsd64 | |
For GHC, the distinguishing 'Version' in the key format includes a 'tag' for
any (optional) GHC variant (see [ghc-variant](#ghc-variant)) and a further 'tag'
for any (optional) specialised GHC build (see [ghc-build](#ghc-build)).
The optional variant 'tag' is either `-integersimple` or
`-custom-<custom_variant_name>`.
For example, for GHC 9.0.2 of specialised GHC build `tinfo6` on x86_64 Linux:
~~~yaml
setup-info:
ghc:
linux64-tinfo6:
9.0.2:
url: "http://downloads.haskell.org/~ghc/9.0.2/ghc-9.0.2a-x86_64-fedora27-linux.tar.xz"
content-length: 237286244
sha1: affc2aaa3e6a1c446698a884f56a0a13e57f00b4
sha256: b2670e9f278e10355b0475c2cc3b8842490f1bca3c70c306f104aa60caff37b0
~~~
On Windows, the required 7z executable and DLL tools are represented in the
format of the `setup-info` key simply by `sevenzexe-info` and `sevenzdll-info`.
This configuration **adds** the specified setup information metadata to the
default. Specifying this configuration **does not** prevent the default
[stack-setup-2.yaml](https://github.com/commercialhaskell/stackage-content/raw/master/stack/stack-setup-2.yaml)
from being consulted as a fallback. If, however, you need to **replace** the
default `setup-info` dictionary, use the following:
~~~yaml
setup-info-locations: []
~~~
### setup-info-locations
[:octicons-tag-24: 2.3.1](https://github.com/commercialhaskell/stack/releases/tag/v2.3.1)
Command line equivalent (takes precedence): `--setup-info-yaml` option
By way of introduction, see the [`setup-info`](#setup-info) option. This option
specifies the location(s) of `setup-info` dictionaries.
The first location which provides a dictionary that specifies the location of a
tool - `('Tool', 'Platform', 'Version')` - takes precedence. For example, you
can extend the default tools, with a fallback to the default `setup-info`
location, as follows:
~~~yaml
setup-info-locations:
- C:/stack-offline/my-stack-setup.yaml
- relative/inside/my/project/setup-info.yaml
- \\smbShare\stack\my-stack-setup.yaml
- http://stack-mirror.com/stack-setup.yaml
# Fallback to the default location
- https://github.com/commercialhaskell/stackage-content/raw/master/stack/stack-setup-2.yaml
~~~
Stack only refers to the default `setup-info` location if no locations are
specified in the `setup-info-locations` configuration or on the command line
using the `--setup-info-yaml` option.
For example, both of the following will cause `stack setup` not to consult the
default `setup-info` location:
~~~yaml
setup-info-locations:
- C:/stack-offline/my-stack-setup.yaml
~~~
and
~~~yaml
setup-info-locations: []
~~~
Relative paths are resolved relative to the `stack.yaml` file (either the one in
the local project or the global `stack.yaml`).
Relative paths may also be used for the installation paths to tools (such as GHC
or 7z). This allows vendoring the tools inside a monorepo (a single repository
storing many projects). For example:
Directory structure:
~~~text
- src/
- installs/
- my-stack-setup.yaml
- 7z.exe
- 7z.dll
- ghc-9.2.3.tar.xz
- stack.yaml
~~~
In the project's `stack.yaml`:
~~~yaml
setup-info-locations:
- installs/my-stack-setup.yaml
~~~
In `installs/my-stack-setup.yaml`:
~~~yaml
sevenzexe-info:
url: "installs/7z.exe"
sevenzdll-info:
url: "installs/7z.dll"
ghc:
windows64:
9.2.3:
url: "installs/ghc-9.2.3.tar.xz"
~~~
### skip-ghc-check
Default: `false`
Command line equivalent (takes precedence): `--[no-]skip-ghc-check` flag
Should we skip the check to confirm that your system GHC version (on the PATH)
matches what your project expects?
### skip-msys
[:octicons-tag-24: 0.1.2.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.2.0)
Restrictions: Windows systems only
Default: `false`
Command line equivalent (takes precedence):
[`--[no-]skip-msys`](global_flags.md#-no-skip-msys-option) flag
Skips checking for the Stack-supplied MSYS2 (and installing that MSYS2, if it is
not installed) when Stack is setting up the environment.
~~~yaml
skip-msys: true
~~~
!!! note
Usually, the use of this option does not make sense in project-level
configuration and it is used only in global configuration.
### snapshot-location-base
[:octicons-tag-24: 2.5.1](https://github.com/commercialhaskell/stack/releases/tag/v2.5.1)
Default: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/
(as set in the `pantry` library)
Command line equivalent (takes precedence): `--snapshot-location-base` option
Sets the base location of the LTS Haskell or Stackage Nightly snapshots.
For example:
~~~yaml
snapshot-location-base: https://example.com/snapshots/location/
~~~
has the following effect:
* `lts-X.Y` expands to `https://example.com/snapshots/location/lts/X/Y.yaml`
* `nightly-YYYY-MM-DD` expands to
`https://example.com/snapshots/location/nightly/YYYY/M/D.yaml`
This key is convenient in setups that restrict access to GitHub, for instance
closed corporate setups. In this setting, it is common for the development
environment to have general access to the internet, but not for testing/building
environments. To avoid the firewall, one can run a local snapshots mirror and
then use a custom `snapshot-location-base` in the closed environments only.
### stack-colors
Command line equivalent (takes precedence): `--stack-colors` option
Stack uses styles to format some of its output. The default styles do not work
well with every terminal theme. This option specifies Stack's output styles,
allowing new styles to replace the defaults. The option is used as
`stack-colors: <STYLES>`, where `<STYLES>` is a colon-delimited sequence of
key=value, 'key' is a style name and 'value' is a semicolon-delimited list of
'ANSI' SGR (Select Graphic Rendition) control codes (in decimal). Use the
command `stack ls stack-colors --basic` to see the current sequence.
The 'ANSI' standards refer to (1) standard ECMA-48 'Control Functions for Coded
Character Sets' (5th edition, 1991); (2) extensions in ITU-T Recommendation
(previously CCITT Recommendation) T.416 (03/93) 'Information Technology – Open
Document Architecture (ODA) and Interchange Format: Character Content
Architectures' (also published as ISO/IEC International Standard 8613-6); and
(3) further extensions used by 'XTerm', a terminal emulator for the X Window
System. The 'ANSI' SGR codes are described in a
[Wikipedia article](http://en.wikipedia.org/wiki/ANSI_escape_code)
and those codes supported on current versions of Windows in
[Microsoft's documentation](https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences).
For example, users of the popular
[Solarized Dark](https://ethanschoonover.com/solarized/)
terminal theme might wish to set the styles as follows:
~~~yaml
stack-colors: error=31:good=32:shell=35:dir=34:recommendation=32:target=95:module=35:package-component=95:secondary=92:highlight=32
~~~
In respect of styles used in verbose output, some of that output occurs before
the configuration file is processed.
(The British English spelling (colour) is also accepted. In YAML configuration
files, the American spelling is the alternative that has priority.)
### stack-developer-mode
[:octicons-tag-24: 2.3.3](https://github.com/commercialhaskell/stack/releases/tag/v2.3.3)
Default (official distributed binaries): `false`
Default (built from source): `true`
Turns on a mode where some messages are printed at WARN level instead of DEBUG
level, especially useful for developers of Stack itself.
~~~yaml
stack-developer-mode: false
~~~
### system-ghc
Default: `false`, unless the [Docker](docker_integration.md) or
[Nix](nix_integration.md) integration is enabled.
Command line equivalent (takes precedence): `--[no-]system-ghc` flag
Enables or disables using the GHC available on the PATH. (Make sure PATH is
explicit, i.e., don't use ~.) Useful to enable if you want to save the time,
bandwidth or storage space needed to setup an isolated GHC.
In a Nix-enabled configuration, Stack is incompatible with `system-ghc: false`.
~~~yaml
# Turn on system GHC
system-ghc: true
~~~
### templates
Command line equivalent (takes precedence): `stack new --param <key>:<value>`
(or `-p`) option
Templates used with `stack new` have a number of parameters that affect the
generated code. These can be set for all new projects you create. The result of
them can be observed in the generated LICENSE and Cabal files. The value for all
of these parameters must be strings.
The parameters are: `author-email`, `author-name`, `category`, `copyright`,
`year` and `github-username`.
* _author-email_ - sets the `maintainer` property in Cabal
* _author-name_ - sets the `author` property in Cabal and the name used in
LICENSE
* _category_ - sets the `category` property in Cabal. This is used in Hackage.
For examples of categories see
[Packages by category](https://hackage.haskell.org/packages/). It makes sense
for `category` to be set on a per project basis because it is uncommon for all
projects a user creates to belong to the same category. The category can be
set per project by passing `-p "category:value"` to the `stack new` command.
* _copyright_ - sets the `copyright` property in Cabal. It is typically the
name of the holder of the copyright on the package and the year(s) from which
copyright is claimed. For example: `Copyright (c) 2023-2024 Joe Bloggs`
* _year_ - if `copyright` is not specified, `year` and `author-name` are used
to generate the copyright property in Cabal. If `year` is not specified, it
defaults to the current year.
* _github-username_ - used to generate `homepage` and `source-repository` in
Cabal. For instance `github-username: myusername` and
`stack new my-project new-template` would result:
~~~yaml
homepage: http://github.com/myusername/my-project#readme
source-repository head
type: git
location: https://github.com/myusername/my-project
~~~
These properties can be set in `config.yaml` as follows:
~~~yaml
templates:
params:
author-name: Your Name
author-email: youremail@example.com
category: Your Projects Category
copyright: 'Copyright (c) 2024 Your Name'
github-username: yourusername
~~~
Additionally, `stack new` can automatically initialize source control
repositories in the directories it creates. Source control tools can be
specified with the `scm-init` option. At the moment, only `git` is supported.
~~~yaml
templates:
scm-init: git
~~~
### urls
Default:
~~~yaml
urls:
latest-snapshot: https://stackage-haddock.haskell.org/snapshots.json
~~~
Customize the URLs where Stack looks for snapshot build plans.
!!! note
The default for Stack 1.3.0 to 2.15.3 was
https://s3.amazonaws.com/haddock.stackage.org/snapshots.json. Following the
handover of the Stackage project to the Haskell Foundation in
early 2024, the file at that URL may not be up to date. Users of those
versions of Stack should configure the URL to be the default above.
### with-gcc
Command line equivalent (takes precedence): `--with-gcc` option
Specify a path to GCC explicitly, rather than relying on the normal path
resolution.
~~~yaml
with-gcc: /usr/local/bin/gcc-5
~~~
### with-hpack
Command line equivalent (takes precedence): `--with-hpack` option
Use an [Hpack](https://github.com/sol/hpack) executable, rather than Stack's
in-built version of the Hpack functionality.
~~~yaml
with-hpack: /usr/local/bin/hpack
~~~
### work-dir
[:octicons-tag-24: 0.1.10.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.10.0)
Default: `.stack-work`
Command line equivalent (takes precedence):
[`--work-dir`](global_flags.md#-work-dir-option) option
Environment variable alternative (lowest precedence):
[`STACK_WORK`](environment_variables.md#stack_work)
`work-dir` specifies the path of Stack's work directory, within a local project
or package directory. The path must be a relative one, relative to the
root directory of the project or package. The relative path cannot include a
`..` (parent directory) component.
## Customisation scripts
### GHC installation customisation
[:octicons-tag-24: 2.9.1](https://github.com/commercialhaskell/stack/releases/tag/v2.9.1)
On Unix-like operating systems and Windows, Stack's installation procedure can
be fully customised by placing a `sh` shell script (a 'hook') in the
[Stack root](stack_root.md) directory at `hooks/ghc-install.sh`. On Unix-like
operating systems, the script file must be made executable. The script is run by
the `sh` application (which is provided by MSYS2 on Windows).
The script **must** return an exit code of `0` and the standard output **must**
be the absolute path to the GHC binary that was installed. Otherwise Stack will
ignore the script and possibly fall back to its own installation procedure.
The script is not run when `system-ghc: true`.
When `install-ghc: false`, the script is still run, which allows you to ensure
that only your script will install GHC and Stack won't default to its own
installation logic, even when the script fails.
The following environment variables are always available to the script:
* `HOOK_GHC_TYPE = "bindist" | "git" | "ghcjs"`
For "bindist", additional variables are:
* `HOOK_GHC_VERSION = <ver>`
For "git", additional variables are:
* `HOOK_GHC_COMMIT = <commit>`
* `HOOK_GHC_FLAVOR = <flavor>`
For "ghcjs", additional variables are:
* `HOOK_GHC_VERSION = <ver>`
* `HOOK_GHCJS_VERSION = <ver>`
An example script is:
~~~sh
#!/bin/sh
set -eu
case $HOOK_GHC_TYPE in
bindist)
# install GHC here, not printing to stdout, e.g.:
# command install $HOOK_GHC_VERSION >/dev/null
;;
git)
>&2 echo "Hook doesn't support installing from source"
exit 1
;;
*)
>&2 echo "Unsupported GHC installation type: $HOOK_GHC_TYPE"
exit 2
;;
esac
echo "location/to/ghc/executable"
~~~
If the following script is installed by GHCup, GHCup makes use of it, so that if
Stack needs a version of GHC, GHCup takes over obtaining and installing that
version:
~~~sh
#!/bin/sh
set -eu
case $HOOK_GHC_TYPE in
bindist)
ghcdir=$(ghcup whereis --directory ghc "$HOOK_GHC_VERSION" || ghcup run --ghc "$HOOK_GHC_VERSION" --install) || exit 3
printf "%s/ghc" "${ghcdir}"
;;
git)
# TODO: should be somewhat possible
>&2 echo "Hook doesn't support installing from source"
exit 1
;;
*)
>&2 echo "Unsupported GHC installation type: $HOOK_GHC_TYPE"
exit 2
;;
esac
~~~
|