Add a conflict check for the restart_block function.
[ksplice.git] / Makefile.ksplice
blob7442eef5484d61b26e83ed6f4a5828845eab7029
1 ksplice-makefile := $(word $(words $(MAKEFILE_LIST)), $(MAKEFILE_LIST))
2 ksplice-script = $(dir $(ksplice-makefile))ksplice-obj.pl
4 KSPLICE_MODE ?= diff
5 $(if $(filter_out snap diff revert modinst,$(KSPLICE_MODE)), \
6   $(error Invalid KSPLICE_MODE $(KSPLICE_MODE).))
8 KSPLICE_ONLY_TARGETS ?= %
10 PHONY :=
12 __ksplice:
14 ksplice-extra = $(filter-out $(KSPLICE_EXCLUDE_MATCH),$(filter $(KSPLICE_EXTRA_MATCH),$(lib-y) $(real-objs-m) $(real-objs-y)))
15 ksplice-objs = $(foreach o,$(1),$(o:=.KSPLICE) $(addsuffix .KSPLICE_old_code,$(filter $(ksplice-extra),$(o))))
16 ifdef KSPLICE_BUILD_MODULES
17 ksplice-objs += $(2)
18 endif
20 escsq ?= $(subst ','\'',$(1))
21 echo-cmd ?= $(if $($(quiet)cmd_$(1)),echo '  $(call escsq,$($(quiet)cmd_$(1)))';)
23 quiet_cmd_ksplice-combine = COMBINE $(@:.KSPLICE=)
24 cmd_ksplice-combine = $(ksplice-script) combine $@ $(filter $(call ksplice-objs,$(ksplice-link-deps),$(@:.KSPLICE=)),$^)
25 quiet_cmd_ksplice-snap = SNAP    $(@:.KSPLICE=)
26 cmd_ksplice-snap = $(ksplice-script) snap $@
27 quiet_cmd_ksplice-diff = DIFF    $(@:.KSPLICE=)
28 cmd_ksplice-diff = $(ksplice-script) diff $@
29 quiet_cmd_ksplice-ignore = IGNORE  $(@:.KSPLICE=)
30 cmd_ksplice-ignore = touch $@
31 quiet_cmd_ksplice-cow = COW     $@
32 cmd_ksplice-cow = cp -a $@ $@.KSPLICE_pre
33 quiet_cmd_ksplice-mod = MOD     $(@:$(KSPLICE_KMODSRC)/%.mod.KSPLICE=%)
34 cmd_ksplice-mod = echo $(<:.o.KSPLICE=) > $@; cp -a $< $(<:.KSPLICE=.KSPLICE_new_code) $(<:.KSPLICE=.KSPLICE_old_code) $(KSPLICE_KMODSRC)/
35 rule_ksplice-mod = if [ -s $< ]; then $(echo-cmd) $(cmd_$(1)); fi
36 quiet_cmd_ksplice-old-code = OLDCODE $(@:.KSPLICE_old_code=)
37 cmd_ksplice-old-code = $(ksplice-script) old_code $@
38 quiet_cmd_ksplice-freeze = FREEZE  $(@:_ksplice-revert_%.KSPLICE_pre=%)
39 cmd_ksplice-freeze = rm -f $(@:_ksplice-revert_%=%)
40 quiet_cmd_ksplice-revert = REVERT  $(@:_ksplice-revert_%.KSPLICE_pre=%)
41 cmd_ksplice-revert = touch -r ksplice-revert-stamp $(@:_ksplice-revert_%=%); mv $(@:_ksplice-revert_%=%) $(@:_ksplice-revert_%.KSPLICE_pre=%)
42 quiet_cmd_ksplice-revert-snap = SNAP    $(@:_ksplice-revert-snap_%.KSPLICE=%)
43 cmd_ksplice-revert-snap = $(ksplice-script) snap $(@:_ksplice-revert-snap_%=%)
44 quiet_cmd_ksplice-clean = CLEAN   $(@:_ksplice-clean_%=%)
45 cmd_ksplice-clean = rm -f $(@:_ksplice-clean_%=%)
47 ifeq ($(obj),)
49 ifneq ($(wildcard include/linux/compile.h),)
50 MAKE += --old-file=include/linux/compile.h
51 endif
52 ifneq ($(filter snap diff,$(KSPLICE_MODE)),)
53 # Makefile.lib must be included before Makefile because they contain
54 # different filechk definitions in 2.6.12.
55 include $(if $(KBUILD_SRC),$(KBUILD_SRC)/)scripts/Makefile.lib
56 endif
57 include $(if $(KBUILD_SRC),$(KBUILD_SRC)/)Makefile
59 ifneq ($(skip-makefile),)
61 PHONY += __ksplice
62 __ksplice: FORCE
63         $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \
64         KBUILD_SRC=$(CURDIR) \
65         KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(ksplice-makefile) \
66         $(if $(wildcard $(KBUILD_OUTPUT)/include/config/kernel.release),--old-file=include/config/kernel.release)
68 else    # skip-makefile
70 CC := ksplice-cc.pl $(CC)
71 CFLAGS_KSPLICE = -ffunction-sections -fdata-sections -ksplice-cflags-api=1
72 CFLAGS_KERNEL += $(CFLAGS_KSPLICE)
73 CFLAGS_MODULE += $(CFLAGS_KSPLICE)
75 ifeq ($(KSPLICE_MODE),revert)
77 ksplice-revert-dirs = $(vmlinux-alldirs:%=_ksplice_%)
78 ksplice-dirs += $(ksplice-revert-dirs)
80 .INTERMEDIATE $(ksplice-revert-dirs): ksplice-revert-stamp
81 ksplice-revert-stamp: FORCE
82         $(Q)touch $@
84 endif   # KSPLICE_MODE
86 ifneq ($(filter snap diff,$(KSPLICE_MODE)),)
88 ksplice-mods += vmlinux
89 ifdef KSPLICE_BUILD_MODULES
90 ksplice-deps += ksplice_modpost
91 endif
92 ksplice-deps += $(vmlinux-dirs)
94 ksplice-vmlinux-objs = $(if $(vmlinux-all),$(vmlinux-all),$(vmlinux-objs))
95 $(obj)/vmlinux.o.KSPLICE: ksplice-link-deps = $(ksplice-vmlinux-objs)
96 $(obj)/vmlinux.o.KSPLICE: $(call ksplice-objs,$(ksplice-vmlinux-objs),) FORCE
97         $(call if_changed,ksplice-combine)
98 ksplice-targets += $(obj)/vmlinux.o.KSPLICE
99 $(ksplice-vmlinux-objs:=.KSPLICE): $(vmlinux-dirs) ;
101 PHONY += ksplice_modpost
102 ksplice_modpost: $(vmlinux-dirs) vmlinux
103         $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
105 endif   # KSPLICE_MODE
107 ifeq ($(KSPLICE_MODE),modinst)
109 ksplice-deps += ksplice_modinst
110 PHONY += ksplice_modinst
111 ksplice_modinst:
112         $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
114 endif   # KSPLICE_MODE
116 endif   # skip-makefile
118 else    # obj
120 ifeq ($(KSPLICE_MODE),revert)
122 -include .config        # workaround for missing obj- = subdir/ declarations
123 include $(srctree)/scripts/Makefile.clean
124 ksplice-dirs += $(subdir-ymn:%=_ksplice_%)
126 endif   # KSPLICE_MODE
128 ifneq ($(filter snap diff,$(KSPLICE_MODE)),)
130 ifdef KSPLICE_BUILD_MODULES
131 KBUILD_MODULES = 1
132 endif
134 include $(srctree)/scripts/Makefile.build
135 ksplice-mods += $(obj-m:.o=)
136 ksplice-deps += $(if $(filter $(KSPLICE_ONLY_TARGETS),vmlinux),$(builtin-target:=.KSPLICE) $(lib-target:=.KSPLICE))
137 ifdef KSPLICE_BUILD_MODULES
138 ksplice-deps += __build
139 endif
140 ksplice-deps += $(subdir-ym) $(always)
142 ifdef builtin-target
143 $(builtin-target:=.KSPLICE): ksplice-link-deps = $(obj-y)
144 $(builtin-target:=.KSPLICE): $(call ksplice-objs,$(obj-y),$(builtin-target)) FORCE
145         $(call if_changed,ksplice-combine)
146 ksplice-targets += $(builtin-target:=.KSPLICE)
147 endif
149 ifdef lib-target
150 $(lib-target:=.KSPLICE): ksplice-link-deps = $(lib-y)
151 $(lib-target:=.KSPLICE): $(call ksplice-objs,$(lib-y),$(lib-target)) FORCE
152         $(call if_changed,ksplice-combine)
153 ksplice-targets += $(lib-target:=.KSPLICE)
154 endif
156 $(sort $(multi-used-y:=.KSPLICE) $(multi-used-m:=.KSPLICE)): ksplice-link-deps = $($(@:$(obj)/%.o.KSPLICE=%-objs):%=$(obj)/%) $($(@:$(obj)/%.o.KSPLICE=%-y):%=$(obj)/%)
157 $(sort $(multi-used-y:=.KSPLICE)): $(obj)/%.o.KSPLICE: $(call ksplice-objs,$(multi-objs-y),$(obj)/%.o) FORCE
158         $(call if_changed,ksplice-combine)
159 $(sort $(multi-used-m:=.KSPLICE)): $(obj)/%.o.KSPLICE: $(call ksplice-objs,$(multi-objs-m),$(obj)/%.o) FORCE
160         $(call if_changed,ksplice-combine)
161 ksplice-targets += $(sort $(multi-used-y:=.KSPLICE) $(multi-used-m:=.KSPLICE))
163 ifeq ($(KSPLICE_MODE),snap)
164 $(obj)/%.o.KSPLICE: $(obj)/%.o FORCE
165         $(if $(strip $(wildcard $<.KSPLICE_pre) $(filter $<,$?)), \
166           $(call cmd,ksplice-snap))
167 else
168 $(obj)/%.o.KSPLICE: $(obj)/%.o
169         $(call cmd,ksplice-diff)
170 endif
172 $(obj)/%.lds.KSPLICE:
173         $(call cmd,ksplice-ignore)
175 $(sort $(subdir-obj-y:=.KSPLICE)): $(subdir-ym) ;
177 ifeq ($(MAKECMDGOALS),missing-syscalls)
178 cmd = @:
179 endif
181 endif   # KSPLICE_MODE
183 endif   # obj
185 ifeq ($(skip-makefile),)
187 ifeq ($(KSPLICE_MODE),revert)
189 ksplice-revert-obj := $(wildcard $(obj)/*.KSPLICE_pre)
190 ksplice-revert-files := $(ksplice-revert-obj)
191 ifneq ($(obj),$(src))
192 ksplice-revert-files += $(wildcard $(src)/*.KSPLICE_pre)
193 endif
194 ksplice-revert-deps := $(ksplice-revert-files:%=_ksplice-revert_%)
195 ksplice-deps += $(ksplice-revert-deps)
196 PHONY += $(ksplice-revert-deps)
197 $(ksplice-revert-deps): FORCE
198 ifdef KSPLICE_SERIES
199         $(call cmd,ksplice-freeze)
200 else
201         $(call cmd,ksplice-revert)
202 endif
204 ksplice-revert-snap-files := $(wildcard $(ksplice-revert-obj:.KSPLICE_pre=.KSPLICE))
205 ksplice-revert-snap-deps := $(ksplice-revert-snap-files:%=_ksplice-revert-snap_%)
206 ksplice-deps += $(ksplice-revert-snap-deps)
207 PHONY += $(ksplice-revert-snap-deps)
208 $(ksplice-revert-snap-deps): $(ksplice-revert-snap-files:%.KSPLICE=_ksplice-revert_%.KSPLICE_pre) FORCE
209         $(call cmd,ksplice-revert-snap)
211 ksplice-clean-files := $(filter-out $(ksplice-revert-snap-files:.KSPLICE_pre=.KSPLICE_new_code) $(ksplice-revert-snap-files:.KSPLICE_pre=.KSPLICE_old_code),$(wildcard $(obj)/*.KSPLICE_new_code $(obj)/*.KSPLICE_old_code))
212 ksplice-clean-deps = $(ksplice-clean-files:%=_ksplice-clean_%)
213 ksplice-deps += $(ksplice-clean-deps)
214 PHONY += $(ksplice-clean-deps)
215 $(ksplice-clean-deps): FORCE
216         $(call cmd,ksplice-clean)
218 endif   # KSPLICE_MODE
220 ifneq ($(filter snap diff,$(KSPLICE_MODE)),)
222 ksplice-modnames = $(filter $(KSPLICE_ONLY_TARGETS),$(notdir $(ksplice-mods)))
223 ifdef KSPLICE_KMODSRC
224 ksplice-deps += $(ksplice-modnames:%=$(KSPLICE_KMODSRC)/%.mod.KSPLICE)
225 $(KSPLICE_KMODSRC)/%.mod.KSPLICE: $(obj)/%.o.KSPLICE
226         $(Q)$(call rule_ksplice-mod,ksplice-mod)
227 else
228 ksplice-deps += $(ksplice-modnames:%=$(obj)/%.o.KSPLICE)
229 endif
230 .SECONDARY: $(obj)/%.o.KSPLICE
232 $(obj)/%.o.KSPLICE_old_code: $(obj)/%.o.KSPLICE
233         $(call cmd,ksplice-old-code)
235 ifeq ($(KSPLICE_MODE),diff)
237 define ksplice-cow-check
238         $(if $(filter-out %.KSPLICE,$@), \
239           $(if $(strip $(filter-out $(PHONY),$?) $(filter-out $(cmd_$(1)),$(cmd_$@)) $(filter-out $(cmd_$@),$(cmd_$(1)))), \
240             $(if $(wildcard $@), \
241               $(if $(wildcard $@.KSPLICE_pre),, \
242                 $(call cmd,ksplice-cow)))))
244 endef
246 define ksplice-add-cow-check
247 $(v) = $$(ksplice-cow-check)$(value $(v))
249 endef
251 ksplice-cow-eval += $(foreach v,if_changed if_changed_dep if_changed_rule,$(ksplice-add-cow-check))
253 endif   # KSPLICE_MODE
255 ksplice-cmd-files := $(wildcard $(foreach f,$(sort $(ksplice-targets)),$(dir $(f)).$(notdir $(f)).cmd))
256 ifneq ($(ksplice-cmd-files),)
257 $(ksplice-cmd-files): ;
258 include $(ksplice-cmd-files)
259 endif
261 endif   # KSPLICE_MODE
263 PHONY += __ksplice
264 __ksplice: $(ksplice-deps) $(ksplice-dirs)
265         @:
267 build := -f $(ksplice-makefile) obj
268 descend =$(Q)$(MAKE) $(build)=$(1) $(2)
270 PHONY += $(ksplice-dirs)
271 $(ksplice-dirs):
272         $(Q)$(MAKE) $(build)=$(@:_ksplice_%=%)
274 endif   # skip-makefile
276 $(eval $(ksplice-cow-eval))
278 PHONY += FORCE
279 FORCE:
281 .PHONY: $(PHONY)