diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index cbb9e1c2..06da2b32 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,4 +1,4 @@ -name: Build +name: Build PDFs on: - push @@ -13,34 +13,44 @@ 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 @@ -48,18 +58,16 @@ jobs: 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 @@ -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 diff --git a/flake.nix b/flake.nix index 86a25f30..d983e7cf 100644 --- a/flake.nix +++ b/flake.nix @@ -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 { @@ -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 + ]; + }); }); }