This article is used to understand and clarify Makefile deeply.

Ref:
CFLAGS – wiki
gcc – option summary
Implicit-Variables
GCC options
GCC indexs
automatic variables

CFLAG

  • CFLAGS is a Makefile variable that can be set to specify additional switches to be passed to a compiler in the process of building computer software.
  • CFLAGS is the list of flags to pass to the compilation.
  • CFLAGS is a variable that is most commonly used to add arguments to the compiler.
  • Extra flags to give to the C compiler.
  • 一個變數,用來傳一些參數給compiler,參數代表compiler功能的開關
  • 指定header file(.h文件)的路徑,如:CFLAGS=-I/usr/include -I/path/include

LDFLAG

  • Extra flags to give to compilers when they are supposed to invoke the linker, ‘ld’, such as -L. Libraries (-lfoo) should be added to the LDLIBS variable instead.

LDLIBS / LIBS

  • Library flags or names given to compilers when they are supposed to invoke the linker, ‘ld’. Non-library linker flags, such as -L, should go in the LDFLAGS variable.

GCC functions

  • $(foreach <var>,<list>,<text>)
    這個函數的意思是,把參數<list>中的單詞逐一取出放到參數<var>所指定的變量中,然後再執行<text>所包含的表達式。每一次<text>會返回一個字符串,循環過程中,<text>的所返回的每個字符串會以空格分隔,最後當整個循環結束時,<text>所返回的每個字符串所組成的整個字符串(以空格分隔)將會是foreach函數的返回值。
    所以,<var>最好是一個變量名,<list>可以是一個表達式,而<text>中一般會使用<var>這個參數來依次枚舉<list>中的單詞。舉個例子:
    names := a b c d
    files := $(foreach n,$(names),$(n).o)
    上面的例子中,$(name)中的單詞會被挨個取出,並存到變量「n」中,「$(n).o」每次根據「$(n)」計算出一個值,這些值以空格分隔,最後作為foreach函數的返回,所以,$(files)的值是「a.o b.o c.o d.o」。
    注意,foreach中的<var>參數是一個臨時的局部變量,foreach函數執行完後,參數<var>的變量將不在作用,其作用域只在foreach函數當中。
  • $(basename <names…>)
    名稱:取前綴函數——basename。
    功能:從文件名序列<names>中取出各個文件名的前綴部分。
    返回:返回文件名序列<names>的前綴序列,如果文件沒有前綴,則返回空字串。
    示例:$(basename src/foo.c src-1.0/bar.c hacks)返回值是「src/foo src-1.0/bar hacks」。
  • $(addsuffix <suffix>,<names…>)
    名稱:加後綴函數——addsuffix。
    功能:把後綴<suffix>加到<names>中的每個單詞後面。
    返回:返回加過後綴的文件名序列。
    示例:$(addsuffix .c,foo bar)返回值是「foo.c bar.c」。
  • $(addprefix <prefix>,<names…>)
    名稱:加前綴函數——addprefix。
    功能:把前綴<prefix>加到<names>中的每個單詞後面。
    返回:返回加過前綴的文件名序列。
    示例:$(addprefix src/,foo bar)返回值是「src/foo src/bar」。
  • $(wildcard pattern)
  • The argument pattern is a file name pattern, typically containing wildcard characters (as in shell file name patterns). The result of wildcard is a space-separated list of the names of existing files that match the pattern. See Using Wildcard Characters in File Names.

Leave a Reply

Close Menu