From fad8f99272b1d58addf3ade7566eb576c257d54b Mon Sep 17 00:00:00 2001 From: Krisztian Litkey Date: Mon, 11 Feb 2013 19:14:48 +0200 Subject: [PATCH] build-sys: use our collect-symbols to generate linker scripts. The old ctags-based script has been saved as gen-linker-script.ctags. If at the most inconvenient time SHTF really badly we should be able to quickly revert to the old script. --- Makefile.am | 2 +- build-aux/gen-linker-script.collect-symbols | 24 +++++ build-aux/gen-linker-script.ctags | 133 ++++++++++++++++++++++++++++ src/Makefile.am | 67 ++++++++------ src/murphy-db/mdb/Makefile.am | 2 +- src/murphy-db/mqi/Makefile.am | 2 +- src/murphy-db/mql/Makefile.am | 2 +- 7 files changed, 200 insertions(+), 32 deletions(-) create mode 100755 build-aux/gen-linker-script.collect-symbols create mode 100755 build-aux/gen-linker-script.ctags diff --git a/Makefile.am b/Makefile.am index 771bb4e..a0fe011 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = . src doc +SUBDIRS = . utils src doc doc_DATA = AUTHORS ChangeLog COPYING INSTALL NEWS README # This is the only way with automake I know of to force 'check-git-hooks' diff --git a/build-aux/gen-linker-script.collect-symbols b/build-aux/gen-linker-script.collect-symbols new file mode 100755 index 0000000..8ac31d4 --- /dev/null +++ b/build-aux/gen-linker-script.collect-symbols @@ -0,0 +1,24 @@ +#!/bin/bash + +#LOG=/tmp/gen-linker-script.log +#echo "$0 $*" > $LOG + +COLLECT_SYMBOLS="${0%gen-linker-script}../utils/collect-symbols" + +ARGS="" + +while [ -n "$*" ]; do +# echo "[$ARGS]" 1>&2 + case $1 in + -c) #echo " [$1] [$2]" 1>&2; + ARGS="$ARGS -c '$2'"; shift 2;; + *) #echo " [$1]" 1>&2; + ARGS="$ARGS '$1'" ; shift 1;; + esac +done + +#echo "ARGS: [$ARGS]" 1>&2 +#echo "ARGS: [$ARGS]" >> $LOG +#echo "$COLLECT_SYMBOLS -g $ARGS" >> $LOG + +eval "$COLLECT_SYMBOLS -g $ARGS" diff --git a/build-aux/gen-linker-script.ctags b/build-aux/gen-linker-script.ctags new file mode 100755 index 0000000..ca2272d --- /dev/null +++ b/build-aux/gen-linker-script.ctags @@ -0,0 +1,133 @@ +#!/bin/bash + +############### +# Generate a linker script for GNU ld. +# +# +# + + + +error () { + echo "error: $*" 1>&2 +} + +info () { + echo "$*" 1>&2 +} + +warning () { + echo "warning: $*" 1>&2 +} + +usage () { + info "usage: $0 [-p ] [-I ] -o " + exit ${1:-1} +} + +emit () { + echo "$*" >> $OUTPUT +} + + +# set up defaults +PATTERN="^mrp_|^_mrp_" # export everything prefixed with mrp_ +IGNORE="MRP_PRINTF_LIKE,MRP_NULLTERM" # ignore these symbols/macros +IT="," # ignore-list is comma-separated +SOURCES="" # no default input, must be specified +OUTPUT="" # no default output, must be specified + +# parse command line +while [ -n "${1#-}" ]; do + case $1 in + -o) + if [ -z "$OUTPUT" ]; then + shift + OUTPUT="$1" + else + error "Multiple output files requested." + usage + fi + ;; + -p) + shift; + PATTERN="$1" + ;; + -I) + shift + IGNORE="$IGNORE$IT$1" + IT="," + ;; + -h) + usage 0 + ;; + -q) + QUIET="yes" + ;; + -c) + # This is only for command-line compatibility with collect-symbols + # to minimize the impact of switching back and forth (if needed). + # collect-symbols gets compilation flags passed using the -c + # option which we simply ignore here when using ctags. + shift + ;; + -*) + error "Unknown option '$1'." + usage + ;; + *) + SOURCES="$SOURCES $1" + ;; + esac + shift +done + +# check that we've got everything mandatory +if [ -z "$OUTPUT" ]; then + error "No output file specified (use the -o option)." + usage +fi + +if [ -z "$SOURCES" ]; then + warning "No input files, generating local-only linker script." + emit "{" + emit " local:" + emit " *;" + emit "};" + exit 0 +fi + +if [ -z "$PATTERN" ]; then + PATTERN="^mrp_" +fi + +if [ -n "$IGNORE" ]; then + ignore_opts="-I $IGNORE" +else + ignore_opts="" +fi + +# check that we have ctags +which ctags >& /dev/null +if [ "$?" != "0" ]; then + error "Needs ctags to regenerate linker script $OUTPUT..." + exit 1 +fi + +# generate the output +[ -n "$QUIET" ] || info "Generating linker script $OUTPUT..." +rm -f $OUTPUT +touch $OUTPUT + +emit "{" +emit " global:" +ctags $ignore_opts -f - --c-kinds=px $SOURCES | \ + awk "/$PATTERN/ { print \$1; }" | \ + sort | \ + while read sym; do + emit " $sym;" + done + +emit " local:" +emit " *;" +emit "};" diff --git a/src/Makefile.am b/src/Makefile.am index 5a3488c..e92c96a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -5,7 +5,7 @@ SUBDIRS = murphy-db . \ BUILT_SOURCES = -AM_CFLAGS = $(WARNING_CFLAGS) -I$(top_builddir) -DLIBDIR=\"@LIBDIR@\" +AM_CFLAGS = $(WARNING_CFLAGS) $(INCLUDES) -DLIBDIR=\"@LIBDIR@\" MURPHY_CFLAGS = pkgconfigdir = ${libdir}/pkgconfig @@ -14,12 +14,13 @@ lib_LTLIBRARIES = pkgconfig_DATA = EXTRA_DIST = -QUIET_GEN = $(Q:@=@echo ' GEN '$@;) +QUIET_GEN = $(Q:@=@echo ' GEN '$@;) LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) -INCLUDES = -I$(top_builddir)/src/murphy-db/include -I$(top_builddir) +INCLUDES = -I$(top_builddir) -I$(top_builddir)/src \ + -I$(top_builddir)/src/murphy-db/include BUILT_SOURCES = ################################### @@ -127,7 +128,8 @@ endif # linker script generation linker-script.common: $(libmurphy_common_la_HEADERS) - $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q -o $@ $^ + $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ + -c "$(libmurphy_common_la_CFLAGS)" -o $@ $^ clean-linker-script:: -rm -f linker-script.common @@ -188,7 +190,8 @@ clean-func-infos:: # lua-utils linker script generation linker-script.lua-utils: $(libmurphy_lua_utils_la_HEADERS) - $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q -o $@ $^ + $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ + -c "$(libmurphy_lua_utils_la_CFLAGS)" -o $@ $^ clean-linker-script:: -rm -f linker-script.lua-utils @@ -240,7 +243,8 @@ clean-func-infos:: # lua-decision linker script generation linker-script.lua-decision: $(libmurphy_lua_decision_la_HEADERS) - $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q -o $@ $^ + $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ + -c "$(libmurphy_lua_decision_la_CFLAGS)" -o $@ $^ clean-linker-script:: -rm -f linker-script.lua-decision @@ -320,7 +324,8 @@ libmurphy_core_la_DEPENDENCIES = linker-script.core \ # core linker script generation linker-script.core: $(libmurphy_core_la_HEADERS) \ $(libmurphy_core_lua_bindings_la_HEADERS) - $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q -o $@ $^ + $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ + -c "$(libmurphy_core_la_CFLAGS)" -o $@ $^ clean-linker-script:: -rm -f linker-script.core @@ -388,7 +393,8 @@ endif # linker script generation linker-script.dbus: $(murphy_dbus_headers) - $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q -o $@ $^ + $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ + -c "$(libmurphy_dbus_la_CFLAGS)" -o $@ $^ clean-linker-script:: -rm -f linker-script.dbus @@ -434,7 +440,8 @@ endif # linker script generation linker-script.pulse: $(murphy_pulse_headers) - $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q -o $@ $^ + $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ + -c "$(libmurphy_pulse_la_CFLAGS)" -o $@ $^ clean-linker-script:: -rm -f linker-script.pulse @@ -479,7 +486,8 @@ endif # linker script generation linker-script.ecore: $(murphy_ecore_headers) - $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q -o $@ $^ + $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ + -c "$(libmurphy_ecore_la_CFLAGS)" -o $@ $^ clean-linker-script:: -rm -f linker-script.ecore @@ -524,7 +532,8 @@ endif # linker script generation linker-script.glib: $(murphy_glib_headers) - $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q -o $@ $^ + $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ + -c "$(libmurphy_glib_la_CFLAGS)" -o $@ $^ clean-linker-script:: -rm -f linker-script.glib @@ -575,7 +584,8 @@ endif # linker script generation linker-script.qt: $(murphy_qt_headers) - $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q -o $@ $^ + $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ + -c "$(libmurphy_qt_la_CPPFLAGS) -DQT_ENABLED=1" -o $@ $^ clean-linker-script:: -rm -f linker-script.qt @@ -620,8 +630,7 @@ libmurphy_resolver_la_SOURCES = \ resolver-func-info.c libmurphy_resolver_la_CFLAGS = \ - $(AM_CFLAGS) \ - $(INCLUDES) + $(AM_CFLAGS) libmurphy_resolver_la_LDFLAGS = \ -Wl,-version-script=linker-script.resolver \ @@ -656,7 +665,8 @@ clean-func-infos:: # resolver linker script generation linker-script.resolver: $(libmurphy_resolver_la_HEADERS) - $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q -o $@ $^ + $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ + -c "$(libmurphy_resolver_la_CFLAGS)" -o $@ $^ clean-linker-script:: -rm -f linker-script.resolver @@ -720,10 +730,9 @@ libmurphy_resource_backend_la_SOURCES = \ $(libmurphy_resource_backend_la_REGULAR_SOURCES) \ resource-func-info.c -libmurphy_resource_backend_la_CFLAGS = \ +libmurphy_resource_backend_la_CFLAGS = \ $(AM_CFLAGS) \ - $(LUA_CFLAGS) \ - $(INCLUDES) + $(LUA_CFLAGS) libmurphy_resource_backend_la_LDFLAGS = \ -Wl,-version-script=linker-script.resource_backend \ @@ -750,7 +759,8 @@ endif # resource linker script generation linker-script.resource_backend: $(libmurphy_resource_backend_la_HEADERS) - $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q -o $@ $^ + $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ + -c "$(libmurphy_resource_backend_la_CFLAGS)" -o $@ $^ clean-linker-script:: -rm -f linker-script.resource_backend @@ -791,7 +801,7 @@ libbreedlineinclude_HEADERS = $(libbreedline_la_HEADERS) # linker script generation linker-script.breedline: $(libbreedline_la_HEADERS) $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ - -p '^brl_' -o $@ $^ + -c "$(libbreedline_la_CFLAGS)" -p '^brl_' -o $@ $^ clean-linker-script:: -rm -f linker-script.breedline @@ -826,7 +836,7 @@ libbreedline_murphyinclude_HEADERS = $(libbreedline_murphy_la_HEADERS) # linker script generation linker-script.breedline-murphy: $(libbreedline_murphy_la_HEADERS) $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ - -p '^brl_' -o $@ $^ + -c "$(libbreedline_murphy_la_CFLAGS)" -p '^brl_' -o $@ $^ clean-linker-script:: -rm -f linker-script.breedline-murphy @@ -866,7 +876,7 @@ endif # linker script generation linker-script.breedline-glib: $(breedline_glib_headers) $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ - -p '^brl_' -o $@ $^ + -c "$(libbreedline_glib_la_CFLAGS)" -p '^brl_' -o $@ $^ clean-linker-script:: -rm -f linker-script.breedline-glib @@ -897,8 +907,7 @@ libmurphy_resource_la_SOURCES = \ plugins/resource-native/libmurphy-resource/message.c libmurphy_resource_la_CFLAGS = \ - $(AM_CFLAGS) \ - $(INCLUDES) + $(AM_CFLAGS) libmurphy_resource_la_LDFLAGS = \ -Wl,-version-script=linker-script.resource \ @@ -914,7 +923,8 @@ libmurphy_resource_la_DEPENDENCIES = libmurphy-core.la \ # linker script generation linker-script.resource: $(libmurphy_resource_la_HEADERS) - $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q -o $@ $^ + $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ + -c "$(libmurphy_resource_la_CFLAGS)" -o $@ $^ clean-linker-script:: -rm -f linker-script.resource @@ -1100,8 +1110,8 @@ PLUGIN_RESOURCE_NATIVE_SOURCES = \ $(PLUGIN_RESOURCE_NATIVE_REGULAR_SOURCES) \ plugin-resource-native-func-info.c PLUGIN_RESOURCE_NATIVE_CFLAGS = \ - $(LUA_CFLAGS) \ - $(INCLUDES) + $(LUA_CFLAGS) + PLUGIN_RESOURCE_NATIVE_LIBS = \ libmurphy-core.la \ libmurphy-common.la \ @@ -1221,7 +1231,8 @@ endif # linkedin domain control plugin linker script generation linker-script.domain-control: $(DOMAIN_CONTROL_PLUGIN_LOADER:%.c=%.h) - $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q -o $@ $^ + $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ + -c "$(libmurphy_domain_controller_la_CFLAGS)" -o $@ $^ clean-linker-script:: -rm -f linker-script.domain-control diff --git a/src/murphy-db/mdb/Makefile.am b/src/murphy-db/mdb/Makefile.am index 65ba079..33f251e 100644 --- a/src/murphy-db/mdb/Makefile.am +++ b/src/murphy-db/mdb/Makefile.am @@ -38,7 +38,7 @@ libmdb_la_DEPENDENCIES = $(LINKER_SCRIPT) # linker script generation $(LINKER_SCRIPT): $(libmdb_la_HEADERS) $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ - -p "^(mdb_)|(mqi_)" -o $@ $^ + -c "$(libmdb_la_CFLAGS)" -p "^(mdb_)|(mqi_)" -o $@ $^ clean-$(LINKER_SCRIPT): -rm -f $(LINKER_SCRIPT) diff --git a/src/murphy-db/mqi/Makefile.am b/src/murphy-db/mqi/Makefile.am index 239d2f1..3acad9b 100644 --- a/src/murphy-db/mqi/Makefile.am +++ b/src/murphy-db/mqi/Makefile.am @@ -24,7 +24,7 @@ libmqi_la_DEPENDENCIES = $(LINKER_SCRIPT) # linker script generation $(LINKER_SCRIPT): $(libmqi_la_HEADERS) $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ - -p "^mqi_" -o $@ $^ + -c "$(libmqi_la_CFLAGS)" -p "^mqi_" -o $@ $^ clean-$(LINKER_SCRIPT): -rm -f $(LINKER_SCRIPT) diff --git a/src/murphy-db/mql/Makefile.am b/src/murphy-db/mql/Makefile.am index 56c842f..771dfb1 100644 --- a/src/murphy-db/mql/Makefile.am +++ b/src/murphy-db/mql/Makefile.am @@ -49,7 +49,7 @@ clean-scanner: # linker script generation $(LINKER_SCRIPT): $(libmql_la_HEADERS) $(QUIET_GEN)$(top_builddir)/build-aux/gen-linker-script -q \ - -p "^mql_" -o $@ $^ + -c "$(libmql_la_CFLAGS)" -p "^mql_" -o $@ $^ clean-$(LINKER_SCRIPT): -rm -f $(LINKER_SCRIPT) -- 2.7.4