X-Git-Url: http://rtime.felk.cvut.cz/gitweb/omk.git/blobdiff_plain/49f737607f3aab763fee81c208f05ae43532e6e3..3f083c05e749aa67606693525ebf8a6b9b007232:/snippets/linux diff --git a/snippets/linux b/snippets/linux index 58c3053..901155a 100644 --- a/snippets/linux +++ b/snippets/linux @@ -1,3 +1,6 @@ +# Version for Linux/RTLinux builds. +# +# # input variables # lib_LIBRARIES .. list of the user-space libraries # shared_LIBRARIES .. list of the user-space shared libraries @@ -10,24 +13,36 @@ # rtlinux_HEADERS .. list of the RT-Linux kernel-space public header files # bin_PROGRAMS .. list of the require binary programs # utils_PROGRAMS .. list of the development utility programs +# test_PROGRAMS .. list of the testing programs # kernel_MODULES .. list of the kernel side modules/applications # rtlinux_MODULES .. list of RT-Linux the kernel side modules/applications # xxx_SOURCES .. list of specific target sources +# xxx_LIBS .. list of specific target libraries # INCLUDES .. additional include directories and defines for user-space # kernel_INCLUDES .. additional include directories and defines for kernel-space # rtlinux_INCLUDES .. additional include directories and defines for RT-Linux -# QT_SUBDIRS .. subdirectories where to build QT applications using qmake -# QTDIR .. where QT resides +# OMIT_KERNEL_PASSES if defined, all kernel passes are omited # # LINUX_DIR .. location of Linux kernel sources # 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 ) ) --include $(MAKERULES_DIR)/OCERA_TOP_DIR +#OCERA_DIR := $(shell ( cd -L $(OUTPUT_DIR)/../../.. ; pwd -L ) ) + +-include $(OUTPUT_DIR)/OCERA_TOP_DIR + +BUILD_DIR_NAME = _build +COMPILED_DIR_NAME = _compiled +ifndef GROUP_DIR_NAME +GROUP_DIR_NAME = nogroup +endif ifdef OCERA_DIR ifeq ($(wildcard $(OCERA_DIR)/ocera.mk),) @@ -44,26 +59,27 @@ KERN_MODPOST_DIR := $(BUILD_DIR)/kern-modpost USER_INCLUDE_DIR := $(OCERA_USER_INCLUDES_DIR) USER_LIB_DIR := $(OCERA_USER_LIBRARIES_DIR) 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) #LINUX_DIR := $(OCERA_DIR)/kernel/linux #RTL_DIR := $(OCERA_DIR)/kernel/rtlinux #CONFIG_FILE := $(OCERA_DIR)/emdebsys/.config -ifneq ($(wildcard $(CONFIG_FILE)),) # FIXME: What's this??? -#include $(CONFIG_FILE) +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_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 ifndef LINUX_VERSION LINUX_VERSION=$(shell uname -r) @@ -73,19 +89,26 @@ LINUX_DIR=/lib/modules/$(LINUX_VERSION)/build endif endif # OCERA_DIR -# # Check and include real OCERA style Makefile.omk now -# ifndef OMK_INCLUDED -# include $(SOURCES_DIR)/Makefile.omk -# OMK_INCLUDED := 1 -# endif -# FIXME: Maybe the order of this is important. Is it wrong when this is located in base? +ifeq ($(BUILD_OS),) + # Check for target + ifeq ($(OS),Windows_NT) + BUILD_OS := win32 + else + BUILD_OS := $(shell uname | tr '[A-Z]' '[a-z]' ) + #$(warning BUILD_OS=$(BUILD_OS)) + endif +endif -#CFLAGS += -ggdb -CFLAGS += -O2 -CFLAGS += -Wall -#CXXFLAGS += -ggdb -CXXFLAGS += -O2 -CXXFLAGS += -Wall +ifeq ($(TARGET_OS),) + TARGET_OS := $(BUILD_OS) +endif + +LOCAL_BUILD_DIR = $(USER_OBJS_DIR) + +# Assign default values to CFLAGS variable. If the variable is defined +# earlier (i.g. in config.omk), it is not overriden here. +CFLAGS ?= -O2 -Wall +CXXFLAGS ?= -O2 -Wall CPPFLAGS += -I $(USER_INCLUDE_DIR) @@ -97,58 +120,51 @@ LOADLIBES += $(lib_LOADLIBES:%=-l%) LIB_CPPFLAGS += $(CPPFLAGS) LIB_CFLAGS += $(CFLAGS) -SOLIB_PICFLAGS += -shared -fpic - -ifndef RELATIVE_DIR -RELATIVE_DIR := $(SOURCES_DIR:$(MAKERULES_DIR)%=%) +ifeq ($(TARGET_OS),win32) + SOLIB_EXT = dll +else + SOLIB_EXT = so + SOLIB_PICFLAGS += -fpic endif -override RELATIVE_DIR := $(RELATIVE_DIR:/%=%) -override RELATIVE_DIR := $(RELATIVE_DIR:\\%=%) -#$(warning RELATIVE_DIR $(RELATIVE_DIR)) -override BACK2TOP_DIR := $(shell echo $(RELATIVE_DIR)/ | sed -e 's_//_/_g' -e 's_/\./_/_g' -e 's_^\./__g' -e 's_\([^/][^/]*\)_.._g' -e 's_/$$__') -#$(warning BACK2TOP_DIR $(BACK2TOP_DIR)) - -#$(warning SOURCES_DIR = $(SOURCES_DIR)) -#$(warning MAKERULES_DIR = $(MAKERULES_DIR)) -#$(warning RELATIVE_DIR = $(RELATIVE_DIR)) #vpath %.c $(SOURCES_DIR) #vpath %.cc $(SOURCES_DIR) #vpath %.cxx $(SOURCES_DIR) -VPATH = $(SOURCES_DIR) -srcdir = $(SOURCES_DIR) - USER_OBJS_DIR = $(USER_BUILD_DIR)/$(RELATIVE_DIR) KERN_OBJS_DIR = $(KERN_BUILD_DIR)/$(RELATIVE_DIR) -.PHONY: dep subdirs clean clean-custom cleandepend default-config -.PHONY: check-make-ver check-dir include-pass library-pass binary-pass utils-pass -.PHONY: kernel-lib-pass kernel-pass kernel-mod-pass kernel-modpost-pass default-config-pass -.PHONY: check-dir-local include-pass-local library-pass-local binary-pass-local -.PHONY: utils-pass-local kernel-lib-pass-local kernel-mod-pass-local kernel-modpost-pass-local -.PHONY: default-config-pass-local +.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 utils-pass: library-pass +binary-pass: library-pass kernel-lib-pass: include-pass kernel-mod-pass: kernel-lib-pass kernel-modpost-pass: kernel-mod-pass kernel-pass: kernel-mod-pass kernel-modpost-pass -OMK_SERIALIZE_INCLUDED = y +override OMK_SERIALIZE_INCLUDED = y +MAKEOVERRIDES := $(filter-out OMK_SERIALIZE_INCLUDED=n,$(MAKEOVERRIDES)) endif -default: check-dir include-pass library-pass binary-pass utils-pass kernel-lib-pass kernel-pass +# Checks for OMK tester +ifdef OMK_TESTSROOT +default-config-pass-check include-pass-check: +library-pass-check binary-pass-check: + @[ -x "$(shell which $(CC))" ] || $(call canttest,Cannot find compiler: $(CC)) +endif #===================================================================== # User-space rules and templates to compile programs, libraries etc. ifdef USER_RULE_TEMPLATES +USER_SOURCES2OBJS = .o/.c .o/.cc .o/.cxx .o/.S .o/.o + +USER_SOURCES2OBJSLO = .lo/.c .lo/.cc .lo/.cxx .lo/.S .lo/.lo #%.lo: %.c # $(CC) -o $@ $(LCFLAGS) -c $< @@ -159,6 +175,10 @@ c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ cc_o_COMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER +S_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) $(ASFLAGS) -DOMK_FOR_USER + +idl_COMPILE = $(IDL_COMPILER) # Check GCC version for user build ifndef CC_MAJOR_VERSION @@ -172,10 +192,9 @@ CC_DEPFLAGS = -MT $@ -MD -MP -MF "$@.d.tmp" endif - - +# Syntax: $(call COMPILE_c_o_template,,,) define COMPILE_c_o_template -$(2): $(1) $(LOCAL_CONFIG_H) +$(2): $(1) $$(GEN_HEADERS) @$(QUIET_CMD_ECHO) " CC $$@" $(Q) if $$(c_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \ then mv -f "$$@.d.tmp" "$$@.d" ; \ @@ -184,9 +203,9 @@ $(2): $(1) $(LOCAL_CONFIG_H) endef - +# Syntax: $(call COMPILE_cc_o_template,,,) define COMPILE_cc_o_template -$(2): $(1) $(LOCAL_CONFIG_H) +$(2): $(1) $$(GEN_HEADERS) @$(QUIET_CMD_ECHO) " CXX $$@" $(Q) if $$(cc_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \ then mv -f "$$@.d.tmp" "$$@.d" ; \ @@ -195,32 +214,91 @@ $(2): $(1) $(LOCAL_CONFIG_H) endef +# Syntax: $(call COMPILE_S_o_template,,,) +define COMPILE_S_o_template +$(2): $(1) $$(GEN_HEADERS) + @$(QUIET_CMD_ECHO) " AS $$@" + $(Q) if $$(S_o_COMPILE) -D__ASSEMBLY__ $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \ + then mv -f "$$@.d.tmp" "$$@.d" ; \ + else rm -f "$$@.d.tmp" ; exit 1; \ + fi +endef + + +# Syntax: $(call CMETRIC_o_h_template,,) +define CMETRIC_o_h_template +$(2): $(1) + @$(QUIET_CMD_ECHO) " CMETRIC $$@" + $(Q)if [ -n `dirname $$@` ] ; then \ + if [ ! -e `dirname $$@` ] ; then \ + mkdir -p `dirname $$@` ; fi ; fi + $(Q)echo >$$@ '/* Automatically generated from $$< */' + $(Q)echo >>$$@ '/* Conditionals to control compilation */' + $(Q)set -o pipefail ; $(NM) $$< \ + | sed -n 's/^ *0*\(0[0-9A-Fa-f]*\) *A *_cmetric2cond_\([A-Za-z_0-9]*\) */#define \2 0x\1/p' \ + | sort >>$$@ + $(Q)echo >>$$@ '/* Defines from the values defined to symbols */' + $(Q)set -o pipefail ; $(NM) $$< \ + | sed -n 's/^ *0*\(0[0-9A-Fa-f]*\) *A *_cmetric2def_\([A-Za-z_0-9]*\) */#define \2 0x\1/p' \ + | sort >>$$@ +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) +endef + +# Syntax: $(call PROGRAM_template,,,,) +# FIXME: ???????? asi je tu blbej komentar define PROGRAM_template -$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o)) -$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o)) -$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o)) -$(1)_OBJS := $$(sort $$($(1)_OBJS)) + +USER_IDLS += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-skels.c)) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-common.c)) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-stubs.c)) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-common.c)) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_IDL:%.idl=%.c)) +USER_GEN_SOURCES += $$($(1)_GEN_SOURCES) + +$(foreach x, $(USER_SOURCES2OBJS), +$(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\ + $$($(1)_SOURCES) $$($(1)_GEN_SOURCES))) +) +$(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%)) USER_OBJS += $$($(1)_OBJS) USER_SOURCES += $$($(1)_SOURCES) -$(2)/$(1): $$($(1)_OBJS) +$(2)/$(1)$(3): $$($(1)_OBJS) @$(QUIET_CMD_ECHO) " LINK $$@" - $(Q) $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES:%.cxx=%.cc))" ] ; then echo $$(CC) ; else echo $$(CXX) ; fi) \ - $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) $$(LOADLIBES) $$(LDFLAGS) -Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map -o $(2)/$(1) - @echo "$(2)/$(1): \\" >$(USER_OBJS_DIR)/$(1).exe.d - @sed -n -e 's/^LOAD \(.*\)$$$$/ \1 \\/p' $(USER_OBJS_DIR)/$(1).exe.map >>$(USER_OBJS_DIR)/$(1).exe.d + $(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 endef - +# Syntax: $(call LIBRARY_template,) define LIBRARY_template -$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o)) -$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o)) -$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o)) -$(1)_OBJS := $$(sort $$($(1)_OBJS)) + +USER_IDLS += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-skels.c)) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-common.c)) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-stubs.c)) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-common.c)) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_IDL:%.idl=%.c)) +USER_GEN_SOURCES += $$($(1)_GEN_SOURCES) + +$(foreach x, $(USER_SOURCES2OBJS), +$(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\ + $$($(1)_SOURCES) $$($(1)_GEN_SOURCES))) +) +$(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%)) USER_OBJS += $$($(1)_OBJS) USER_SOURCES += $$($(1)_SOURCES) @@ -231,32 +309,58 @@ $(USER_LIB_DIR)/lib$(1).a: $$($(1)_OBJS) endef - +# Syntax: $(call SOLIB_template,) define SOLIB_template -$(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.c=%.lo)) -$(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.cc=%.lo)) -$(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.cxx=%.lo)) -$(1)_OBJSLO := $$(sort $$($(1)_OBJSLO)) + +USER_IDLS += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-skels.c)) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-common.c)) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-stubs.c)) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-common.c)) +$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_IDL:%.idl=%.c)) +SOLIB_GEN_SOURCES += $$($(1)_GEN_SOURCES) + +$(foreach x, $(USER_SOURCES2OBJSLO), +$(1)_OBJSLO += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\ + $$($(1)_SOURCES) $$($(1)_GEN_SOURCES))) +) +$(1)_OBJSLO := $$(sort $$($(1)_OBJSLO:%/=%)) SOLIB_OBJS += $$($(1)_OBJSLO) SOLIB_SOURCES += $$($(1)_SOURCES) -$(USER_LIB_DIR)/lib$(1).so: $$($(1)_OBJSLO) +$(USER_LIB_DIR)/lib$(1).$(SOLIB_EXT): $$($(1)_OBJSLO) @$(QUIET_CMD_ECHO) " LINK $$@" - $(Q) $(LD) --shared --soname=lib$(1).so -o $$@ $$^ + $(Q) $(CC) --shared -Xlinker -soname=lib$(1).$(SOLIB_EXT) -o $$@ $$^ $$(LOADLIBES) $$($(1)_LIBS:%=-l%) endef -library-pass-local: $(lib_LIBRARIES:%=$(USER_LIB_DIR)/lib%.a) $(shared_LIBRARIES:%=$(USER_LIB_DIR)/lib%.so) +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)) + +# Special rules for CMETRIC generated headers + +$(foreach cmetrh,$(cmetric_include_HEADERS),$(eval $(call COMPILE_c_o_template,\ + $(SOURCES_DIR)/$($(basename $(notdir $(cmetrh)))_CMETRIC_SOURCES),\ + $($(basename $(notdir $(cmetrh)))_CMETRIC_SOURCES:%.c=%.o),))) +$(foreach cmetrh,$(cmetric_include_HEADERS),$(eval $(call CMETRIC_o_h_template,\ + $($(basename $(notdir $(cmetrh)))_CMETRIC_SOURCES:%.c=%.o),\ + $(addprefix $(USER_INCLUDE_DIR)/,$(cmetrh))))) + +GEN_HEADERS+=$(cmetric_include_HEADERS:%=$(USER_INCLUDE_DIR)/%) + +GEN_HEADERS+=$(filter %.h,$(USER_IDLS:%.idl=%.h)) -binary-pass-local: $(bin_PROGRAMS:%=$(USER_BIN_DIR)/%) +# Generate rules for compilation of programs and libraries -utils-pass-local: $(utils_PROGRAMS:%=$(USER_UTILS_DIR)/%) +$(foreach prog,$(utils_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_UTILS_DIR),$(EXE_SUFFIX)))) -$(foreach prog,$(utils_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_UTILS_DIR)))) +$(foreach prog,$(test_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_TESTS_DIR),$(EXE_SUFFIX)))) -$(foreach prog,$(bin_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR)))) +$(foreach prog,$(bin_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR),$(EXE_SUFFIX)))) $(foreach lib,$(lib_LIBRARIES),$(eval $(call LIBRARY_template,$(lib)))) @@ -271,9 +375,9 @@ endif ifdef KERN_RULE_TEMPLATES -$(KERN_LIB_DIR)/kernel.mk: $(LINUX_DIR)/.config $(MAKERULES_DIR)/kernelcfg2mk +$(KERN_LIB_DIR)/kernel.mk: $(LINUX_DIR)/.config $(OUTPUT_DIR)/kernelcfg2mk @$(QUIET_CMD_ECHO) " KCFG2MK $$@" - $(Q) $(MAKERULES_DIR)/kernelcfg2mk $(LINUX_DIR) $(KERN_LIB_DIR) + $(Q) $(OUTPUT_DIR)/kernelcfg2mk $(LINUX_DIR) $(KERN_LIB_DIR) ifeq ($(CONFIG_RTLINUX),y) include $(RTL_DIR)/rtl.mk @@ -306,6 +410,7 @@ KERN_CC = echo KERN_CC not defined - compilation skipped endif c_o_kern_COMPILE = $(KERN_CC) $(kernel_INCLUDES) -idirafter $(kern_GCCLIB_DIR)/include $(LINUX_CPPFLAGS) $(LINUX_CFLAGS) $(LINUX_CFLAGS_MODULE) -DOMK_FOR_KERNEL -DEXPORT_SYMTAB -nostdinc cc_o_kern_COMPILE = $(KERN_CC) $(kernel_INCLUDES) -idirafter $(kern_GCCLIB_DIR)/include $(LINUX_CPPFLAGS) $(LINUX_CFLAGS) $(LINUX_CFLAGS_MODULE) -DOMK_FOR_KERNEL -DEXPORT_SYMTAB +S_o_kern_COMPILE = $(KERN_CC) $(kernel_INCLUDES) -idirafter $(kern_GCCLIB_DIR)/include $(LINUX_CPPFLAGS) $(LINUX_AFLAGS) $(LINUX_CFLAGS_MODULE) -DOMK_FOR_KERNEL -DEXPORT_SYMTAB KERN_EXE_SUFFIX := $(LINUX_MODULE_EXT) KERN_LDFLAGS = $(LINUX_LDFLAGS) ifdef LINUX_ARCH @@ -323,6 +428,10 @@ KERN_AR = $(LINUX_AR) else KERN_AR = $(AR) endif +ifeq ($(LINUX_QUOTE_MODNAME),y) +KERN_MQ=\" +KERN_KBUILD_MODNAME=-D"KBUILD_MODNAME=((THIS_MODULE)?(THIS_MODULE)->name:NULL)" +endif endif # CONFIG_RTLINUX KERN_LOADLIBES += -L$(KERN_LIB_DIR) @@ -358,9 +467,10 @@ endif define COMPILE_c_o_kern_template -$(2): $(1) $(LOCAL_CONFIG_H) +$(2): $(1) @$(QUIET_CMD_ECHO) " CC [K] $$@" - $(Q) if $$(c_o_kern_COMPILE) $$(kern_CC_DEPFLAGS) $(3) -DKBUILD_BASENAME=$(notdir $(basename $(1))) \ + $(Q) if $$(c_o_kern_COMPILE) $$(kern_CC_DEPFLAGS) $(3) $(KERN_KBUILD_MODNAME) \ + -D"KBUILD_BASENAME=$(KERN_MQ)$(notdir $(basename $(1)))$(KERN_MQ)" \ -o $$@ -c $$< ; \ then mv -f "$$@.d.tmp" "$$@.d" ; \ else rm -f "$$@.d.tmp" ; exit 1; \ @@ -371,9 +481,24 @@ endef define COMPILE_cc_o_kern_template -$(2): $(1) $(LOCAL_CONFIG_H) +$(2): $(1) @$(QUIET_CMD_ECHO) " CXX [K] $$@" - $(Q) if $$(cc_o_kern_COMPILE) $$(kern_CC_DEPFLAGS) $(3) -DKBUILD_BASENAME=$(notdir $(basename $(1))) \ + $(Q) if $$(cc_o_kern_COMPILE) $$(kern_CC_DEPFLAGS) $(3) $(KERN_KBUILD_MODNAME) \ + -D"KBUILD_BASENAME=$(KERN_MQ)$(notdir $(basename $(1)))$(KERN_MQ)" \ + -o $$@ -c $$< ; \ + then mv -f "$$@.d.tmp" "$$@.d" ; \ + else rm -f "$$@.d.tmp" ; exit 1; \ + fi +endef + + + +define COMPILE_S_o_kern_template + +$(2): $(1) + @$(QUIET_CMD_ECHO) " AS [K] $$@" + $(Q) if $$(S_o_kern_COMPILE) $$(kern_CC_DEPFLAGS) $(3) $(KERN_KBUILD_MODNAME) \ + -D"KBUILD_BASENAME=$(KERN_MQ)$(notdir $(basename $(1)))$(KERN_MQ)" \ -o $$@ -c $$< ; \ then mv -f "$$@.d.tmp" "$$@.d" ; \ else rm -f "$$@.d.tmp" ; exit 1; \ @@ -425,7 +550,7 @@ $(2)/$(1)$(KERN_LINK_SUFFIX): $$($(1)_OBJS) @echo "$(2)/$(1)$(KERN_LINK_SUFFIX): \\" >$(KERN_OBJS_DIR)/$(1).mod.d @sed -n -e 's/^LOAD \(.*\)$$$$/ \1 \\/p' $(KERN_OBJS_DIR)/$(1).mod.map >>$(KERN_OBJS_DIR)/$(1).mod.d @echo >>$(KERN_OBJS_DIR)/$(1).mod.d - @if [ "$(KERN_EXE_SUFFIX)" == ".ko" ] ; then \ + @if [ "$(KERN_EXE_SUFFIX)" = ".ko" ] ; then \ echo $(1) >>$(KERN_MODPOST_DIR)/module-changes ; \ echo $(1) >>$(KERN_MODPOST_DIR)/$(1).mod.stamp ; \ fi @@ -482,7 +607,9 @@ MODULES_LIST := $(MODULES_LIST:%.mod.stamp=%) define MODPOST_kern_template $(2) : $(1)$(KERN_LINK_SUFFIX) $(1).mod.c @$(QUIET_CMD_ECHO) " LD [M] $$@" - $(Q) $$(cc_o_kern_COMPILE) -DKBUILD_BASENAME=$(1) -DKBUILD_MODNAME=$(1) -o $(1).mod.o -c $(1).mod.c + $(Q) $$(cc_o_kern_COMPILE) -D"KBUILD_BASENAME=$(KERN_MQ)$(1)$(KERN_MQ)" \ + -D"KBUILD_MODNAME=$(KERN_MQ)$(1)$(KERN_MQ)" \ + -o $(1).mod.o -c $(1).mod.c $(Q) $$(KERN_LD) $$(KERN_LDFLAGS) $(1)$(KERN_LINK_SUFFIX) $(1).mod.o -r -o $$@ endef @@ -507,8 +634,13 @@ endif #===================================================================== -$(eval $(call omk_pass_template, kernel-lib-pass,KERN_RULE_TEMPLATES=y,-n "$(kernel_LIBRARIES)$(rtlinux_LIBRARIES)",$(KERN_OBJS_DIR))) -$(eval $(call omk_pass_template, kernel-mod-pass,KERN_RULE_TEMPLATES=y,-n "$(kernel_MODULES)$(rtlinux_MODULES)",$(KERN_OBJS_DIR))) +# Kernel requires its own set of configuration header-files +ifneq ($(kernel_LIBRARIES)$(rtlinux_LIBRARIES)$(kernel_MODULES)$(rtlinux_MODULES)$(kernel_HEADERS)$(rtlinux_HEADERS)$(kernel_HEADERS)$(rtlinux_HEADERS)$(nobase_kernel_HEADERS)$(nobase_rtlinux_HEADERS)$(renamed_kernel_HEADERS)$(renamed_rtlinux_HEADERS),) +KERN_CONFIG_HEADERS_REQUIRED = y +endif + +$(eval $(call omk_pass_template, kernel-lib-pass,$(KERN_OBJS_DIR),KERN_RULE_TEMPLATES=y,$(kernel_LIBRARIES)$(rtlinux_LIBRARIES))) +$(eval $(call omk_pass_template, kernel-mod-pass,$(KERN_OBJS_DIR),KERN_RULE_TEMPLATES=y,$(kernel_MODULES)$(rtlinux_MODULES))) kernel-modpost-pass: +@if [ -e "$(KERN_MODPOST_DIR)/module-changes" -o -e "$(KERN_MODPOST_DIR)/modpost-running" ] ; \ @@ -517,63 +649,34 @@ kernel-modpost-pass: -f $(SOURCES_DIR)/Makefile KERN_RULE_TEMPLATES=y KERN_MODPOST_PASS=y $(@:%=%-local) ; \ fi -define qt_subpass - +@$(foreach dir, $(QT_SUBDIRS), $(call mkdir_def,$(USER_OBJS_DIR)/$(dir)) ; \ - if [ "$@" != "binary-pass" ] ; then exit 0 ; fi ; \ - if [ ! -e $(SOURCES_DIR)/$(dir)/Makefile ] ; then \ - ( cd $(SOURCES_DIR)/$(dir) ; $$QTDIR/bin/qmake TOP_DIR=$(MAKERULES_DIR) \ - RELATIVE_DIR=$(RELATIVE_DIR)/$(dir) QTDIR=$(QTDIR) CC=$(CC) \ - CXX=$(CXX) || exit 1 ;) ; fi ; \ - $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \ - RELATIVE_DIR=$(RELATIVE_DIR)/$(dir) -C $(SOURCES_DIR)/$(dir) \ - -f $(SOURCES_DIR)/$(dir)/Makefile || exit 1 ;) -endef - -$(eval $(call omk_pass_template, library-pass,USER_RULE_TEMPLATES=y,-n "$(lib_LIBRARIES)$(shared_LIBRARIES)",$(USER_OBJS_DIR))) -$(eval $(call omk_pass_template, utils-pass,USER_RULE_TEMPLATES=y,-n "$(utils_PROGRAMS)",$(USER_OBJS_DIR))) -$(eval $(call omk_pass_template, binary-pass,USER_RULE_TEMPLATES=y,\ - -n "$(bin_PROGRAMS)$(QT_SUBDIRS)",$(USER_OBJS_DIR),$(qt_subpass)) - -OTHER_PASSES = dep clean install check-dir default-config-pass -$(eval $(call omk_pass_template,$(OTHER_PASSES))) +$(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))) -# FIXME: Are the 'dep' and 'install' passes usefull? -dep-local: +$(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)) -check-dir-local: - @$(call mkdir_def,$(USER_OBJS_DIR)) - @$(call mkdir_def,$(KERN_OBJS_DIR)) +check-dir: + @$(call mkdir_def,$(USER_BUILD_DIR)) + @$(call mkdir_def,$(KERN_BUILD_DIR)) @$(call mkdir_def,$(USER_INCLUDE_DIR)) @$(call mkdir_def,$(KERN_INCLUDE_DIR)) @$(call mkdir_def,$(USER_LIB_DIR)) @$(call mkdir_def,$(KERN_LIB_DIR)) @$(call mkdir_def,$(USER_BIN_DIR)) @$(call mkdir_def,$(USER_UTILS_DIR)) + @$(call mkdir_def,$(USER_TESTS_DIR)) @$(call mkdir_def,$(KERN_MODULES_DIR)) @$(call mkdir_def,$(KERN_MODPOST_DIR)) -install-local: +install-local: # TODO include-pass-local: - @$(call mkdir_def,$(USER_INCLUDE_DIR)) - @$(foreach f, $(include_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(notdir $(f)) \ - || cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(notdir $(f)) || exit 1 ; ) - @$(foreach f, $(nobase_include_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(f) \ - || ( mkdir -p $(USER_INCLUDE_DIR)/$(dir $(f)) && cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(f) ) || exit 1 ; ) - @$(foreach f, $(renamed_include_HEADERS), \ - srcfname=`echo '$(f)' | sed -e 's/^\(.*\)->.*$$/\1/'` ; destfname=`echo '$(f)' | sed -e 's/^.*->\(.*\)$$/\1/'` ; \ - cmp --quiet $(SOURCES_DIR)/$${srcfname} $(USER_INCLUDE_DIR)/$${destfname} \ - || ( mkdir -p `dirname $(USER_INCLUDE_DIR)/$${destfname}` && cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$${srcfname} $(USER_INCLUDE_DIR)/$${destfname} ) || exit 1 ; ) -# Kernel and RT-Linux stuff - @$(call mkdir_def,$(KERN_INCLUDE_DIR)) - @$(foreach f, $(kernel_HEADERS) $(rtlinux_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(KERN_INCLUDE_DIR)/$(notdir $(f)) \ - || cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(KERN_INCLUDE_DIR)/$(notdir $(f)) || exit 1 ; ) - @$(foreach f, $(nobase_kernel_HEADERS) $(nobase_rtlinux_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(KERN_INCLUDE_DIR)/$(f) \ - || ( mkdir -p $(KERN_INCLUDE_DIR)/$(dir $(f)) && cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(KERN_INCLUDE_DIR)/$(f) ) || exit 1 ; ) - @$(foreach f, $(renamed_kernel_HEADERS) $(renamed_rtlinux_HEADERS), \ - srcfname=`echo '$(f)' | sed -e 's/^\(.*\)->.*$$/\1/'` ; destfname=`echo '$(f)' | sed -e 's/^.*->\(.*\)$$/\1/'` ; \ - cmp --quiet $(SOURCES_DIR)/$${srcfname} $(KERN_INCLUDE_DIR)/$${destfname} \ - || ( mkdir -p `dirname $(KERN_INCLUDE_DIR)/$${destfname}` && cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$${srcfname} $(KERN_INCLUDE_DIR)/$${destfname} ) || exit 1 ; ) + $(call include-pass-template,$(USER_INCLUDE_DIR),include) + $(call include-pass-template,$(KERN_INCLUDE_DIR),kernel) +ifeq ($(CONFIG_RTLINUX),y) + $(call include-pass-template,$(KERN_INCLUDE_DIR),rtlinux) +endif ifdef USER_RULE_TEMPLATES @@ -581,6 +684,8 @@ ifdef USER_RULE_TEMPLATES USER_SOURCES := $(sort $(USER_SOURCES)) +USER_GEN_SOURCES := $(sort $(USER_GEN_SOURCES)) + #$(warning USER_SOURCES = $(USER_SOURCES)) $(foreach src,$(filter %.c,$(USER_SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.o),))) @@ -589,11 +694,18 @@ $(foreach src,$(filter %.cc,$(USER_SOURCES)),$(eval $(call COMPILE_cc_o_template $(foreach src,$(filter %.cxx,$(USER_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%.o),))) +$(foreach src,$(filter %.S,$(USER_SOURCES)),$(eval $(call COMPILE_S_o_template,$(SOURCES_DIR)/$(src),$(src:%.S=%.o),))) + +$(foreach src,$(filter %.c,$(USER_GEN_SOURCES)),$(eval $(call COMPILE_c_o_template,$(src),$(src:%.c=%.o),))) + # User-space shared libraries object files SOLIB_SOURCES := $(sort $(SOLIB_SOURCES)) +SOLIB_GEN_SOURCES := $(sort $(SOLIB_GEN_SOURCES)) + #$(warning SOLIB_SOURCES = $(SOLIB_SOURCES)) +#$(warning SOLIB_GEN_SOURCES = $(SOLIB_GEN_SOURCES)) $(foreach src,$(filter %.c,$(SOLIB_SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.lo),$(SOLIB_PICFLAGS)))) @@ -601,6 +713,16 @@ $(foreach src,$(filter %.cc,$(SOLIB_SOURCES)),$(eval $(call COMPILE_cc_o_templat $(foreach src,$(filter %.cxx,$(SOLIB_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%.lo),$(SOLIB_PICFLAGS)))) +$(foreach src,$(filter %.S,$(SOLIB_SOURCES)),$(eval $(call COMPILE_S_o_template,$(SOURCES_DIR)/$(src),$(src:%.S=%.lo),$(SOLIB_PICFLAGS)))) + +$(foreach src,$(filter %.c,$(SOLIB_GEN_SOURCES)),$(eval $(call COMPILE_c_o_template,$(src),$(src:%.c=%.lo),$(SOLIB_PICFLAGS)))) + +# IDL compilation + +USER_IDLS := $(sort $(USER_IDLS)) + +$(foreach src,$(filter %.idl,$(USER_IDLS)),$(eval $(call COMPILE_idl_template,$(SOURCES_DIR)/$(src),$(src:%.idl=%)))) + endif ifdef KERN_RULE_TEMPLATES @@ -615,9 +737,9 @@ $(foreach src,$(filter %.cc,$(KERN_SOURCES)),$(eval $(call COMPILE_cc_o_kern_tem $(foreach src,$(filter %.cxx,$(KERN_SOURCES)),$(eval $(call COMPILE_cc_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%.o),))) +$(foreach src,$(filter %.S,$(USER_SOURCES)),$(eval $(call COMPILE_S_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.S=%.o),))) 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 \ @@ -631,6 +753,12 @@ clean-local: clean-custom touch -t 200001010101 $(KERN_LIB_DIR)/kernel.mk ; \ fi +include-pass-submakes: extra-rules-subdirs +default: include-pass library-pass binary-pass +ifndef OMIT_KERNEL_PASSES +# Also make kernel passes if not disabled +default: kernel-lib-pass kernel-pass +endif # Local Variables: # mode:makefile