]> rtime.felk.cvut.cz Git - sysless.git/commitdiff
Added support for CMETRIC generated header files into OMK build system.
authorPavel Pisa <pisa@cmp.felk.cvut.cz>
Sun, 27 Nov 2005 11:26:00 +0000 (11:26 +0000)
committerPavel Pisa <pisa@cmp.felk.cvut.cz>
Sun, 27 Nov 2005 11:26:00 +0000 (11:26 +0000)
The CMETRIC rules enables to extract C compiler dependent structure
fields offsets and other non trivially preprocessor accessible
informations to the defines in the generated header file.

The usage is to define list of exported header files

  cmetric_include_HEADERS = some_subsystem_offsets.h

  some_subsystem_offsets_CMETRIC_SOURCES = some_subsystem_prepared_symbols.c

The header file can be placed even into relative subdirectory
in the target include directories.

The main purpose of this feature is to provide clean way to
interface assembler files to C language defined objects
and to export defines and values for the library without
complex dependences on the library local/private header files.

darcs-hash:20051127112655-ff715-32d753a9bbbafe80f7f9036690a903f040d7e350.gz

common/Makefile.rules.h8300-boot
common/Makefile.rules.h8300-boot-gnu

index 6e946525857a5ee9fc9f886dec2cfd286b4b9241..56cfc2524548d00393e2e06b85cdd61d1386add3 100644 (file)
@@ -77,13 +77,14 @@ CC = $(CROSS_COMPILE)gcc
 LINK = $(CROSS_COMPILE)ld
 AR = $(CROSS_COMPILE)ar
 OBJCOPY = $(CROSS_COMPILE)objcopy
+NM = $(CROSS_COMPILE)nm
 
 CFLAGS += $(TARGET_ARCH) $(DEBUG) $(OPTIMIZE)
 CFLAGS += -Wall
 CFLAGS += -I$(SOURCES_DIR)
 CFLAGS += -I$(USER_INCLUDE_DIR) -DOMK_FOR_TARGET
 
-LOADLIBES += -L$(USER_LIB_DIR) 
+LOADLIBES += -L$(USER_LIB_DIR)
 LOADLIBES += $(lib_LOADLIBES:%=-l%)
 
 LDFLAGS += -nostartfiles
@@ -99,6 +100,17 @@ OBJS_DIR    := $(USER_OBJS_DIR)
 
 include $(MAKERULES_DIR)/Makefile.rules.h8300-boot-gnu
 
+# 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),\
+               $(cmetrh:%=$(USER_INCLUDE_DIR)/%))))
+
+GEN_HEADERS+=$(cmetric_include_HEADERS:%=$(USER_INCLUDE_DIR)/%)
+
 # Generate rules for compilation of programs and libraries
 $(foreach prog,$(bin_PROGRAMS),$(foreach link,$(link_VARIANTS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR),$(link)))))
 $(foreach lib,$(lib_LIBRARIES),$(eval $(call LIBRARY_template,$(lib))))
@@ -141,7 +153,7 @@ CFLAGS      += -Wall
 CFLAGS += -I$(SOURCES_DIR)
 CFLAGS += -I$(USER_INCLUDE_DIR) -DOMK_FOR_USER
 
-LOADLIBES += -L$(USER_LIB_DIR) 
+LOADLIBES += -L$(USER_LIB_DIR)
 LOADLIBES += $(lib_LOADLIBES:%=-l%)
 
 LIB_CPPFLAGS += $(CPPFLAGS)
@@ -255,7 +267,7 @@ include-pass-local:
           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 $(CP_FLAGS) $(SOURCES_DIR)/$${srcfname} $(USER_INCLUDE_DIR)/$${destfname} ) || exit 1 ; )
-       $(foreach f, $(lib_LDSCRIPTS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_LIB_DIR)/$(notdir $(f)) \
+       @$(foreach f, $(lib_LDSCRIPTS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_LIB_DIR)/$(notdir $(f)) \
           || cp $(CP_FLAGS) $(SOURCES_DIR)/$(f) $(USER_LIB_DIR)/$(notdir $(f)) || exit 1 ; )
 
 
@@ -265,8 +277,8 @@ clean-local: clean-custom
        @rm -f $(USER_OBJS_DIR)/*.o $(USER_OBJS_DIR)/*.lo \
               $(USER_OBJS_DIR)/*.d \
               $(USER_OBJS_DIR)/*.map \
-              $(LOCAL_CONFIG_H:%=$(USER_OBJS_DIR)/%)
-
+              $(LOCAL_CONFIG_H:%=$(USER_OBJS_DIR)/%) \
+              $(cmetric_include_HEADERS:%=$(USER_INCLUDE_DIR)/%)
 
 # Which passes to pass
 default: check-dir include-pass library-pass binary-pass utils-pass
index 7e94de9a3abe348c54c6dc330d6c75a05f645ae7..470092dc7aba14323ac650939aa9f7287821ae84 100644 (file)
@@ -35,7 +35,7 @@ endif
 
 # Syntax: $(call COMPILE_c_o_template,<source>,<target>,<additional c-flags>)
 define COMPILE_c_o_template
-$(2): $(1) $(LOCAL_CONFIG_H)
+$(2): $(1) $(LOCAL_CONFIG_H) $$(GEN_HEADERS)
        @$(QUIET_CMD_ECHO) "  CC      $$@"
        $(Q) if $$(c_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
        then mv -f "$$@.d.tmp" "$$@.d" ; \
@@ -47,7 +47,7 @@ endef
 
 # Syntax: $(call COMPILE_cc_o_template,<source>,<target>,<additional c-flags>)
 define COMPILE_cc_o_template
-$(2): $(1) $(LOCAL_CONFIG_H)
+$(2): $(1) $(LOCAL_CONFIG_H) $$(GEN_HEADERS)
        @$(QUIET_CMD_ECHO) "  CXX     $$@"
        $(Q) if $$(cc_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
        then mv -f "$$@.d.tmp" "$$@.d" ; \
@@ -57,7 +57,7 @@ endef
 
 # Syntax: $(call COMPILE_S_o_template,<source>,<target>,<additional c-flags>)
 define COMPILE_S_o_template
-$(2): $(1) $(LOCAL_CONFIG_H)
+$(2): $(1) $(LOCAL_CONFIG_H) $$(GEN_HEADERS)
        @$(QUIET_CMD_ECHO) "  AS      $$@"
        $(Q) if $$(S_o_COMPILE) -D__ASSEMBLY__ $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
        then if [ -e "$$@.d.tmp" ] ; then mv -f "$$@.d.tmp" "$$@.d" ; fi ; \
@@ -65,6 +65,24 @@ $(2): $(1) $(LOCAL_CONFIG_H)
        fi
 endef
 
+# Syntax: $(call CMETRIC_o_h_template,<object_file>,<target_header>)
+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
+
 # Syntax: $(call PROGRAM_template,<dir>,<executable-name>,<link-variant>)
 define PROGRAM_template
 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o))