X-Git-Url: http://rtime.felk.cvut.cz/gitweb/omk.git/blobdiff_plain/bbd0ab0e18aecd717d64be870e530015e3cb3485..0ae46d2f25fcb6e6659f46b6c94e5a703adb7cc7:/snippets/linux
diff --git a/snippets/linux b/snippets/linux
index ded6560..4b0d135 100644
--- a/snippets/linux
+++ b/snippets/linux
@@ -62,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
@@ -80,6 +81,7 @@ 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)
@@ -103,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
@@ -115,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)
@@ -133,14 +138,14 @@ 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
# Some support to serialize some targets for parallel make
ifneq ($(OMK_SERIALIZE_INCLUDED),y)
include-pass: check-dir
-library-pass: include-pass
-binary-pass: library-pass
+link: include-pass
kernel-lib-pass: include-pass
kernel-mod-pass: kernel-lib-pass
kernel-modpost-pass: kernel-mod-pass
@@ -153,7 +158,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
@@ -248,12 +253,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)
@@ -273,13 +277,13 @@ $(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
+include-pass-local: $(OMK_WORK_DIR)/$(2)-$(1)$(EXE_SUFFIX).cmd
+$(OMK_WORK_DIR)/$(2)-$(1)$(EXE_SUFFIX).cmd: $$($(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
@@ -308,6 +312,7 @@ $(USER_LIB_DIR)/lib$(1).a: $$($(1)_OBJS)
$(Q) $(AR) rcs $$@ $$^
endef
+.PHONY: FORCE
# Syntax: $(call SOLIB_template,)
define SOLIB_template
@@ -329,17 +334,26 @@ $(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
+$(OMK_WORK_DIR)/targets.omk: FORCE
+ @rm $$@.tmp; \
+ echo '_omk_libs += $(lib_LIBRARIES)' >> $$@.tmp; \
+ echo '_omk_shared_libs += $(shared_LIBRARIES)' >> $$@.tmp; \
+ echo '_omk_bin += $(bin_PROGRAMS)' >> $$@.tmp; \
+ echo '_omk_utils += $(utils_PROGRAMS)' >> $$@.tmp; \
+ echo '_omk_test += $(test_PROGRAMS)' >> $$@.tmp; \
+ if cmp -s $$@.tmp $$@; then rm $$@.tmp; else mv $$@.tmp $$@; fi
-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))
+include-pass-local: $(addprefix $(USER_INCLUDE_DIR)/,$(cmetric_include_HEADERS)) \
+ $(OMK_WORK_DIR)/targets.omk
# Special rules for CMETRIC generated headers
@@ -356,11 +370,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))))
@@ -368,7 +382,48 @@ $(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): dir=$(LINK_BUILD_DIR)/$$(notdir $(2))
+$(2)/$(1)$(EXE_SUFFIX): $$($(1)_objs)
+ @$(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 true; find $(USER_BUILD_DIR) -name '*.omkvar') # `true' is a hack for MinGW
+#$(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.
@@ -430,7 +485,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
@@ -465,6 +520,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)
@@ -552,7 +635,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
@@ -617,7 +700,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
@@ -649,15 +732,16 @@ 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,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))
@@ -671,13 +755,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
@@ -754,12 +838,18 @@ clean-local: clean-custom
fi
include-pass-submakes: extra-rules-subdirs
-default: include-pass library-pass binary-pass
+
+# 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 link
ifndef OMIT_KERNEL_PASSES
# Also make kernel passes if not disabled
default: kernel-lib-pass kernel-pass
endif
# Local Variables:
-# mode:makefile
+# mode:makefile-gmake
# End: