X-Git-Url: http://rtime.felk.cvut.cz/gitweb/omk.git/blobdiff_plain/4565808fdb06a2eb3b36cdc0ea33ebab47dc5183..1fa2598d5b7cb860e001c7f1b1317a5c57e39847:/snippets/linux diff --git a/snippets/linux b/snippets/linux index 49c2626..696674e 100644 --- a/snippets/linux +++ b/snippets/linux @@ -27,14 +27,16 @@ # RTL_DIR .. location of RT-Linux sources # CFLAGS .. C compiler flags # CXXFLAGS .. C++ compiler flags +# CPPFLAGS .. C preprocessor flags +# LDFLAGS .. linker flags for programs linking # Hack to check RT-Linux rules #LINUX_DIR := /home/cvs/ocera/ocera-build/kernel/linux #RTL_DIR := /home/cvs/ocera/ocera-build/kernel/rtlinux #CONFIG_RTLINUX = y -#OCERA_DIR := $(shell ( cd -L $(MAKERULES_DIR)/../../.. ; pwd -L ) ) +#OCERA_DIR := $(shell ( cd -L $(OUTPUT_DIR)/../../.. ; pwd -L ) ) --include $(MAKERULES_DIR)/OCERA_TOP_DIR +-include $(OUTPUT_DIR)/OCERA_TOP_DIR BUILD_DIR_NAME = _build COMPILED_DIR_NAME = _compiled @@ -60,6 +62,7 @@ USER_UTILS_DIR := $(TARGET_DIR)/usr/bin USER_TESTS_DIR := $(TARGET_DIR)/usr/bin USER_BIN_DIR := $(TARGET_DIR)/usr/bin USER_BUILD_DIR := $(BUILD_DIR)/user/$(GROUP_DIR_NAME) +LINK_BUILD_DIR := $(BUILD_DIR)/link/$(GROUP_DIR_NAME) #LINUX_DIR := $(OCERA_DIR)/kernel/linux #RTL_DIR := $(OCERA_DIR)/kernel/rtlinux #CONFIG_FILE := $(OCERA_DIR)/emdebsys/.config @@ -67,17 +70,18 @@ ifneq ($(wildcard $(CONFIG_FILE)),) CONFIG_FILE_OK = y endif else # OCERA_DIR -KERN_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include-kern -KERN_LIB_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib-kern -KERN_MODULES_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/modules -KERN_BUILD_DIR := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/kern -KERN_MODPOST_DIR := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/kern-modpost -USER_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include -USER_LIB_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib -USER_UTILS_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-utils -USER_TESTS_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-tests -USER_BIN_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin -USER_BUILD_DIR := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/user +KERN_INCLUDE_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/include-kern +KERN_LIB_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/lib-kern +KERN_MODULES_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/modules +KERN_BUILD_DIR := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/kern +KERN_MODPOST_DIR := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/kern-modpost +USER_INCLUDE_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/include +USER_LIB_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/lib +USER_UTILS_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin-utils +USER_TESTS_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin-tests +USER_BIN_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin +USER_BUILD_DIR := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/user +LINK_BUILD_DIR := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/link ifndef LINUX_VERSION LINUX_VERSION=$(shell uname -r) @@ -101,6 +105,9 @@ ifeq ($(TARGET_OS),) TARGET_OS := $(BUILD_OS) endif +export TARGET_OS +export BUILD_OS + LOCAL_BUILD_DIR = $(USER_OBJS_DIR) # Assign default values to CFLAGS variable. If the variable is defined @@ -113,7 +120,7 @@ CPPFLAGS += -I $(USER_INCLUDE_DIR) LOADLIBES += -L$(USER_LIB_DIR) -LOADLIBES += $(lib_LOADLIBES:%=-l%) +#LOADLIBES += $(lib_LOADLIBES:%=-l%) LIB_CPPFLAGS += $(CPPFLAGS) LIB_CFLAGS += $(CFLAGS) @@ -131,6 +138,7 @@ endif USER_OBJS_DIR = $(USER_BUILD_DIR)/$(RELATIVE_DIR) KERN_OBJS_DIR = $(KERN_BUILD_DIR)/$(RELATIVE_DIR) +OMK_WORK_DIR = $(USER_OBJS_DIR) .PHONY: dep subdirs clean clean-custom cleandepend check-dir @@ -138,7 +146,7 @@ KERN_OBJS_DIR = $(KERN_BUILD_DIR)/$(RELATIVE_DIR) ifneq ($(OMK_SERIALIZE_INCLUDED),y) include-pass: check-dir library-pass: include-pass -binary-pass: library-pass +link: library-pass kernel-lib-pass: include-pass kernel-mod-pass: kernel-lib-pass kernel-modpost-pass: kernel-mod-pass @@ -151,7 +159,7 @@ endif # Checks for OMK tester ifdef OMK_TESTSROOT default-config-pass-check include-pass-check: -library-pass-check binary-pass-check: +library-pass-check: @[ -x "$(shell which $(CC))" ] || $(call canttest,Cannot find compiler: $(CC)) endif @@ -246,12 +254,11 @@ endef define COMPILE_idl_template $(2).c $(2)-stubs.c $(2)-skels.c $(2)-common.c $(2).h: $(1) @$(QUIET_CMD_ECHO) " IDL $$@" - $(Q) $$(idl_COMPILE) $(1) + $(Q) $$(idl_COMPILE) $$($(2)_IDLFLAGS) $(1) endef -# Syntax: $(call PROGRAM_template,,,,) -# FIXME: ???????? asi je tu blbej komentar +# Syntax: $(call PROGRAM_template,,) define PROGRAM_template USER_IDLS += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL) @@ -271,13 +278,12 @@ $(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%)) USER_OBJS += $$($(1)_OBJS) USER_SOURCES += $$($(1)_SOURCES) -$(2)/$(1)$(3): $$($(1)_OBJS) - @$(QUIET_CMD_ECHO) " LINK $$@" - $(Q) $$(if $$(filter %.cc,$$($(1)_SOURCES:%.cxx=%.cc)),$$(CXX),$$(CC)) \ - $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) $$(LOADLIBES) $$(LDFLAGS) -Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map -o $$@ - @echo "$(2)/$(1)$(3): \\" >$(USER_OBJS_DIR)/$(1).exe.d - @sed -n -e 's|^LOAD \(.*\)$$$$| \1 \&|p' $(USER_OBJS_DIR)/$(1).exe.map|tr '&' '\134' >>$(USER_OBJS_DIR)/$(1).exe.d - @echo >>$(USER_OBJS_DIR)/$(1).exe.d +$(OMK_WORK_DIR)/$(2)-$(1)$(EXE_SUFFIX).omkvar: $$($(1)_OBJS) FORCE + $(Q)echo '$(1)_objs += $$$$(addprefix $(USER_OBJS_DIR)/,$$($(1)_OBJS))' > $$@.tmp; \ + echo '$(1)_libs += $$($(1)_LIBS) $$(lib_LOADLIBES)' >> $$@.tmp; \ + echo '$(1)_linker += $$(if $$(filter %.cc,$$($(1)_SOURCES:%.cxx=%.cc)),$$(CXX),$$(CC))' >> $$@.tmp; \ + echo '$(2)_programs += $(1)' >> $$@.tmp; \ + if cmp -s $$@.tmp $$@; then rm $$@.tmp; else mv $$@.tmp $$@; fi endef @@ -306,6 +312,7 @@ $(USER_LIB_DIR)/lib$(1).a: $$($(1)_OBJS) $(Q) $(AR) rcs $$@ $$^ endef +.PHONY: FORCE # Syntax: $(call SOLIB_template,) define SOLIB_template @@ -327,17 +334,19 @@ $(1)_OBJSLO := $$(sort $$($(1)_OBJSLO:%/=%)) SOLIB_OBJS += $$($(1)_OBJSLO) SOLIB_SOURCES += $$($(1)_SOURCES) -$(USER_LIB_DIR)/lib$(1).$(SOLIB_EXT): $$($(1)_OBJSLO) - @$(QUIET_CMD_ECHO) " LINK $$@" - $(Q) $(CC) --shared -Xlinker -soname=lib$(1).$(SOLIB_EXT) -o $$@ $$^ $$(LOADLIBES) $$($(1)_LIBS:%=-l%) +$(OMK_WORK_DIR)/lib$(1).$(SOLIB_EXT).omkvar: $$($(1)_OBJSLO) FORCE + $(Q)echo '$(1)_objslo += $$$$(addprefix $(USER_OBJS_DIR)/,$$($(1)_OBJSLO))' > $$@.tmp; \ + echo '$(1)_libs += $$($(1)_LIBS) $$(lib_LOADLIBES)' >> $$@.tmp; \ + echo 'shared_libs := $$$$(sort $(1) $$$$(shared_libs))' >> $$@.tmp; \ + if cmp -s $$@.tmp $$@; then rm $$@.tmp; else mv $$@.tmp $$@; fi endef - - library-pass-local: $(addprefix $(USER_INCLUDE_DIR)/,$(cmetric_include_HEADERS)) \ - $(lib_LIBRARIES:%=$(USER_LIB_DIR)/lib%.a) $(shared_LIBRARIES:%=$(USER_LIB_DIR)/lib%.$(SOLIB_EXT)) - -binary-pass-local: $(bin_PROGRAMS:%=$(USER_BIN_DIR)/%$(EXE_SUFFIX)) $(utils_PROGRAMS:%=$(USER_UTILS_DIR)/%$(EXE_SUFFIX)) $(test_PROGRAMS:%=$(USER_TESTS_DIR)/%$(EXE_SUFFIX)) + $(lib_LIBRARIES:%=$(USER_LIB_DIR)/lib%.a) \ + $(shared_LIBRARIES:%=$(OMK_WORK_DIR)/lib%.$(SOLIB_EXT).omkvar) \ + $(bin_PROGRAMS:%=$(OMK_WORK_DIR)/bin-%$(EXE_SUFFIX).omkvar) \ + $(utils_PROGRAMS:%=$(OMK_WORK_DIR)/utils-%$(EXE_SUFFIX).omkvar) \ + $(test_PROGRAMS:%=$(OMK_WORK_DIR)/test-%$(EXE_SUFFIX).omkvar) # Special rules for CMETRIC generated headers @@ -354,11 +363,11 @@ GEN_HEADERS+=$(filter %.h,$(USER_IDLS:%.idl=%.h)) # Generate rules for compilation of programs and libraries -$(foreach prog,$(utils_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_UTILS_DIR),$(EXE_SUFFIX)))) +$(foreach prog,$(utils_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),utils))) -$(foreach prog,$(test_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_TESTS_DIR),$(EXE_SUFFIX)))) +$(foreach prog,$(test_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),test))) -$(foreach prog,$(bin_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR),$(EXE_SUFFIX)))) +$(foreach prog,$(bin_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),bin))) $(foreach lib,$(lib_LIBRARIES),$(eval $(call LIBRARY_template,$(lib)))) @@ -366,7 +375,47 @@ $(foreach lib,$(shared_LIBRARIES),$(eval $(call SOLIB_template,$(lib)))) -include $(USER_OBJS_DIR)/*.d -endif +endif # USER_RULE_TEMPLATES + +.PHONY: link +link: + $(Q)$(MAKE) $(NO_PRINT_DIRECTORY) -C $(LINK_BUILD_DIR) -f $(SOURCESDIR_MAKEFILE) link-pseudo-pass + +ifeq ($(MAKECMDGOALS),link-pseudo-pass) + +# Syntax: $(call solib_link_template,) +define solib_link_template +$(1)_shared_libs = $$(patsubst %,$(USER_LIB_DIR)/lib%.$(SOLIB_EXT),$$(filter $$(shared_libs),$$($(1)_libs))) +#$$(warning $(1)_shared_libs = $$($(1)_shared_libs)) +$(USER_LIB_DIR)/lib$(1).$(SOLIB_EXT): $$($(1)_shared_libs) $$($(1)_objslo) + @$(QUIET_CMD_ECHO) " LINK $$@" + $(Q)$(CC) --shared -Xlinker -soname=lib$(1).$(SOLIB_EXT) -o $$@ $$($(1)_objslo) $$(LOADLIBES) $$($(1)_libs:%=-l%) +endef + +# Syntax: $(call program_link_template,,) +define program_link_template +$(2)/$(1)$(EXE_SUFFIX): $$($(1)_objs) dir=$(LINK_BUILD_DIR)/$$(notdir $(2)) + @$(QUIET_CMD_ECHO) " LINK $$@" + $(Q) $$($(1)_linker) \ + $$($(1)_objs) $$($(1)_libs:%=-l%) $$(LOADLIBES) $$(LDFLAGS) -Wl,-Map,$$(dir)/$(1).exe.map -o $$@ + @echo "$$@: \\" >$$(dir)/$(1).exe.d + @sed -n -e 's|^LOAD \(.*\)$$$$| \1 \&|p' $$(dir)/$(1).exe.map|tr '&' '\134' >>$$(dir)/$(1).exe.d + @echo >>$$(dir)/$(1).exe.d +endef + +-include $(shell find $(USER_BUILD_DIR) -name '*.omkvar') +#$(warning $(shared_libs)) +$(foreach lib,$(shared_libs),$(eval $(call solib_link_template,$(lib)))) +$(foreach prg,$(bin_programs),$(eval $(call program_link_template,$(prg),$(USER_BIN_DIR)))) +$(foreach prg,$(utils_programs),$(eval $(call program_link_template,$(prg),$(USER_UTILS_DIR)))) +$(foreach prg,$(test_programs),$(eval $(call program_link_template,$(prg),$(USER_TESTS_DIR)))) + +.PHONY: link-pseudo-pass +link-pseudo-pass: $(shared_libs:%=$(USER_LIB_DIR)/lib%.$(SOLIB_EXT)) \ + $(bin_programs:%=$(USER_BIN_DIR)/%$(EXE_SUFFIX)) \ + $(utils_programs:%=$(USER_UTILS_DIR)/%$(EXE_SUFFIX)) \ + $(tests_programs:%=$(USER_TESTS_DIR)/%$(EXE_SUFFIX)) +endif # link-shared-libs #===================================================================== # Kernel-space rules and templates to compile modules, libraries etc. @@ -428,7 +477,7 @@ KERN_AR = $(AR) endif ifeq ($(LINUX_QUOTE_MODNAME),y) KERN_MQ=\" -KERN_KBUILD_MODNAME=-D"KBUILD_MODNAME=((THIS_MODULE)?(THIS_MODULE)->name:NULL)" +KERN_KBUILD_MODNAME=-D"KBUILD_MODNAME=((THIS_MODULE)!=NULL?(THIS_MODULE)->name:NULL)" endif endif # CONFIG_RTLINUX @@ -463,6 +512,34 @@ KERN_MODULES_LINK_DIR = $(KERN_MODULES_DIR) KERN_LINK_SUFFIX = $(KERN_EXE_SUFFIX) endif +ifeq ($(LINUX_CONFIG_MODVERSIONS),y) +MODPOST_OPTS += -m +MODPOST_OPTS += -i $(LINUX_DIR)/Module.symvers +ifneq ($(LINUX_BUILDHOST),) # this is not correct point, it should look for 2.6.17 kernel +MODPOST_OPTS += -I $(KERN_LIB_DIR)/Module.symvers +endif +MODPOST_OPTS += -o $(KERN_LIB_DIR)/Module.symvers +endif + +ifeq ($(LINUX_CONFIG_DEBUG_SECTION_MISMATCH),y) +MODPOST_OPTS += -S +endif + +ifeq ($(LINUX_CONFIG_MARKERS),y) +MODPOST_OPTS += -K $(LINUX_DIR)/Module.markers +MODPOST_OPTS += -M $(KERN_LIB_DIR)/Module.markers +endif + +ifeq ($(LINUX_KBUILD_MODPOST_WARN),y) +MODPOST_OPTS += -w +endif + +ifneq ($(LINUX_BUILDHOST),) +ifneq ($(LINUX_BUILDHOST),$(LINUX_ARCH)) +MODPOST_OPTS += -c +endif +endif + define COMPILE_c_o_kern_template $(2): $(1) @@ -550,7 +627,7 @@ $(2)/$(1)$(KERN_LINK_SUFFIX): $$($(1)_OBJS) @echo >>$(KERN_OBJS_DIR)/$(1).mod.d @if [ "$(KERN_EXE_SUFFIX)" = ".ko" ] ; then \ echo $(1) >>$(KERN_MODPOST_DIR)/module-changes ; \ - echo $(1) >>$(KERN_MODPOST_DIR)/$(1).mod.stamp ; \ + echo $(1) >$(KERN_MODPOST_DIR)/$(1).mod.stamp ; \ fi endef @@ -615,7 +692,7 @@ kernel-modpost-versions: $(wildcard $(LINUX_DIR)/Module.symvers) @$(QUIET_CMD_ECHO) " MODPOST $(KERN_MODPOST_DIR)" @echo >$(KERN_MODPOST_DIR)/modpost-running @rm -f $(KERN_MODPOST_DIR)/module-changes - $(Q) $(KERN_MODPOST) $(MODULES_LIST:%=%$(KERN_LINK_SUFFIX)) $(^:%=-i %) + $(Q) $(KERN_MODPOST) $(MODPOST_OPTS) $(MODULES_LIST:%=%$(KERN_LINK_SUFFIX)) $(MODULES_LIST:%=%.mod.c) : kernel-modpost-versions @@ -647,15 +724,18 @@ kernel-modpost-pass: -f $(SOURCES_DIR)/Makefile KERN_RULE_TEMPLATES=y KERN_MODPOST_PASS=y $(@:%=%-local) ; \ fi -$(eval $(call omk_pass_template, library-pass,$(USER_OBJS_DIR),USER_RULE_TEMPLATES=y,$(lib_LIBRARIES)$(shared_LIBRARIES))) -$(eval $(call omk_pass_template, binary-pass, $(USER_OBJS_DIR),USER_RULE_TEMPLATES=y,$(bin_PROGRAMS)$(utils_PROGRAMS)$(test_PROGRAMS))) +$(eval $(call omk_pass_template, library-pass,$(USER_OBJS_DIR),USER_RULE_TEMPLATES=y,$(lib_LIBRARIES)$(shared_LIBRARIES)$(bin_PROGRAMS)$(utils_PROGRAMS)$(test_PROGRAMS))) $(eval $(call omk_pass_template,clean,$(USER_OBJS_DIR),,always)) $(eval $(call omk_pass_template,install,$(USER_OBJS_DIR),,always)) -$(eval $(call omk_pass_template,include-pass,$(USER_OBJS_DIR),,always)) +$(eval $(call omk_pass_template,include-pass,$(USER_OBJS_DIR),USER_RULE_TEMPLATES=y,always)) check-dir: @$(call mkdir_def,$(USER_BUILD_DIR)) + @$(call mkdir_def,$(LINK_BUILD_DIR)/lib) + @$(call mkdir_def,$(LINK_BUILD_DIR)/bin) + @$(call mkdir_def,$(LINK_BUILD_DIR)/bin-utils) + @$(call mkdir_def,$(LINK_BUILD_DIR)/bin-tests) @$(call mkdir_def,$(KERN_BUILD_DIR)) @$(call mkdir_def,$(USER_INCLUDE_DIR)) @$(call mkdir_def,$(KERN_INCLUDE_DIR)) @@ -669,13 +749,13 @@ check-dir: install-local: # TODO -include-pass-local: - $(call include-pass-template,$(USER_INCLUDE_DIR),include) - $(call include-pass-template,$(KERN_INCLUDE_DIR),kernel) +$(eval $(call include-pass-template,$(USER_INCLUDE_DIR),include)) +$(eval $(call include-pass-template,$(KERN_INCLUDE_DIR),kernel)) ifeq ($(CONFIG_RTLINUX),y) - $(call include-pass-template,$(KERN_INCLUDE_DIR),rtlinux) +$(eval $(call include-pass-template,$(KERN_INCLUDE_DIR),rtlinux)) endif + ifdef USER_RULE_TEMPLATES # User-space static libraries and applications object files @@ -740,7 +820,7 @@ endif clean-local: clean-custom @echo Cleaning in $(KERN_OBJS_DIR) and $(USER_OBJS_DIR) - @rm -f $(KERN_OBJS_DIR)/*.o $(USER_OBJS_DIR)/*.o $(USER_OBJS_DIR)/*.lo \ + @rm -f $(KERN_OBJS_DIR)/*.o $(USER_OBJS_DIR)/*.[och] $(USER_OBJS_DIR)/*.lo\ $(KERN_OBJS_DIR)/*.d $(USER_OBJS_DIR)/*.d \ $(KERN_OBJS_DIR)/*.map $(USER_OBJS_DIR)/*.map \ $(KERN_OBJS_DIR)/*.mod.c \ @@ -751,7 +831,14 @@ clean-local: clean-custom touch -t 200001010101 $(KERN_LIB_DIR)/kernel.mk ; \ fi -default: include-pass library-pass binary-pass +include-pass-submakes: extra-rules-subdirs + +# We must go to EXTRA_RULES_SUBDIRS beofre going to any other +# directory, since the executables compiled in EXTRA_RULES_SUBDIRS +# might be needed there. +include-pass-this-dir $(foreach subdir,$(SUBDIRS),include-pass-$(subdir)-subdir): extra-rules-subdirs + +default: include-pass library-pass link ifndef OMIT_KERNEL_PASSES # Also make kernel passes if not disabled default: kernel-lib-pass kernel-pass