aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/makefile-escaping.yml109
-rw-r--r--makefile_escaping/env_vars.mk15
-rw-r--r--makefile_escaping/prologue.mk6
-rw-r--r--makefile_escaping/quotes.mk11
-rw-r--r--makefile_escaping/quoting_args.mk8
-rw-r--r--makefile_escaping/shell.mk14
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))'