build-sys: use our collect-symbols to generate linker scripts.
authorKrisztian Litkey <krisztian.litkey@intel.com>
Mon, 11 Feb 2013 17:14:48 +0000 (19:14 +0200)
committerKrisztian Litkey <krisztian.litkey@intel.com>
Mon, 11 Feb 2013 17:44:12 +0000 (19:44 +0200)
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
build-aux/gen-linker-script.collect-symbols [new file with mode: 0755]
build-aux/gen-linker-script.ctags [new file with mode: 0755]
src/Makefile.am
src/murphy-db/mdb/Makefile.am
src/murphy-db/mqi/Makefile.am
src/murphy-db/mql/Makefile.am

index 771bb4e..a0fe011 100644 (file)
@@ -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 (executable)
index 0000000..8ac31d4
--- /dev/null
@@ -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 (executable)
index 0000000..ca2272d
--- /dev/null
@@ -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 <pattern>] [-I <ignore-list>] -o <output> <inputs>"
+    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 "};"
index 5a3488c..e92c96a 100644 (file)
@@ -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
index 65ba079..33f251e 100644 (file)
@@ -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)
index 239d2f1..3acad9b 100644 (file)
@@ -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)
index 56c842f..771dfb1 100644 (file)
@@ -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)