2018-08-06 21:00:58 +03:00
#!/usr/bin/env bash
2018-05-14 00:25:41 +03:00
2020-06-23 18:47:43 +03:00
# NOTE: Script for the CI builds, relies on `default.nix` interface, which exposes Nixpkgs Haskell Lib interface
2020-05-27 17:42:58 +03:00
2020-06-23 19:41:38 +03:00
# The most strict error checking requirements
2020-05-31 19:34:39 +03:00
set -Eexuo pipefail
2020-06-23 18:49:29 +03:00
### NOTE: Section handles imports from env, these are settings for Nixpkgs.
2020-06-24 03:08:35 +03:00
### They use the `default.nix` interface, which exposes expose most of the Nixpkgs Haskell.lib API: https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/lib.nix
### Some of these options implicitly switch the dependent options.
### Documentation of this settings is mosly in `default.nix`, since most settings it Nixpkgs related
### Additional documentation is in Nixpkgs Haskell.lib: https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/lib.nix
2020-06-23 19:41:38 +03:00
2020-06-23 18:49:29 +03:00
2020-06-24 03:29:17 +03:00
# NOTE: If vars not imported - init the vars with default values
2020-06-23 21:06:02 +03:00
compiler = ${ compiler :- 'ghc8101' }
2020-05-31 19:34:39 +03:00
rev = ${ rev :- 'nixpkgs-unstable' }
2020-06-23 18:53:37 +03:00
# If NIX_PATH not imported - construct it from `rev`
2020-05-31 19:34:39 +03:00
NIX_PATH = ${ NIX_PATH :- " nixpkgs=https://github.com/nixos/nixpkgs/archive/ $rev .tar.gz " }
export NIX_PATH
2020-06-24 03:29:17 +03:00
# Project name, used by cachix
2020-06-23 19:09:01 +03:00
project = ${ project :- 'defaultProjectName' }
2020-06-17 15:51:28 +03:00
2020-06-17 15:51:48 +03:00
2020-06-17 15:48:13 +03:00
allowInconsistentDependencies = ${ allowInconsistentDependencies :- 'false' }
2020-05-31 19:34:39 +03:00
doJailbreak = ${ doJailbreak :- 'false' }
doCheck = ${ doCheck :- 'true' }
2020-06-24 03:05:05 +03:00
2020-06-17 15:54:38 +03:00
sdistTarball = ${ sdistTarball :- 'false' }
2020-05-31 19:34:39 +03:00
buildFromSdist = ${ buildFromSdist :- 'false' }
2020-06-24 03:05:05 +03:00
2020-06-17 15:48:13 +03:00
failOnAllWarnings = ${ failOnAllWarnings :- 'false' }
2020-05-31 19:34:39 +03:00
buildStrictly = ${ buildStrictly :- 'false' }
2020-06-24 03:05:05 +03:00
2020-06-17 15:54:38 +03:00
enableDeadCodeElimination = ${ enableDeadCodeElimination :- 'false' }
2020-05-31 19:34:39 +03:00
disableOptimization = ${ disableOptimization :- 'true' }
2020-06-17 15:54:38 +03:00
linkWithGold = ${ linkWithGold :- 'false' }
2020-06-24 03:05:05 +03:00
2020-06-17 15:48:13 +03:00
enableLibraryProfiling = ${ enableLibraryProfiling :- 'false' }
enableExecutableProfiling = ${ enableExecutableProfiling :- 'false' }
2020-06-17 15:54:38 +03:00
doTracing = ${ doTracing :- 'false' }
enableDWARFDebugging = ${ enableDWARFDebugging :- 'false' }
doStrip = ${ doStrip :- 'false' }
2020-06-24 03:05:05 +03:00
2020-06-17 15:54:38 +03:00
enableSharedLibraries = ${ enableSharedLibraries :- 'true' }
enableStaticLibraries = ${ enableStaticLibraries :- 'false' }
enableSharedExecutables = ${ enableSharedExecutables :- 'false' }
justStaticExecutables = ${ justStaticExecutables :- 'false' }
enableSeparateBinOutput = ${ enableSeparateBinOutput :- 'false' }
2020-06-24 03:05:05 +03:00
2020-06-17 15:48:13 +03:00
checkUnusedPackages = ${ checkUnusedPackages :- 'false' }
doHaddock = ${ doHaddock :- 'false' }
2020-06-23 20:31:39 +03:00
doHyperlinkSource = ${ doHyperlinkSource :- 'false' }
2020-06-17 15:48:13 +03:00
doCoverage = ${ doCoverage :- 'false' }
doBenchmark = ${ doBenchmark :- 'false' }
2020-05-31 19:34:39 +03:00
generateOptparseApplicativeCompletions = ${ generateOptparseApplicativeCompletions :- 'false' }
2020-06-23 19:41:38 +03:00
# [ "binary1" "binary2" ] - should pass " quotes into Nix interpreter
2020-06-17 19:40:21 +03:00
executableNamesToShellComplete = ${ executableNamesToShellComplete :- '[ "defaultBinaryName" ]' }
2020-06-24 03:05:05 +03:00
2020-06-17 15:54:38 +03:00
withHoogle = ${ withHoogle :- 'false' }
2020-06-23 19:41:38 +03:00
# Log file to dump GHCJS build into
2020-05-31 19:34:39 +03:00
ghcjsTmpLogFile = ${ ghcjsTmpLogFile :- '/tmp/ghcjsTmpLogFile.log' }
2020-06-23 19:41:38 +03:00
# Length of the GHCJS log tail (<40000)
2020-05-31 19:34:39 +03:00
ghcjsLogTailLength = ${ ghcjsLogTailLength :- '10000' }
2020-06-23 19:41:38 +03:00
# If key not provided (branch is not inside the central repo) - init CACHIX_SIGNING_KEY as empty
2020-05-31 22:30:24 +03:00
CACHIX_SIGNING_KEY = ${ CACHIX_SIGNING_KEY :- "" }
2020-05-31 19:34:39 +03:00
2020-05-27 17:50:11 +03:00
GHCJS_BUILD( ) {
# NOTE: Function for GHCJS build that outputs its huge log into a file
2020-06-24 03:29:17 +03:00
# Run the build into Log (log is too long for Travis)
2020-05-27 17:50:11 +03:00
" $@ " & > " $ghcjsTmpLogFile "
}
2020-05-27 17:50:33 +03:00
SILENT( ) {
2020-05-28 17:42:01 +03:00
# NOTE: Function that silences the build process
2020-05-27 17:50:33 +03:00
# In normal mode outputs only the /nix/store paths
echo " Log: $ghcjsTmpLogFile "
2020-06-24 03:29:17 +03:00
# Pass into the ghcjsbuild function the build command
2020-05-27 17:50:33 +03:00
if GHCJS_BUILD " $@ "
then
2020-06-24 03:29:17 +03:00
# Output log lines for stdout -> cachix caching
2020-05-27 17:50:33 +03:00
grep '^/nix/store/' " $ghcjsTmpLogFile "
else
2020-06-24 03:29:17 +03:00
# Output log lines for stdout -> cachix caching
2020-05-27 17:50:33 +03:00
grep '^/nix/store/' " $ghcjsTmpLogFile "
2020-06-24 03:29:17 +03:00
# Propagate the error state, fail the CI build
2020-05-27 17:50:33 +03:00
exit 1
fi
}
2020-05-28 00:57:48 +03:00
BUILD_PROJECT( ) {
2020-05-27 17:44:49 +03:00
2020-05-27 20:13:32 +03:00
2020-05-31 19:34:39 +03:00
IFS = $'\n\t'
2020-05-27 20:13:32 +03:00
2020-06-23 21:06:02 +03:00
if [ " $compiler " = "ghcjs" ]
2020-05-28 01:01:12 +03:00
then
2020-06-24 03:29:17 +03:00
# GHCJS build
2020-05-28 17:45:29 +03:00
# By itself, GHCJS creates >65000 lines of log that are >4MB in size, so Travis terminates due to log size quota.
2020-05-28 01:01:12 +03:00
# nixbuild --quiet (x5) does not work on GHC JS build
# So there was a need to make it build.
2020-05-28 17:45:29 +03:00
# The solution is to silence the stdout
2020-05-28 01:01:12 +03:00
# But Travis then terminates on 10 min no stdout timeout
# so HACK: SILENT wrapper allows to surpress the huge log, while still preserves the Cachix caching ability in any case of the build
# On build failure outputs the last 10000 lines of log (that should be more then enough), and terminates
2020-06-17 19:42:24 +03:00
SILENT nix-build \
--arg allowInconsistentDependencies " $allowInconsistentDependencies " \
2020-05-28 01:01:12 +03:00
--arg doJailbreak " $doJailbreak " \
--arg doCheck " $doCheck " \
2020-06-17 19:42:24 +03:00
--arg sdistTarball " $sdistTarball " \
2020-05-28 01:01:12 +03:00
--arg buildFromSdist " $buildFromSdist " \
2020-06-17 19:42:24 +03:00
--arg failOnAllWarnings " $failOnAllWarnings " \
2020-05-28 01:01:12 +03:00
--arg buildStrictly " $buildStrictly " \
2020-06-17 19:42:24 +03:00
--arg enableDeadCodeElimination " $enableDeadCodeElimination " \
2020-05-28 01:01:12 +03:00
--arg disableOptimization " $disableOptimization " \
2020-06-17 19:42:24 +03:00
--arg linkWithGold " $linkWithGold " \
--arg enableLibraryProfiling " $enableLibraryProfiling " \
--arg enableExecutableProfiling " $enableExecutableProfiling " \
--arg doTracing " $doTracing " \
--arg enableDWARFDebugging " $enableDWARFDebugging " \
--arg doStrip " $doStrip " \
--arg doHyperlinkSource " $doHyperlinkSource " \
--arg enableSharedLibraries " $enableSharedLibraries " \
--arg enableStaticLibraries " $enableStaticLibraries " \
--arg enableSharedExecutables " $enableSharedExecutables " \
--arg justStaticExecutables " $justStaticExecutables " \
--arg checkUnusedPackages " $checkUnusedPackages " \
--arg doCoverage " $doCoverage " \
--arg doHaddock " $doHaddock " \
--arg doBenchmark " $doBenchmark " \
2020-06-17 19:40:21 +03:00
--arg generateOptparseApplicativeCompletions " $generateOptparseApplicativeCompletions " \
--arg executableNamesToShellComplete " $executableNamesToShellComplete " \
2020-06-17 19:42:24 +03:00
--arg withHoogle " $withHoogle " \
2020-06-23 21:06:02 +03:00
" $compiler "
2020-05-28 01:01:12 +03:00
2020-05-28 01:00:14 +03:00
else
2020-06-24 03:29:17 +03:00
# Normal GHC build
# GHC sometimes produces logs so big - that Travis terminates builds, so multiple --quiet
2020-06-17 19:42:24 +03:00
nix-build \
--quiet --quiet \
2020-06-23 21:06:02 +03:00
--argstr compiler " $compiler " \
2020-06-17 19:42:24 +03:00
--arg allowInconsistentDependencies " $allowInconsistentDependencies " \
2020-05-28 01:00:14 +03:00
--arg doJailbreak " $doJailbreak " \
--arg doCheck " $doCheck " \
2020-06-17 19:42:24 +03:00
--arg sdistTarball " $sdistTarball " \
2020-05-28 01:00:14 +03:00
--arg buildFromSdist " $buildFromSdist " \
2020-06-17 19:42:24 +03:00
--arg failOnAllWarnings " $failOnAllWarnings " \
2020-05-28 01:00:14 +03:00
--arg buildStrictly " $buildStrictly " \
2020-06-17 19:42:24 +03:00
--arg enableDeadCodeElimination " $enableDeadCodeElimination " \
2020-05-28 01:00:14 +03:00
--arg disableOptimization " $disableOptimization " \
2020-06-17 19:42:24 +03:00
--arg linkWithGold " $linkWithGold " \
--arg enableLibraryProfiling " $enableLibraryProfiling " \
--arg enableExecutableProfiling " $enableExecutableProfiling " \
--arg doTracing " $doTracing " \
--arg enableDWARFDebugging " $enableDWARFDebugging " \
--arg doStrip " $doStrip " \
--arg doHyperlinkSource " $doHyperlinkSource " \
--arg enableSharedLibraries " $enableSharedLibraries " \
--arg enableStaticLibraries " $enableStaticLibraries " \
--arg enableSharedExecutables " $enableSharedExecutables " \
--arg justStaticExecutables " $justStaticExecutables " \
--arg checkUnusedPackages " $checkUnusedPackages " \
--arg doCoverage " $doCoverage " \
--arg doHaddock " $doHaddock " \
--arg doBenchmark " $doBenchmark " \
2020-06-17 19:40:21 +03:00
--arg generateOptparseApplicativeCompletions " $generateOptparseApplicativeCompletions " \
2020-06-17 19:42:24 +03:00
--arg executableNamesToShellComplete " $executableNamesToShellComplete " \
--arg withHoogle " $withHoogle "
2020-05-28 01:00:14 +03:00
fi
2020-05-28 00:57:48 +03:00
}
2020-05-28 00:57:13 +03:00
MAIN( ) {
2020-06-01 18:43:26 +03:00
2020-06-24 03:29:17 +03:00
# Overall it is useful to have in CI test builds the latest stable Nix
# 2020-06-24: HACK: Do not ask why different commands on Linux and macOS. IDK, wished they we the same. These are the only commands that worked on according platforms right after the fresh Nix installer rollout.
2020-06-24 01:53:16 +03:00
( nix-channel --update && nix-env -iA nixpkgs.nix) || ( sudo nix upgrade-nix)
2020-06-01 19:08:37 +03:00
2020-06-24 03:56:08 +03:00
# Report the Nixpkgs channel revision
nix-instantiate --eval -E 'with import <nixpkgs> {}; lib.version or lib.nixpkgsVersion'
2020-06-01 18:43:26 +03:00
2020-06-24 03:29:17 +03:00
# Secrets are not shared to PRs from forks
# nix-build | cachix push <project> - uploads binaries, runs&works only in the branches of the main repository, so for PRs - else case runs
2020-05-28 00:57:13 +03:00
if [ ! " $CACHIX_SIGNING_KEY " = "" ]
then
2020-06-24 03:29:17 +03:00
# Build of the inside repo branch - enable push Cachix cache
2020-06-23 19:09:01 +03:00
BUILD_PROJECT | cachix push " $project "
2020-05-28 00:57:13 +03:00
else
2020-06-24 03:29:17 +03:00
# Build of the side repo/PR - can not push Cachix cache
2020-05-28 00:57:13 +03:00
BUILD_PROJECT
fi
}
2020-06-24 03:29:17 +03:00
# Run the entry function of the script
2020-05-28 00:57:13 +03:00
MAIN