summaryrefslogtreecommitdiff
path: root/scripts/makefile.build
blob: b5b9aebcfdd11711400e7f62860cdbc85be060d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
obj-y    :=
obj-m    :=
always   :=
targets  :=

src := $(patsubst %/,%,$(obj))

-include $(srctree)/.config
-include $(obj)Kbuild

ifdef lib-y
  export cflags-y
endif

ifdef bin-y
  export cflags-y
  export ldflags-y
endif

objects := $(filter %.o,$(obj-y))
subdirs := $(filter %/,$(obj-y))

cflags := $(cflags-y) $(KBUILD_CFLAGS)
asflags := $(asflags-y) $(KBUILD_ASFLAGS)
ldflags := $(ldflags-y) $(KBUILD_LDFLAGS)

collect-obj-y = $(foreach e,$(shell echo 'all:; @echo $$(obj-y)' | \
  $(MAKE) -f $(obj)$(1)Kbuild -f - --no-print-directory 2>/dev/null),\
  $(if $(filter %/,$(e)),$(addprefix $(e),$(call collect-obj-y,$(1)$(e))),$(e)))

ifdef lib-y
  subdir-objects := $(foreach d,$(subdirs),$(addprefix $(d),$(call collect-obj-y,$(d))))
  all-objects := $(objects) $(subdir-objects)
else ifdef bin-y
  subdir-objects := $(foreach d,$(subdirs),$(addprefix $(d),$(call collect-obj-y,$(d))))
  all-objects := $(objects) $(subdir-objects)
else
  all-objects := $(objects)
endif

c-sources := $(wildcard $(addprefix $(obj),$(objects:.o=.c)))
s-sources := $(wildcard $(addprefix $(obj),$(objects:.o=.s)))
subdir-c-sources := $(wildcard $(addprefix $(obj),$(subdir-objects:.o=.c)))
subdir-s-sources := $(wildcard $(addprefix $(obj),$(subdir-objects:.o=.s)))

PHONY := all

ifdef lib-y
all: $(obj)$(lib-y) $(addprefix $(obj),$(always))
$(obj)$(lib-y): $(addprefix $(obj),$(all-objects))
	$(MSG) AR "$@"
	$(Q)$(AR) rcs $@ $^
else ifdef bin-y
all: $(obj)$(bin-y) $(addprefix $(obj),$(always))

$(obj)$(bin-y): $(addprefix $(obj),$(all-objects)) $(libs-y) ${prereq}
	$(MSG) LD "$@"
	$(Q)$(LD) $(ldflags) -o $@ $^
else
all: $(addprefix $(obj),$(all-objects)) $(subdirs) $(addprefix $(obj),$(always))
endif

PHONY += clean clean-%
clean: $(addprefix clean-,$(subdirs))
ifdef targets
	$(info Cleaning targets: $(targets))
	$(Q)rm -f $(addprefix $(obj),$(targets))
endif
ifdef all-objects
	$(Q)rm -f $(addprefix $(obj),$(all-objects))
endif
ifdef lib-y
	$(Q)rm -f $(obj)$(lib-y)
endif
ifdef bin-y
	$(Q)rm -f $(obj)$(bin-y)
endif
ifdef always
	$(Q)rm -f $(addprefix $(obj),$(always))
endif

# Build C sources to objects
$(filter $(addprefix $(obj),$(all-objects)),$(c-sources:.c=.o) $(subdir-c-sources:.c=.o)): $(obj)%.o: $(obj)%.c
	$(MSG) CC "$@"
	$(Q)$(CC) $(cflags) -c $< -o $@

# Build assembly sources to objects
$(filter $(addprefix $(obj),$(all-objects)),$(s-sources:.s=.o) $(subdir-s-sources:.s=.o)): $(obj)%.o: $(obj)%.s
	$(MSG) AS "$@"
	$(Q)$(CC) $(asflags) -c $< -o $@

.PHONY: $(subdirs)
$(subdirs):
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.build obj="$(obj)$@"

clean-%:
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.build obj="$(obj)$*" clean

.PHONY: $(PHONY)