summaryrefslogtreecommitdiff
path: root/makefile
blob: 9feeb30f324959c7ea8bece161127fb50dc1a139 (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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
-include Kbuild

# Disable builti-n rules and variables
MAKEFLAGS += -r -R

# Disable output of entering/leaving directory messages
MAKEFLAGS += --no-print-directory

export MSG = @printf '\033[34m%-8s\033[0m %s\n'

this-makefile = $(lastword $(MAKEFILE_LIST))
srctree = $(realpath $(dir $(this-makefile)))

LLVM ?= 1
ifneq ($(LLVM),1)
  ifneq ($(filter %/,$(LLVM)),)
    LLVM_PREFIX = $(LLVM)
  else ifneq ($(filter -%,$(LLVM)),)
    LLVM_SUFFIX = $(LLVM)
  endif
endif

# Variables
ifeq ($(LLVM),1)
  CC      = $(LLVM_PREFIX)clang$(LLVM_SUFFIX)
  LD      = $(LLVM_PREFIX)ld.lld$(LLVM_SUFFIX)
  AR      = $(LLVM_PREFIX)llvm-ar$(LLVM_SUFFIX)
  STRIP   = $(LLVM_PREFIX)llvm-strip$(LLVM_SUFFIX)
else
  CC = $(CROSS_COMPILE)gcc
  LD = $(CROSS_COMPILE)ld
  AR = $(CROSS_COMPILE)ar
  STRIP = $(CROSS_COMPILE)strip
endif

ifndef ARCH
  ARCH := x86_64
endif

export CC LD AR STRIP CROSS_COMPILE ARCH

ifeq ($(V),1)
  Q :=
else
  Q := @
  MAKEFLAGS += -s
endif

ifdef M
  obj = $(M)/
endif

# CFLAGS

KBUILD_CFLAGS :=

KBUILD_CFLAGS += -Wall -Wextra
KBUILD_CFLAGS += -nostdinc
KBUILD_CFLAGS += -target $(ARCH)-linux-eabi
KBUILD_CFLAGS += -I$(srctree)/include
KBUILD_CFLAGS += -I$(srctree)/include/arch/$(ARCH)

KBUILD_CFLAGS += -std=c11
KBUILD_CFLAGS += -fno-common
KBUILD_CFLAGS += -fno-PIE
KBUILD_CFLAGS += -fstrict-aliasing

KBUILD_CFLAGS += -fno-delete-null-pointer-checks
KBUILD_CFLAGS += -flto

# Disable overflow optimizations
KBUILD_CFLAGS += -fno-strict-overflow

# Disable stack check
KBUILD_CFLAGS += -fno-stack-check

# Weird loops transformations to wcslen
KBUILD_CFLAGS += -fno-builtin-wcslen

KBUILD_ASFLAGS :=

# Assembly does not need -nostdinc; clang warns it is unused.
KBUILD_ASFLAGS += -target $(ARCH)-linux-eabi
KBUILD_ASFLAGS += -I$(srctree)/include
KBUILD_ASFLAGS += -I$(srctree)/include/arch/$(ARCH)

# LDFLAGS
KBUILD_LDFLAGS :=

KBUILD_LDFLAGS += --gc-sections
KBUILD_LDFLAGS += --build-id=none
KBUILD_LDFLAGS += --as-needed

PHONY :=

KCONFIG_CONFIG ?= .config

export Q srctree MAKEFLAGS KCONFIG_CONFIG \
       KBUILD_CFLAGS KBUILD_ASFLAGS KBUILD_LDFLAGS

all: $(srctree)/include/config/auto.conf $(srctree)/include/generated/autoconf.h
	$(Q)$(MAKE) -f scripts/makefile.build obj=$(obj)

clean:
	$(Q)$(MAKE) -f scripts/makefile.build obj=$(obj) clean
	$(Q)rm -f $(srctree)/include/config/auto.conf
	$(Q)rm -f $(srctree)/include/generated/autoconf.h

distclean: clean
	$(Q)$(MAKE) -C scripts/kconfig clean
	$(Q)rm -f compile_commands.json

$(KCONFIG_CONFIG):
	@echo >&2 '***'
	@echo >&2 '*** Configuration file "$@" not found!'
	@echo >&2 '***'
	@echo >&2 '*** Please run some configurator'
	@echo >&2 '*** (e.g. "make oldconfig" or "make menuconfig"'
	@echo >&2 '***'
	@false

compile_commands.json:
	$(Q)bear -- $(MAKE) -f scripts/makefile.build obj=$(obj)

PHONY += menuconfig
menuconfig:
	$(Q)$(MAKE) -f scripts/kconfig/makefile menuconfig

PHONY += defconfig
defconfig:
	$(Q)$(MAKE) -f scripts/kconfig/makefile defconfig

include-what-you-use: compile_commands.json
	$(Q)iwyu_tool.py -p. -j$(nproc) -- \
		--update_comments | \
		fix_includes.py --comments \
			--quoted_includes_first \
			--update_comments \
			--reorder

clang-tidy: compile_commands.json
	$(Q)clang-tidy -header-filter=.* -p=. $(shell find . -name '*.c' -o -name '*.h' | grep -v './scripts/\|dtoa\|linux\|arch\|bits')

clang-format:
	$(Q)clang-format -i $(shell find . -name '*.c' -o -name '*.h' | grep -v './scripts/')

%/include/config/auto.conf %/include/generated/autoconf.h: $(KCONFIG_CONFIG) compile_commands.json
	$(Q)$(MAKE) -f scripts/kconfig/makefile syncconfig

.PHONY: $(PHONY)