# (C) Copyright 2003 by Pavel Pisa - OCERA team member
# (C) Copyright 2006 by Michal Sojka - Czech Technical University, FEE, DCE
#
+# Homepage: http://rtime.felk.cvut.cz/omk/
+#
# The OMK build system is distributed under the GNU General Public
# License. See file COPYING for details.
#
# 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
# variables.
# QT_SUBDIRS .. subdirectories where to build QT applications using qmake #OMK@qt
# QTDIR .. where QT resides
--include $(MAKERULES_DIR)/OCERA_TOP_DIR #OMK@linux-setup
-
-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),)
-$(warning "ocera.mk" file does not exist. Adapt Makefile.rules for standalone compilation)
-$(warning (comment out definition of OCERA_DIR line and optionally select RTL_DIR) )
-$(error or go to the ocera/ directory and do 'make' to generate the "ocera.mk" file first, please)
-endif
-include $(OCERA_DIR)/ocera.mk
-KERN_INCLUDE_DIR := $(OCERA_KERNEL_INCLUDES_DIR)
-KERN_LIB_DIR := $(OCERA_KERNEL_LIBRARIES_DIR)
-KERN_MODULES_DIR := $(OCERA_MODULES_DIR)
-KERN_BUILD_DIR := $(BUILD_DIR)/kern/$(GROUP_DIR_NAME)
-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_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)),)
-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
-
-ifndef LINUX_VERSION
-LINUX_VERSION=$(shell uname -r)
-endif
-ifndef LINUX_DIR
-LINUX_DIR=/lib/modules/$(LINUX_VERSION)/build
-endif
-endif # OCERA_DIR
-
-LOCAL_BUILD_DIR = $(USER_OBJS_DIR)
-
-# Local Variables:
-# mode:makefile
-# End:
+OMK_RULES_TYPE=linux #OMK@__type
#OMK@base
# We need to ensure definition of sources directory first
ifndef SOURCES_DIR
+# Only shell built-in pwd understands -L
SOURCES_DIR := $(shell ( pwd -L ) )
endif
+# If we are not called by OMK leaf Makefile...
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(abspath $(dir $(filter %Makefile.rules,$(MAKEFILE_LIST))))
+endif
+
.PHONY: all default check-make-ver omkize
ifdef W
@$(MAKE) -C $(MAKERULES_DIR) OMK_SERIALIZE_INCLUDED=n SOURCES_DIR=$(MAKERULES_DIR) RELATIVE_DIR="" $(MAKECMDGOALS) W=0
endif
+ifdef OMK_TESTSROOT
+# Usage: $(call canttest,<error message>)
+define canttest
+ ( echo "$(1)" > $(MAKERULES_DIR)/_canttest; echo "$(1)"; exit 1 )
+endef
+else
+define canttest
+ echo "$(1)"
+endef
+endif
+
#=========================
# Include the config file
endif
endif
+-include $(MAKERULES_DIR)/config.target
+
ifneq ($(wildcard $(CONFIG_FILE)),)
include $(CONFIG_FILE)
CONFIG_FILE_OK = y
#vpath %.cc $(SOURCES_DIR)
#vpath %.cxx $(SOURCES_DIR)
-VPATH = $(SOURCES_DIR)
+# Define srcdir for Automake compatibility
srcdir = $(SOURCES_DIR)
# Defines for quiet compilation
ifndef OMK_VERBOSE
OMK_VERBOSE = 0
endif
-ifeq ($(OMK_VERBOSE),1)
+ifneq ($(OMK_VERBOSE),0)
Q =
else
Q = @
NO_PRINT_DIRECTORY := --no-print-directory
endif
-# Syntax: $(call omk_pass_template,<pass name>,<build dir>,[<local make flags>],[<local condition>])
+ifeq ($(USE_LEAF_MAKEFILES),n)
+export USE_LEAF_MAKEFILES
+SUBDIR_MAKEFILE=$(MAKERULES_DIR)/Makefile.rules
+SOURCESDIR_MAKEFILE=$(MAKERULES_DIR)/Makefile.rules
+else
+SUBDIR_MAKEFILE=$(SOURCES_DIR)/$(dir)/Makefile
+SOURCESDIR_MAKEFILE=$(SOURCES_DIR)/Makefile
+endif
+
+ifdef OMK_TESTSROOT
+check-target = $$(@:%=%-check)
+endif
+
+# Syntax: $(call omk_pass_template,<pass name(s)>,<build dir>,[<local make flags>],[<local condition>])
define omk_pass_template
-.PHNOY: $(1) $(1)-local
+.PHONY: $(1) $(addsuffix -local,$(1)) $(addsuffix -check,$(1))
$(1):
+@$(foreach dir,$(SUBDIRS),$(call mkdir_def,$(2)/$(dir)); \
$(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) $(NO_PRINT_DIRECTORY) \
RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(2)/$(dir) \
- -f $(SOURCES_DIR)/$(dir)/Makefile $$@ || exit 1 ;) true
+ -f $(SUBDIR_MAKEFILE) $$@ || exit 1 ;) true
ifneq ($(4),)
@echo "make[omk]: $$@ in $(RELATIVE_DIR)"; \
$(call mkdir_def,$(2)); \
$(MAKE) $(NO_PRINT_DIRECTORY) SOURCES_DIR=$(SOURCES_DIR) RELATIVE_DIR=$(RELATIVE_DIR) -C $(2) \
- -f $(SOURCES_DIR)/Makefile $(3) $$(@:%=%-local)
+ -f $(SOURCESDIR_MAKEFILE) $(3) $(check-target) $$(@:%=%-local)
endif
endef
echo "Makefile is not OMK leaf makefile!" >&2; exit 1; \
fi
$(Q)for i in `find -L . -name Makefile.omk` ; do \
- i=`dirname $${i}`; \
- if [ x"$$i" != x"." ]; then \
- rm -f $${i}/Makefile; \
- cp Makefile $${i}/Makefile; \
+ d=`dirname $${i}`; \
+ if ! test -f "$${d}/Makefile.rules" && ( ! test -f "$${d}/Makefile" || ! cmp --silent Makefile "$${d}/Makefile" ); then \
+ rm -f "$${d}/Makefile"; \
+ cp -v Makefile "$${d}/Makefile"; \
fi \
done
ifeq ($(OMK_VERBOSE),1) #OMK@include
endef
else
define cp_cmd
-( echo " LN $(1:$(MAKERULES_DIR)/%=%) -> $(2:$(MAKERULES_DIR)/%=%)"; ln -sf $(LNHEADER_FLAGS) $(1) $(2) )
+( echo " LN $(1:$(MAKERULES_DIR)/%=%) -> $(2:$(MAKERULES_DIR)/%=%)"; [ -f $(1) ] && ln -sf $(LNHEADER_FLAGS) $(1) $(2) )
endef
endif
#CONFIG_RTLINUX = y
#OCERA_DIR := $(shell ( cd -L $(MAKERULES_DIR)/../../.. ; pwd -L ) )
+-include $(MAKERULES_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),)
+$(warning "ocera.mk" file does not exist. Adapt Makefile.rules for standalone compilation)
+$(warning (comment out definition of OCERA_DIR line and optionally select RTL_DIR) )
+$(error or go to the ocera/ directory and do 'make' to generate the "ocera.mk" file first, please)
+endif
+include $(OCERA_DIR)/ocera.mk
+KERN_INCLUDE_DIR := $(OCERA_KERNEL_INCLUDES_DIR)
+KERN_LIB_DIR := $(OCERA_KERNEL_LIBRARIES_DIR)
+KERN_MODULES_DIR := $(OCERA_MODULES_DIR)
+KERN_BUILD_DIR := $(BUILD_DIR)/kern/$(GROUP_DIR_NAME)
+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)),)
+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
+
+ifndef LINUX_VERSION
+LINUX_VERSION=$(shell uname -r)
+endif
+ifndef LINUX_DIR
+LINUX_DIR=/lib/modules/$(LINUX_VERSION)/build
+endif
+endif # OCERA_DIR
+
+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
+
+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
#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)
kernel-pass: kernel-mod-pass kernel-modpost-pass
override OMK_SERIALIZE_INCLUDED = y
+MAKEOVERRIDES := $(filter-out OMK_SERIALIZE_INCLUDED=n,$(MAKEOVERRIDES))
+endif
+
+# 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 file compiler: $(CC))
endif
#=====================================================================
$(USER_LIB_DIR)/lib$(1).$(SOLIB_EXT): $$($(1)_OBJSLO)
@$(QUIET_CMD_ECHO) " LINK $$@"
- $(Q) $(LD) --shared --soname=lib$(1).$(SOLIB_EXT) -o $$@ $$^
+ $(Q) $(LD) --shared --soname=lib$(1).$(SOLIB_EXT) -o $$@ $$^ $$(LOADLIBES) $$($(1)_LIBS:%=-l%)
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))
+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 prog,$(utils_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_UTILS_DIR),$(EXE_SUFFIX))))
+$(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),$(EXE_SUFFIX))))
$(foreach lib,$(lib_LIBRARIES),$(eval $(call LIBRARY_template,$(lib))))
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)))
+$(eval $(call omk_pass_template, binary-pass, $(USER_OBJS_DIR),USER_RULE_TEMPLATES=y,$(bin_PROGRAMS)$(utils_PROGRAMS)$(test_PROGRAMS)))
OTHER_PASSES = clean install include-pass
$(eval $(call omk_pass_template,$(OTHER_PASSES),$(USER_OBJS_DIR),,always))
@$(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))
@$(foreach ch,$(config_include_HEADERS), \
echo "$(USER_INCLUDE_DIR:$(MAKERULES_DIR)/$(addsuffix /,$(SOURCES_LIST_DIR))%=%)/$(ch)" >> "$(SOURCES_LIST).tmp";)
@$(foreach h,$(renamed_include_HEADERS),echo "$(RELATIVE_DIR:$(SOURCES_LIST_DIR)/%=%)/$(h)"|sed -e 's/\(.*\)->.*/\1/' >> "$(SOURCES_LIST).tmp";)
- @$(foreach bin,$(lib_LIBRARIES) $(shared_LIBRARIES) $(bin_PROGRAMS) $(utils_PROGRAMS) \
+ @$(foreach bin,$(lib_LIBRARIES) $(shared_LIBRARIES) $(bin_PROGRAMS) $(test_PROGRAMS) $(utils_PROGRAMS) \
$(kernel_LIBRARIES) $(rtlinux_LIBRARIES) $(kernel_MODULES),\
$(foreach src,$(filter-out %.o,$($(bin)_SOURCES)),echo "$(RELATIVE_DIR:$(SOURCES_LIST_DIR)/%=%)/$(src)" >> "$(SOURCES_LIST).tmp";))