Skip to content

Latest commit

 

History

History
101 lines (77 loc) · 2.16 KB

File metadata and controls

101 lines (77 loc) · 2.16 KB

Makefile

Videos reference

target: dependencies command

Specials Vars:

$@ - reference of target
$< - first dependencie
$^ - all dependencies
$? - dependencies more recent than target
$* - file name without extension

Assignment Operator

  • = recursive assignment - reevaluation de la var a chaque appel ex:
FOO = $(BAR)
BAR = salut
echo $(FOO) == 'salut' => FOO sera reevaluer a chaque appel (pas fixe)
  • := simple expansion - var definie et assigner au meme moment (ne change pas / voir comme const) ex:
FOO := $(BAR)
BAR = salut
echo $(FOO) == '' => FOO ne vaut rien a sa declaration et ne changera pas si BAR change
  • != shell output ex:
FOO != find . -name *.c
=> return tous les fichiers en .c (litteralement le shell output)
  • ?= conditional assignment ex:
FOO ?= $(CC_FLAGS)
=> si FOO non defini alors on le definie par CC_FLAGS
  • += append to - append des elements a une var !! attention car les commentaires (#...) son in inclus dans l'append

Built in functions:

$(SRCS:.c=.o)
$(addrpefix build/, $(OBJS))
$(foreach D, includes_dir, -I$(D)) - iterate over list, create var D, from list, and return test you want (-I$(D)) 
   foreach exemple: 
     SRC = $(foreach D,$(SRC_DIRS),$(wildcard $(D)/*.c)
$(value (VARIABLE)) - print without expanding
$(shell ...) - run shell
$(error ...) - generate error
$(warning ...) - manage warning
$(info ...)

-MMD -MD ... gcc/clang dependencies

  • recompiler lorsque les headers sont modifies:
    • utiliser l'option -MMD des compilateurs gcc/clang -> generation de fichiers en .d
    • include ces fichiers dans le fichier Makefile:
DEP_FILES=$(files:.c=.d)
all: ...
...
-include $(DEP_FILES)

Order Only Prerequistie:

$(T): $(OBJ) | $(DIR) $(CMD2) ...  => avant l execution de la regle les regles doivent etre resolues ET une fois resolues, si elles sont modifies alors elles ne declenchent pas une nouvelle fois la commande $(T)
	$(DIR): ...
		...

Conditions in makefile

  • ifeq (a, b)
  • ifdef(a)
  • ifndef(a)