diff options
author | Egor Tensin <Egor.Tensin@gmail.com> | 2020-05-23 23:20:31 +0000 |
---|---|---|
committer | Egor Tensin <Egor.Tensin@gmail.com> | 2020-05-24 00:05:19 +0000 |
commit | 4b0959458c821ef26990fe1fe5931d552512526d (patch) | |
tree | bfd443f3a00207dac26c81ef7ccd2ce5bfe59449 | |
parent | add .gitattributes (diff) | |
download | blog-4b0959458c821ef26990fe1fe5931d552512526d.tar.gz blog-4b0959458c821ef26990fe1fe5931d552512526d.zip |
makefile_escaping: set up CI
-rw-r--r-- | .github/workflows/makefile-escaping.yml | 109 | ||||
-rw-r--r-- | makefile_escaping/env_vars.mk | 15 | ||||
-rw-r--r-- | makefile_escaping/prologue.mk | 6 | ||||
-rw-r--r-- | makefile_escaping/quotes.mk | 11 | ||||
-rw-r--r-- | makefile_escaping/quoting_args.mk | 8 | ||||
-rw-r--r-- | makefile_escaping/shell.mk | 14 |
6 files changed, 163 insertions, 0 deletions
diff --git a/.github/workflows/makefile-escaping.yml b/.github/workflows/makefile-escaping.yml new file mode 100644 index 0000000..e1a9af9 --- /dev/null +++ b/.github/workflows/makefile-escaping.yml @@ -0,0 +1,109 @@ +name: Escaping characters in Makefile + +on: [push, pull_request] + +jobs: + quoting_arguments: + name: Quoting arguments + runs-on: ubuntu-18.04 + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Make Makefile + run: | + cd makefile_escaping + cp prologue.mk Makefile + cat quoting_args.mk >> Makefile + - name: make test + run: | + cd makefile_escaping + diff <( echo "$expected" ) <( make test ) + env: + expected: |- + printf '%s\n' Same line? + Same + line? + printf '%s\n' 'Same line?' + Same line? + printf '%s\n' $test_var + Same + line? + printf '%s\n' "$test_var" + Same line? + escaping_quotes: + name: Escaping quotes + runs-on: ubuntu-18.04 + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Make Makefile + run: | + cd makefile_escaping + cp prologue.mk Makefile + cat quotes.mk >> Makefile + - name: make test + run: | + cd makefile_escaping + diff <( echo "$expected" ) <( make test ) + env: + expected: |- + printf '%s\n' 'Includes '\'' quote' + Includes ' quote + bash -c 'printf '\''%s\n'\'' '\''Includes '\''\'\'''\'' quote'\''' + Includes ' quote + bash -c 'bash -c '\''printf '\''\'\'''\''%s\n'\''\'\'''\'' '\''\'\'''\''Includes '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'' quote'\''\'\'''\'''\''' + Includes ' quote + shell_output: + name: Shell output + runs-on: ubuntu-18.04 + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Make Makefile + run: | + cd makefile_escaping + cp prologue.mk Makefile + cat shell.mk >> Makefile + - name: make test + run: | + cd makefile_escaping + diff <( echo "$expected_includes_quote" ) <( mkdir -p -- "Includes ' quote" && cd -- "Includes ' quote" && make -f ../Makefile test ) + diff <( echo "$expected_maybe_comment" ) <( mkdir -p -- 'Maybe a comment #' && cd -- 'Maybe a comment #' && make -f ../Makefile test ) + diff <( echo "$expected_variable_reference" ) <( mkdir -p -- 'Variable ${reference}' && cd -- 'Variable ${reference}' && make -f ../Makefile test ) + env: + expected_includes_quote: |- + Includes ' quote + Includes ' quote + Includes ' quote + Includes ' quote + expected_maybe_comment: |- + Maybe a comment # + Maybe a comment # + Maybe a comment # + Maybe a comment # + expected_variable_reference: |- + Variable ${reference} + Variable ${reference} + Variable ${reference} + Variable ${reference} + env_variables: + name: Environment variables + runs-on: ubuntu-18.04 + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Make Makefile + run: | + cd makefile_escaping + cp prologue.mk Makefile + cat env_vars.mk >> Makefile + - name: make test + run: | + cd makefile_escaping + diff <( echo "$expected" ) <( test_var="Quote ' "'and variable ${reference}' make test ) + env: + expected: |- + Quote ' and variable ${reference} + Quote ' and variable ${reference} + Quote ' and variable ${reference} + Quote ' and variable ${reference} diff --git a/makefile_escaping/env_vars.mk b/makefile_escaping/env_vars.mk new file mode 100644 index 0000000..47c1647 --- /dev/null +++ b/makefile_escaping/env_vars.mk @@ -0,0 +1,15 @@ +escape = $(subst ','\'',$(1)) +escape_var = $(call escape,$(value $(1))) + +test_var ?= This is safe. +export test_var + +echo_test_var := printf '%s\n' '$(call escape_var,test_var)' +bash_test_var := bash -c '$(call escape_var,echo_test_var)' + +.PHONY: test +test: + @printf '%s\n' '$(call escape_var,test_var)' + @printf '%s\n' "$$test_var" + @bash -c '$(call escape_var,echo_test_var)' + @bash -c '$(call escape_var,bash_test_var)' diff --git a/makefile_escaping/prologue.mk b/makefile_escaping/prologue.mk new file mode 100644 index 0000000..1c12914 --- /dev/null +++ b/makefile_escaping/prologue.mk @@ -0,0 +1,6 @@ +MAKEFLAGS += --warn-undefined-variables +.DEFAULT_GOAL := all +.DELETE_ON_ERROR: +.SUFFIXES: +SHELL := bash +.SHELLFLAGS := -e -o pipefail -c diff --git a/makefile_escaping/quotes.mk b/makefile_escaping/quotes.mk new file mode 100644 index 0000000..2d953f8 --- /dev/null +++ b/makefile_escaping/quotes.mk @@ -0,0 +1,11 @@ +escape = $(subst ','\'',$(1)) + +test_var := Includes ' quote + +echo_test_var := printf '%s\n' '$(call escape,$(test_var))' +bash_test_var := bash -c '$(call escape,$(echo_test_var))' + +test: + printf '%s\n' '$(call escape,$(test_var))' + bash -c '$(call escape,$(echo_test_var))' + bash -c '$(call escape,$(bash_test_var))' diff --git a/makefile_escaping/quoting_args.mk b/makefile_escaping/quoting_args.mk new file mode 100644 index 0000000..d27c81d --- /dev/null +++ b/makefile_escaping/quoting_args.mk @@ -0,0 +1,8 @@ +test_var := Same line? +export test_var + +test: + printf '%s\n' $(test_var) + printf '%s\n' '$(test_var)' + printf '%s\n' $$test_var + printf '%s\n' "$$test_var" diff --git a/makefile_escaping/shell.mk b/makefile_escaping/shell.mk new file mode 100644 index 0000000..36db8d8 --- /dev/null +++ b/makefile_escaping/shell.mk @@ -0,0 +1,14 @@ +escape = $(subst ','\'',$(1)) + +cwd := $(shell basename -- "$$( pwd )") +export cwd + +echo_cwd := printf '%s\n' '$(call escape,$(cwd))' +bash_cwd := bash -c '$(call escape,$(echo_cwd))' + +.PHONY: test +test: + @printf '%s\n' '$(call escape,$(cwd))' + @printf '%s\n' "$$cwd" + @bash -c '$(call escape,$(echo_cwd))' + @bash -c '$(call escape,$(bash_cwd))' |