Skip to content

Commit

Permalink
Improvements in the Nix and build system. (#287)
Browse files Browse the repository at this point in the history
  • Loading branch information
drupol committed Feb 25, 2022
1 parent bfe7a1f commit d826d28
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 88 deletions.
87 changes: 40 additions & 47 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Build
name: Build PDFs

on:
- push
Expand All @@ -13,53 +13,61 @@ jobs:
steps:
- name: Set up Git repository
uses: actions/checkout@v2
with:
fetch-depth: 1

- name: Create global variables
id: version
run: echo "::set-output name=version::$(git rev-parse --short HEAD)"

determine-matrix:
name: Figure out the packages we need to build
runs-on: ubuntu-latest
needs: [dependencies]

outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}

steps:
- name: Set up Git repository
uses: actions/checkout@v2
with:
fetch-depth: 1

- name: Install the Nix package manager
uses: cachix/install-nix-action@v16

- id: set-matrix
run: |
echo "::set-output name=matrix::$(
nix eval --json --impure \
--expr 'builtins.attrNames (import ./.).packages.x86_64-linux'
)"
build:
name: Build documents
needs: dependencies
needs: determine-matrix
runs-on: ubuntu-latest
strategy:
matrix:
sources:
- input: ctfp
output:
reader: category-theory-for-programmers.pdf
print: category-theory-for-programmers-print.pdf
- input: ctfp-scala
output:
reader: category-theory-for-programmers-scala.pdf
print: category-theory-for-programmers-print-scala.pdf
- input: ctfp-reason
output:
reader: category-theory-for-programmers-reason.pdf
print: category-theory-for-programmers-print-reason.pdf
- input: ctfp-ocaml
output:
reader: category-theory-for-programmers-ocaml.pdf
print: category-theory-for-programmers-print-ocaml.pdf
packages: ${{fromJson(needs.determine-matrix.outputs.matrix)}}

steps:
- name: Set up Git repository
uses: actions/checkout@v2
with:
fetch-depth: 1

- name: Create necessary build file (version.tex)
run: |
echo -n -e "\\\newcommand{\OPTversion}{$(git rev-parse --short HEAD)}" > src/version.tex
- name: Install Nix
uses: cachix/install-nix-action@v16

- name: Build ${{ matrix.sources.input }}
- name: Build ${{ matrix.packages }}.pdf
run: |
nix build .#${{ matrix.sources.input }}
nix build .#${{ matrix.packages }}
mkdir -p out
cp -ar ./result/* out/
- name: Upload build assets (${{ matrix.sources.output.print }})
- name: Upload build assets (${{ matrix.packages }}.pdf)
uses: actions/upload-artifact@v2
with:
name: ctfp
Expand All @@ -86,39 +94,24 @@ jobs:
assets:
name: Upload release assets
runs-on: ubuntu-latest
needs: [dependencies, release]
needs: [determine-matrix, dependencies, release]
strategy:
matrix:
assets:
- source: category-theory-for-programmers-print.pdf
destination: category-theory-for-programmers--print
- source: category-theory-for-programmers.pdf
destination: category-theory-for-programmers
- source: category-theory-for-programmers-print-scala.pdf
destination: category-theory-for-programmers--print--scala
- source: category-theory-for-programmers-scala.pdf
destination: category-theory-for-programmers--reader--scala
- source: category-theory-for-programmers-print-ocaml.pdf
destination: category-theory-for-programmers--print--ocaml
- source: category-theory-for-programmers-ocaml.pdf
destination: category-theory-for-programmers--reader--ocaml
- source: category-theory-for-programmers-print-reason.pdf
destination: category-theory-for-programmers--print--reason
- source: category-theory-for-programmers-reason.pdf
destination: category-theory-for-programmers--reader--reason
packages: ${{fromJson(needs.determine-matrix.outputs.matrix)}}

steps:
- name: Download build assets (${{ matrix.assets.source }})
- name: Download build assets (${{ matrix.packages }}.pdf)
uses: actions/download-artifact@v2
with:
name: ctfp
path: ctfp

- name: Upload release assets (${{ matrix.assets.destination }}--${{ needs.dependencies.outputs.version }}.pdf)
- name: Upload release assets (${{ matrix.packages }}--${{ needs.dependencies.outputs.version }}.pdf)
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.release.outputs.upload_url }}
asset_path: ctfp/${{ matrix.assets.source }}
asset_name: ${{ matrix.assets.destination }}--${{ needs.dependencies.outputs.version }}.pdf
asset_path: ctfp/${{ matrix.packages }}.pdf
asset_name: ${{ matrix.packages }}--${{ needs.dependencies.outputs.version }}.pdf
asset_content_type: application/pdf
89 changes: 48 additions & 41 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
inputs.utils.url = "github:numtide/flake-utils";

outputs = { self, nixpkgs, utils }: utils.lib.eachDefaultSystem (system: let
pkgs = nixpkgs.legacyPackages.${system};
inherit (nixpkgs) lib;

pkgs = nixpkgs.legacyPackages.${system};

###########################################################################
# LaTeX Environment
texliveEnv = pkgs.texlive.combine {
Expand Down Expand Up @@ -86,57 +87,63 @@
propagatedBuildInputs = with pythonPkgs; [ pygments ];
};

pythonEnv = python.withPackages (
pyPkgs: with pyPkgs; [
pygments
pygments-style-github
]
);
pythonEnv = python.withPackages (p: [ p.pygments pygments-style-github ]);

mkPackageName = edition:
"ctfp${lib.optionalString (edition != null) "-${edition}"}";
commonAttrs = {
nativeBuildInputs = [ texliveEnv pythonEnv pkgs.which ];
FONTCONFIG_FILE = pkgs.makeFontsConf {
fontDirectories = with pkgs; [ inconsolata-lgc libertine libertinus ];
};
};

mkPackage = isShell: edition: pkgs.stdenv.mkDerivation {
name = mkPackageName edition;
src = if isShell then null else self;
mkLatex = variant: edition: let
maybeVariant = lib.optionalString (variant != null) "-${variant}";
maybeEdition = lib.optionalString (edition != null) "-${edition}";
variantStr = if variant == null then "reader" else variant;
suffix = maybeVariant + maybeEdition;
basename = "ctfp-${variantStr}${maybeEdition}";
version = self.shortRev or self.lastModifiedDate;
in pkgs.stdenv.mkDerivation (commonAttrs // {
inherit basename version;

makeFlags = [
"-C" "src" "OUTPUT_DIR=$(out)"
"GIT_VER=${self.rev or self.lastModifiedDate}"
];
name = "ctfp${suffix}-${version}";
fullname = "ctfp${suffix}";
src = "${self}/src";

buildFlags = lib.optional (edition != null) edition;
configurePhase = ''
echo -n "\\newcommand{\\OPTversion}{$version}" > version.tex
'';

dontInstall = true;
buildPhase = ''
latexmk -shell-escape -interaction=nonstopmode -halt-on-error \
-norc -jobname=ctfp -pdflatex="xelatex %O %S" -pdf "$basename.tex"
'';

FONTCONFIG_FILE = pkgs.makeFontsConf {
fontDirectories = with pkgs; [ inconsolata-lgc libertine libertinus ];
};
installPhase = "install -m 0644 -vD ctfp.pdf \"$out/$fullname.pdf\"";

buildInputs = with pkgs; [
# Misc. build tooling.
gnumake
git
python3Packages.virtualenv
which
# LaTeX Environment (with all associated libraries and packages).
texliveEnv
# Python Environment (with all associated libraries and packages).
pythonEnv
];
};
passthru.packageName = "ctfp${suffix}";
});

editions = [ null "scala" "ocaml" "reason" ];

variants = [ null "print" ];
in {
# Nix build
packages = lib.listToAttrs (map (edition: {
name = mkPackageName edition;
value = mkPackage false edition;
}) editions);

# nix build .#ctfp
# nix build .#ctfp-print
# nix build .#ctfp-print-ocaml
# etc etc
packages = lib.listToAttrs (lib.concatMap (variant: map (edition: rec {
name = value.packageName;
value = mkLatex variant edition;
}) editions) variants);

# nix build .
defaultPackage = self.packages.${system}.ctfp;

devShell = mkPackage true null;
# nix develop .
devShell = pkgs.mkShell (commonAttrs // {
nativeBuildInputs = commonAttrs.nativeBuildInputs ++ [
pkgs.git pkgs.gnumake
];
});
});
}

0 comments on commit d826d28

Please sign in to comment.