- Most makefiles provide a target called
clean
. This isn’t intended to produce a file calledclean
, but instead to clean up any files that can be re-built by make. Think of it as a way to “undo” all of the build steps. Implement aclean
target for thepaper.pdf
Makefile
above. You will have to make the target phony. You may find thegit ls-files
subcommand useful. A number of other very common make targets are listed here.paper.pdf: paper.tex plot-data.png
pdflatex paper.tex
plot-%.png: %.dat plot.py
./plot.py -i $*.dat -o $@
.PHONY: clean
clean:
git ls-files -o | xargs rm -f
Explicitly declaring the target to be.PHONY
of which its dependency isclean
, it will forceclean
to be executed everytime, whereas without it asclean
is without dependence its recipe will not be executed if there happens to be a file namedclean
in the directory.
Rungit add -A
with theMakefile
defined as above andpaper.tex
,plot.py
(make sure to runchmod +x plot.py
to execute),data.dat
defined as in the lecture notes.git ls-files -o
is a command that list all files that are untracked by git. Undoing all of the build steps is equivalent to removing all untracked files i.e. the newly createdpaper.pdf
and other files created by themake paper.pdf
command, and therm -f
command can be pipelined. Runningmake clean
will be now our equivalent of “undo”.
2) Take a look at the various ways to specify version requirements for dependencies in Rust’s build system. Most package repositories support similar syntax. For each one (caret, tilde, wildcard, comparison, and multiple), try to come up with a use-case in which that particular kind of requirement makes sense.
- Caret requirements:
An update is allowed if the new version number does not modify the left-most non-zero digit in the major, minor, patch grouping. Examples better illustrate this:
```
^1.2.3 := >=1.2.3, <2.0.0
^1.2 := >=1.2.0, <2.0.0
^1 := >=1.0.0, <2.0.0
^0.2.3 := >=0.2.3, <0.3.0
^0.2 := >=0.2.0, <0.3.0
^0.0.3 := >=0.0.3, <0.0.4
^0.0 := >=0.0.0, <0.1.0
^0 := >=0.0.0, <1.0.0
```
An update is only allowed without a change in the major version if the caret requirement is specificed to be `python ^2.7.2`, for example. Any other minor or patch updates should be fine, but it should not update to anything of `python3`.
- Tilde requirements:
If you specify a major, minor, and patch version or only a major and minor version, only patch-level changes are allowed. If you only specify a major version, then minor- and patch-level changes are allowed.
```
~1.2.3 := >=1.2.3, <1.3.0
~1.2 := >=1.2.0, <1.3.0
~1 := >=1.0.0, <2.0.0
```
In essence, this is a stricter version of caret requirements. An update is only allowed in the patch version if the tilde requirement is specificed to be `python ~2.7.2`, for example. Any other updates beyond `python 2.8`, including `python3`, are prohibited.
* Wildcard requirements:
Wildcard requirements allow for any version where the wildcard is positioned. Much like regex logic.
```
* := >=0.0.0
1.* := >=1.0.0, <2.0.0
1.2.* := >=1.2.0, <1.3.0
```
Any update is allowed as long as the major version remains if the wildcard requirement is specificed to be `python 2.*`, for example. `python3`, however, is prohibited.
* Comparsion requirements:
Comparison requirements allow manually specifying a version range or an exact version to depend on. Quite straightforward.
```
>= 1.2.0
> 1
< 2
= 1.2.3
```
Any update is allowed if the comparison requirement is specificed to be `python >= 2.7`, for example. (Unless you regress instead of update) `python3` would also be allowed.
* Multiple requirements
Multiple version requirements can be separated with a comma, e.g., `>= 1.2, < 1.5`. This would be useful in setting an interval for version requirements for dependencies.
- Git can act as a simple CI system all by itself. In
.git/hooks
inside any git repository, you will find (currently inactive) files that are run as scripts when a particular action happens. Write apre-commit
hook that runsmake paper.pdf
and refuses the commit if themake
command fails. This should prevent any commit from having an unbuildable version of the paper.
To implement apre-commit
, overwritepre-commit.sample
in the./.git/hooks
folder and rename itpre-commit
.$ cd ./.git/hooks
$ vim pre-commit.samplepre-commit
:#!/bin/sh
For the purposes of testing,
if ! make paper.pdf ; then
echo "Cannot make paper.pdf"
exit 1
fichmod -x plot.py
to make it unexecutable and yield an error purposefully. It shows thepre-commit
hook successfully prevents any commit from having an unbuildable version of the paper.$ git commit -m 'failure test'
make: *** No rule to make target `paper.pdf'. Stop.
Cannot make paper.pdf
4) Set up a simple auto-published page using GitHub Pages. Add a GitHub Action to the repository to run shellcheck
on any shell files in that repository (here is one way to do it). Check that it works!
Go to the Github remote repository and click Settings. Scroll down and there is a Github Pages section. By default it will create a simple auto-published page that displays `README.md`. Tested it on my MIT missing semester repository. [(Link)](https://ivan-kim.github.io/MIT-missing-semester/)
Go to the Github remote repository and click Actions. Create a new workflow file `main.yml`. The workflow file could be like this.
```
name: Shellchecking
on:
push:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: shellcheck
uses: ludeeus/action-shellcheck@0.1.0
```
Then on the local terminal do `git pull origin master`. Try making a faulty `wrongshell.sh` file and push it to the Github repository. If there is a green check next to the commit message in the Actions tab, that means it should be working. Click on the `build` section with a green check on the left. Each step of the workflow is logged. The `shellcheck` subsection is where the `shellcheck` print messages are logged.
- Build your own GitHub action to run
proselint
orwrite-good
on all the.md
files in the repository. Enable it in your repository, and check that it works by filing a pull request with a typo in it.