From da792f6afb36c4a03f51e618b64e6bd5e27fb3fd Mon Sep 17 00:00:00 2001 From: johannst Date: Tue, 26 Mar 2024 23:15:06 +0000 Subject: deploy: 0ccba0943d477b71cdccd2505eb81b95f091263a --- development/make.html | 116 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 111 insertions(+), 5 deletions(-) (limited to 'development/make.html') diff --git a/development/make.html b/development/make.html index b10075f..fbf72a3 100644 --- a/development/make.html +++ b/development/make.html @@ -190,7 +190,7 @@

Use make -p to print all rules and variables (implicitly + explicitly defined).

-

Pattern rules & Automatic variables

+

Pattern rules & variables

Pattern rules

A pattern rule contains the % char (exactly one of them) and look like this example:

%.o : %.c
@@ -243,6 +243,19 @@ bbb:
 
  • $(CURDIR): Path of current working dir after using make -C path
+

Multi-line variables

+
define my_var
+@echo foo
+@echo bar
+endef
+
+all:
+	$(my_var)
+
+

Running above Makefile gives:

+
foo
+bar
+

Arguments

Arguments specified on the command line override ordinary variable assignments in the makefile (overriding variables).

@@ -285,12 +298,105 @@ out := $(filter-out %.b %.c, $(in))

abspath

Resolve each file name as absolute path (don't resolve symlinks).

$(abspath fname1 fname2 ..)
+
+

realpath

+

Resolve each file name as canonical path.

+
$(realpath fname1 fname2 ..)
+
+

call (ref)

+

Invoke parametrized function, which is an expression saved in a variable.

+
swap = $(2) $(1)
+
+all:
+	@echo "call swap first second -> $(call swap,first,second)"
+
+

Outputs:

+
call swap first second -> second first
+
+

eval (ref)

+

Allows to define new makefile constructs by evaluating the result of a variable +or function.

+
define new_rule
+$(1):
+	@echo "$(1) -> $(2)"
+endef
+
+default: rule1 rule2
+
+$(eval $(call new_rule,rule1,foo))
+$(eval $(call new_rule,rule2,bar))
+
+

Outputs:

+
rule1 -> foo
+rule2 -> bar
+
+

foreach (ref)

+

Repeat a piece of text for a list of values, given the syntax $(foreach var,list,text).

+
myfn = x$(1)x
+
+default:
+	@echo $(foreach V,foo bar baz,$(call myfn,$(V)))
+
+

Outputs:

+
xfoox xbarx xbazx
+
+

Examples

+

Config based settings

+
conf-y      := default
+conf-$(FOO) := $(conf-y) foo
+conf-$(BAR) := $(conf-y) bar
+
+libs-y      := libdef
+libs-$(FOO) += libfoo
+libs-$(BAR) += libbar
+
+all:
+	@echo "conf-y: $(conf-y)"
+	@echo "libs-y: $(libs-y)"
+
+

Yields the following results.

+
$ make
+conf-y: default
+libs-y: libdef
+
+$ make FOO=y
+conf-y: default foo
+libs-y: libdef libfoo
+
+$ make BAR=y
+conf-y: default bar
+libs-y: libdef libbar
+
+$ make FOO=y BAR=y
+conf-y: default foo bar
+libs-y: libdef libfoo libbar
+
+

Using foreach / eval / call to generate new rules

+
define new_rule
+$(1):
+	@echo "$(1) -> $(2)"
+endef
 
-### `realpath`
-Resolve each file name as canonical path.
-```make
-$(realpath fname1 fname2 ..)
+arg-rule1 = foo
+arg-rule2 = bar
+
+RULES = rule1 rule2
+
+all: $(RULES)
+
+$(foreach R,$(RULES),$(eval $(call new_rule,$(R),$(arg-$(R)))))
+
+# equivalent to
+#   $(eval $(call new_rule,rule1,foo))
+#   $(eval $(call new_rule,rule2,bar))
 
+

Outputs:

+
rule1 -> foo
+rule2 -> bar
+
+
+

Use make -R -p to print the make database including the rules.

+
-- cgit v1.2.3