From 7a3604845d50e6a203d09a47b4d3fccf33dd9c30 Mon Sep 17 00:00:00 2001 From: Dmitry Safonov Date: Mon, 18 Jul 2016 22:22:48 +0300 Subject: [PATCH] build/make: return to make from top directory It looks like, there is not so much that needs to be fixed for building criu from a top directory. After the patch it's possible to do `make criu/mount.o` i.e. It will build protobuf, compel as dependencies (if they are not built), but no more from criu objects. If something breaks, you can do make from vim and jump to error. Nice. Mostly the patch corrects pathes to objects - I tried to make them depend on $(obj) or $(SRC_DIR)/criu, where it's possible. After it tested: `make -j 10`, `make criu/log.o`, `make clean`, `make mrproper`, `make install DESTDIR=/tmp/criu`, `make uninstall DESTDIR=/tmp/criu` Note: I improperly called v1 for this patch as "return to make from top Makefile" -- but I didn't mean that (and it was friday ;) This patch doesn't yet switch to top-Makefile building, but that's a step in that way (building from a top Makefile needs correct pathes in makefiles) which also adds ability to build objects in subdirectories and etc. Cc: Cyrill Gorcunov Signed-off-by: Dmitry Safonov Signed-off-by: Cyrill Gorcunov Signed-off-by: Pavel Emelyanov --- Makefile | 14 +++-- Makefile.install | 2 +- criu/Makefile | 114 +++++++++++++++++++------------------- criu/Makefile.config | 8 +-- criu/Makefile.crtools | 8 +-- criu/Makefile.packages | 3 +- criu/pie/Makefile | 13 +++-- criu/pie/Makefile.library | 4 +- scripts/protobuf-gen.sh | 2 +- 9 files changed, 88 insertions(+), 80 deletions(-) diff --git a/Makefile b/Makefile index 7afeb2aac..52cbd6a67 100644 --- a/Makefile +++ b/Makefile @@ -179,6 +179,8 @@ endif # on anything else. $(eval $(call gen-built-in,images)) +.PHONY: .FORCE + # # CRIU building done in own directory # with slightly different rules so we @@ -187,17 +189,17 @@ $(eval $(call gen-built-in,images)) # # But note that we're already included # the nmk so we can reuse it there. -criu/%: images/built-in.o $(VERSION_HEADER) - $(Q) $(MAKE) -C criu $@ +criu/%: images/built-in.o $(VERSION_HEADER) .FORCE + $(Q) $(MAKE) $(build)=criu $@ criu: images/built-in.o $(VERSION_HEADER) - $(Q) $(MAKE) -C criu all + $(Q) $(MAKE) $(build)=criu all .PHONY: criu # # Libraries next once criu it ready # (we might generate headers and such # when building criu itself). -lib/%: criu +lib/%: criu .FORCE $(Q) $(MAKE) -C lib $@ lib: criu $(Q) $(MAKE) -C lib all @@ -215,13 +217,13 @@ subclean: clean: subclean $(Q) $(MAKE) $(build)=images $@ - $(Q) $(MAKE) -C criu $@ + $(Q) $(MAKE) $(build)=criu $@ .PHONY: clean # mrproper depends on clean in nmk mrproper: subclean $(Q) $(MAKE) $(build)=images $@ - $(Q) $(MAKE) -C criu $@ + $(Q) $(MAKE) $(build)=criu $@ $(Q) $(RM) $(VERSION_HEADER) $(Q) $(RM) cscope.* $(Q) $(RM) tags TAGS diff --git a/Makefile.install b/Makefile.install index e3dd55141..dbc22e116 100644 --- a/Makefile.install +++ b/Makefile.install @@ -43,7 +43,7 @@ install-lib: lib .PHONY: install-lib install-criu: criu - $(Q) $(MAKE) -C criu install + $(Q) $(MAKE) $(build)=criu install .PHONY: install-criu install: install-man install-lib install-criu diff --git a/criu/Makefile b/criu/Makefile index fb6fa2f77..8cd9cea96 100644 --- a/criu/Makefile +++ b/criu/Makefile @@ -2,8 +2,9 @@ # 6a8d90f5fec4 "attr: Allow attribute type 0" WRAPFLAGS += -Wl,--wrap=nla_parse,--wrap=nlmsg_parse -ARCH_DIR := arch/$(SRCARCH) -export ARCH_DIR +ARCH_DIR := criu/arch/$(SRCARCH) +PIE_DIR := criu/pie +export ARCH_DIR PIE_DIR # # General flags. @@ -11,8 +12,8 @@ ccflags-y += -fno-strict-aliasing ccflags-y += -iquote $(SRC_DIR)/criu/include ccflags-y += -iquote $(SRC_DIR)/images ccflags-y += -iquote $(SRC_DIR)/criu/pie -ccflags-y += -iquote $(SRC_DIR)/criu/$(ARCH_DIR) -ccflags-y += -iquote $(SRC_DIR)/criu/$(ARCH_DIR)/include +ccflags-y += -iquote $(SRC_DIR)/$(ARCH_DIR) +ccflags-y += -iquote $(SRC_DIR)/$(ARCH_DIR)/include ccflags-y += -iquote $(SRC_DIR)/ ccflags-y += -I/usr/include/libnl3 @@ -38,11 +39,14 @@ include $(__nmk_dir)/msg.mk # # Needed libraries checks -include Makefile.packages +include $(SRC_DIR)/criu/Makefile.packages # # Configure variables. -include Makefile.config +CONFIG_HEADER := $(obj)/include/config.h +ifneq ($(filter-out clean mrproper,$(MAKECMDGOALS)),) +include $(SRC_DIR)/criu/Makefile.config +endif config: $(VERSION_HEADER) # @@ -55,84 +59,84 @@ syscalls_lib: config # # Architecture dependant part. ARCH-LIB := $(ARCH_DIR)/crtools.built-in.o -arch_lib: syscalls_lib - $(Q) $(MAKE) $(call build-as,Makefile,$(ARCH_DIR)) all -.PHONY: arch_lib +$(ARCH-LIB): syscalls_lib + $(Q) $(MAKE) $(build)=$(ARCH_DIR) all # # piegen tool needed for PIE code. ifeq ($(piegen-y),y) -piegen-bin := pie/piegen/piegen +piegen-bin := criu/pie/piegen/piegen -pie/piegen/%: config - $(Q) CC=$(HOSTCC) LD=$(HOSTLD) CFLAGS="$(ccflags-y) $(HOSTCFLAGS) $(WARNINGS) $(DEFINES)" $(MAKE) $(build)=pie/piegen $@ -$(piegen-bin): pie/piegen/built-in.o +criu/pie/piegen/%: config + $(Q) CC=$(HOSTCC) LD=$(HOSTLD) CFLAGS="$(ccflags-y) $(HOSTCFLAGS) $(WARNINGS) $(DEFINES)" $(MAKE) $(build)=criu/pie/piegen $@ +$(piegen-bin): criu/pie/piegen/built-in.o $(call msg-link, $@) $(Q) $(HOSTCC) $(HOSTCFLAGS) $^ $(LDFLAGS) -o $@ endif # # PIE library code. -pie/lib.a: arch_lib - $(Q) $(MAKE) $(call build-as,Makefile.library,pie) all +criu/pie/lib.a: $(ARCH-LIB) + $(Q) $(MAKE) $(call build-as,Makefile.library,criu/pie) all # # PIE code blobs themseves. -pie: $(piegen-bin) pie/lib.a - $(Q) $(MAKE) $(build)=pie all +pie: $(piegen-bin) criu/pie/lib.a + $(Q) $(MAKE) $(build)=criu/pie all .PHONY: pie # # CRIU executable -PROGRAM-BUILTINS += ../images/built-in.o -PROGRAM-BUILTINS += built-in.o -PROGRAM-BUILTINS += pie/lib.a +PROGRAM-BUILTINS += criu/pie/lib.a +PROGRAM-BUILTINS += images/built-in.o +PROGRAM-BUILTINS += $(obj)/built-in.o +PROGRAM-BUILTINS += $(ARCH-LIB) -built-in.o: pie - $(Q) $(MAKE) $(call build-as,Makefile.crtools,.) all +$(obj)/built-in.o: pie + $(Q) $(MAKE) $(call build-as,Makefile.crtools,criu) all -criu: $(PROGRAM-BUILTINS) +$(obj)/criu: $(PROGRAM-BUILTINS) $(call msg-link, $@) - $(Q) $(CC) $(CFLAGS) $^ $(ARCH-LIB) $(LIBS) $(WRAPFLAGS) $(LDFLAGS) $(GMONLDOPT) -rdynamic -o $@ + $(Q) $(CC) $(CFLAGS) $^ $(LIBS) $(WRAPFLAGS) $(LDFLAGS) $(GMONLDOPT) -rdynamic -o $@ -subclean: - $(Q) $(RM) ./*.{gcda,gcno,gcov} - $(Q) $(RM) ./pie/*.{gcda,gcno,gcov} - $(Q) $(RM) ./pie/piegen/*.{gcda,gcno,gcov} - $(Q) $(RM) -r ./gcov - $(Q) $(RM) criu -.PHONY: subclean - # # Clean the most, except generated c files +subclean: + $(Q) $(RM) $(obj)/*.{gcda,gcno,gcov} + $(Q) $(RM) $(obj)/pie/*.{gcda,gcno,gcov} + $(Q) $(RM) $(obj)/pie/piegen/*.{gcda,gcno,gcov} + $(Q) $(RM) -r $(obj)/gcov + $(Q) $(MAKE) $(call build-as,Makefile.syscalls,$(ARCH_DIR)) clean + $(Q) $(MAKE) $(build)=$(ARCH_DIR) clean + $(Q) $(MAKE) $(call build-as,Makefile.library,$(PIE_DIR)) clean + $(Q) $(MAKE) $(call build-as,Makefile.crtools,criu) clean + $(Q) $(MAKE) $(build)=$(PIE_DIR) clean + $(Q) $(MAKE) $(build)=$(PIE_DIR)/piegen clean +.PHONY: subclean +cleanup-y += $(obj)/criu clean: subclean - $(Q) $(MAKE) $(call build-as,Makefile.syscalls,$(ARCH_DIR)) $@ - $(Q) $(MAKE) $(call build-as,Makefile,$(ARCH_DIR)) $@ - $(Q) $(MAKE) $(call build-as,Makefile.library,pie) $@ - $(Q) $(MAKE) $(call build-as,Makefile.crtools,.) $@ - $(Q) $(MAKE) $(build)=pie/piegen $@ - $(Q) $(MAKE) $(build)=pie $@ -.PHONY: clean # # Delete all generated files -mrproper: subclean - $(Q) $(MAKE) $(call build-as,Makefile.syscalls,$(ARCH_DIR)) $@ - $(Q) $(MAKE) $(call build-as,Makefile,$(ARCH_DIR)) $@ - $(Q) $(MAKE) $(call build-as,Makefile.library,pie) $@ - $(Q) $(MAKE) $(call build-as,Makefile.crtools,.) $@ - $(Q) $(MAKE) $(build)=pie/piegen $@ - $(Q) $(MAKE) $(build)=pie $@ - $(Q) $(RM) $(CONFIG_HEADER) -.PHONY: mrproper +subproper: + $(Q) $(MAKE) $(call build-as,Makefile.syscalls,$(ARCH_DIR)) mrproper + $(Q) $(MAKE) $(build)=$(ARCH_DIR) mrproper + $(Q) $(MAKE) $(call build-as,Makefile.library,$(PIE_DIR)) mrproper + $(Q) $(MAKE) $(call build-as,Makefile.crtools,criu) mrproper + $(Q) $(MAKE) $(build)=$(PIE_DIR) mrproper + $(Q) $(MAKE) $(build)=$(PIE_DIR)/piegen mrproper +.PHONY: subproper +mrproper-y += $(CONFIG_HEADER) +mrproper: subproper -UAPI_HEADERS := include/criu-plugin.h include/criu-log.h +UAPI_HEADERS := $(SRC_DIR)/criu/include/criu-plugin.h +UAPI_HEADERS += $(SRC_DIR)/criu/include/criu-log.h -install: criu - $(E) " INSTALL " criu +install: $(obj)/criu + $(E) " INSTALL " $(obj)/criu $(Q) mkdir -p $(DESTDIR)$(SBINDIR) - $(Q) install -m 755 criu $(DESTDIR)$(SBINDIR) + $(Q) install -m 755 $(obj)/criu $(DESTDIR)$(SBINDIR) $(Q) mkdir -p $(DESTDIR)$(INCLUDEDIR) $(Q) install -m 644 $(UAPI_HEADERS) $(DESTDIR)$(INCLUDEDIR) $(Q) mkdir -p $(DESTDIR)$(LIBEXECDIR)/criu/scripts @@ -146,8 +150,4 @@ uninstall: $(Q) $(RM) $(addprefix $(DESTDIR)$(LIBEXECDIR)/criu/scripts/,systemd-autofs-restart.sh) .PHONY: uninstall -# -# Final @all target. -all: check-packages criu - @true -.PHONY: all +all-y += check-packages $(obj)/criu diff --git a/criu/Makefile.config b/criu/Makefile.config index 15af65f28..e6f5efe24 100644 --- a/criu/Makefile.config +++ b/criu/Makefile.config @@ -1,8 +1,6 @@ include $(__nmk_dir)/utils.mk include $(__nmk_dir)msg.mk -include ../scripts/feature-tests.mak - -CONFIG_HEADER := include/config.h +include $(SRC_DIR)/scripts/feature-tests.mak ifeq ($(call try-cc,$(FEATURE_TEST_LIBBSD_DEV),-lbsd),y) LIBS += -lbsd @@ -26,7 +24,7 @@ endif endef define config-header-rule -$(CONFIG_HEADER): include/config-base.h +$(CONFIG_HEADER): $(obj)/include/config-base.h $$(call msg-gen, $$@) $(Q) @echo '#ifndef __CR_CONFIG_H__' > $$@ $(Q) @echo '#define __CR_CONFIG_H__' >> $$@ @@ -47,6 +45,6 @@ endef $(eval $(config-header-rule)) -$(CONFIG_HEADER): ../scripts/feature-tests.mak +$(CONFIG_HEADER): $(SRC_DIR)/scripts/feature-tests.mak config: $(CONFIG_HEADER) .PHONY: config diff --git a/criu/Makefile.crtools b/criu/Makefile.crtools index f9f69d4da..2665f9273 100644 --- a/criu/Makefile.crtools +++ b/criu/Makefile.crtools @@ -1,4 +1,4 @@ -ccflags-y += -iquote $(ARCH) +ccflags-y += -iquote criu/$(ARCH) ccflags-y += $(DEFINES) obj-y += action-scripts.o obj-y += aio.o @@ -86,10 +86,10 @@ endif PROTOBUF_GEN := $(SRC_DIR)/scripts/protobuf-gen.sh -protobuf-desc.c: protobuf-desc-gen.h +$(obj)/protobuf-desc.d: $(obj)/protobuf-desc-gen.h -protobuf-desc-gen.h: $(PROTOBUF_GEN) include/protobuf-desc.h +$(obj)/protobuf-desc-gen.h: $(PROTOBUF_GEN) criu/include/protobuf-desc.h $(call msg-gen, $@) $(Q) $(SH) $(PROTOBUF_GEN) > $@ -mrproper-y += protobuf-desc-gen.h +mrproper-y += $(obj)/protobuf-desc-gen.h diff --git a/criu/Makefile.packages b/criu/Makefile.packages index 4c51e8dc7..1b4eb1ded 100644 --- a/criu/Makefile.packages +++ b/criu/Makefile.packages @@ -38,5 +38,6 @@ check-packages-failed: $(error Compilation aborted) check-packages: - $(Q) $(MAKE) check-build-packages || $(MAKE) check-packages-failed + $(Q) $(MAKE) -f $(obj)/Makefile.packages check-build-packages || \ + $(MAKE) -f $(obj)/Makefile.packages check-packages-failed .PHONY: check-build-packages check-packages-failed check-packages diff --git a/criu/pie/Makefile b/criu/pie/Makefile index c125e8c40..125b02fd3 100644 --- a/criu/pie/Makefile +++ b/criu/pie/Makefile @@ -15,7 +15,12 @@ restorer-obj-e += ./$(ARCH_DIR)/syscalls.built-in.o # applications, which is not the target of the # project. # -CFLAGS := $(filter-out -pg $(CFLAGS-GCOV),$(CFLAGS)) -iquote pie/piegen -iquote arch/$(ARCH)/include -iquote $(SRC_DIR) -iquote $(SRC_DIR)/criu/include +CFLAGS := $(filter-out -pg $(CFLAGS-GCOV),$(CFLAGS)) +CFLAGS += -iquote $(SRC_DIR)/criu/pie/piegen +CFLAGS += -iquote $(SRC_DIR)/criu/arch/$(ARCH)/include +CFLAGS += -iquote $(SRC_DIR)/criu/include +CFLAGS += -iquote $(SRC_DIR) + ifneq ($(filter-out ia32,$(ARCH)),) ccflags-y += -DCR_NOGLIBC -fpie -Wa,--noexecstack -fno-stack-protector @@ -37,7 +42,7 @@ PIELDS := pie.lds.S .SECONDARY: ifeq ($(piegen-y),y) -target-name = $(patsubst pie/%-blob.h,%,$(1)) +target-name = $(patsubst criu/pie/%-blob.h,%,$(1)) ifeq ($(SRCARCH),ppc64) $(obj)/$(PIELDS): $(obj)/pie-reloc.lds.S.in @@ -68,9 +73,9 @@ $(obj)/%.built-in.bin.o: $(obj)/%.built-in.o $(obj)/lib.a $(obj)/$(PIELDS) $(call msg-gen, $@) $(Q) $(LD) -r -T $(obj)/$(PIELDS) -o $@ $< $(obj)/lib.a -$(obj)/%-blob.h: $(obj)/%.built-in.bin.o $(obj)/$(PIELDS) pie/piegen +$(obj)/%-blob.h: $(obj)/%.built-in.bin.o $(obj)/$(PIELDS) criu/pie/piegen $(call msg-gen, $@) - $(Q) pie/piegen/piegen -f $< -v $(call target-name,$@)_relocs -p $(call target-name,$@)_blob_offset__ -s $(call target-name,$@)_blob -o $@ $(piegen_stdout) + $(Q) criu/pie/piegen/piegen -f $< -v $(call target-name,$@)_relocs -p $(call target-name,$@)_blob_offset__ -s $(call target-name,$@)_blob -o $@ $(piegen_stdout) else diff --git a/criu/pie/Makefile.library b/criu/pie/Makefile.library index e1a6acccf..61436e64c 100644 --- a/criu/pie/Makefile.library +++ b/criu/pie/Makefile.library @@ -28,7 +28,9 @@ endif # applications, which is not the target of the # project. # -iquotes := -iquote pie/piegen -iquote arch/$(ARCH)/include -iquote $(SRC_DIR) -iquote $(SRC_DIR)/criu/include +iquotes := -iquote $(SRC_DIR)/$(PIE_DIR)/piegen +iquotes += -iquote $(SRC_DIR)/$(ARCH_DIR)/include +iquotes += -iquote $(SRC_DIR) -iquote $(SRC_DIR)/criu/include CFLAGS := $(filter-out -pg $(CFLAGS-GCOV),$(CFLAGS)) $(iquotes) asflags-y := -D__ASSEMBLY__ $(iquotes) diff --git a/scripts/protobuf-gen.sh b/scripts/protobuf-gen.sh index fb753c514..29c52cf1a 100644 --- a/scripts/protobuf-gen.sh +++ b/scripts/protobuf-gen.sh @@ -5,7 +5,7 @@ for x in $(sed -n '/PB_AUTOGEN_START/,/PB_AUTOGEN_STOP/ { s/,.*$//; s/\tPB_//; p; - }' include/protobuf-desc.h); do + }' criu/include/protobuf-desc.h); do x_la=$(echo $x | sed $TR) x_uf=$(echo $x | sed -nr 's/^./&#\\\ /;