diff options
Diffstat (limited to 'tools/create-exports-NetworkManager.sh')
| -rwxr-xr-x | tools/create-exports-NetworkManager.sh | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/tools/create-exports-NetworkManager.sh b/tools/create-exports-NetworkManager.sh new file mode 100755 index 00000000..3a4619a4 --- /dev/null +++ b/tools/create-exports-NetworkManager.sh @@ -0,0 +1,117 @@ +#!/bin/bash + +set -e + +die() { + echo "$@" + exit 1 +} + +# generates the linker version script src/NetworkManager.ver +# by looking at the symbols needed by the device and settings +# plugins. Note that this depends on how NetworkManager and +# the plugins are build. For example, compiling without +# --with-more-asserts will yield less symbols. +# +# _build re-builds NetworkManager with relevant compile time +# options to yield the most symbols. +_build() { + git clean -fdx + ./autogen.sh --enable-ld-gc --enable-ifcfg-rh --enable-ifupdown \ + --enable-ifnet --enable-ibft --enable-teamdctl --enable-wifi \ + --with-modem-manager-1 --with-ofono --with-more-asserts \ + --with-more-logging + make -j20 +} + +_sort() { + LANG=C sort -u +} + +call_nm() { + nm "$1" | + sed -n 's/.* \([^ ]\) \([^ ]*\)$/\1 \2/p' +} + +get_symbols_nm () { + call_nm ./src/.libs/libNetworkManager.a | + sed -n 's/^[tTDRB] //p' | + _sort +} + +get_symbols_explict() { + cat <<EOF | _sort +_IO_stdin_used +EOF +} + +get_symbols_missing() { + (for f in ./src/settings/plugins/*/.libs/*.so \ + ./src/devices/*/.libs/*.so \ + ./src/ppp/.libs/libnm-ppp-plugin.so; do + call_nm "$f" | + sed -n 's/^\([U]\) \(\(nm_\|nmp_\|_nm\|NM\|_NM\).*\)$/\2/p' + done) | + _sort | + grep -Fx -f <(get_symbols_explict) -v | + grep -Fx -f <(get_symbols_nm) +} + +pretty() { + sed 's/.*/\t\0;/' +} + +do_build() { + do_update + make +} + +do_rebuild() { + _build + do_build +} + +do_update() { + do_generate > ./src/NetworkManager.ver +} + +do_generate() { + cat <<EOF +# this file is generated by $0 +{ +global: +$(get_symbols_missing | pretty) + +$(get_symbols_explict | pretty) +local: + *; +}; +EOF +} + +test -f ./src/.libs/libNetworkManager.a || die "must be called from NetworkManager \$(top_builddir) after building the tree" + +case "$1" in + rebuild) + do_rebuild + ;; + build) + do_build + ;; + '--called-from-make') + if test -z "${NM_BUILD_NO_CREATE_EXPORTS+x}"; then + do_update + else + if test -f "./src/NetworkManager.ver"; then + touch ./src/NetworkManager.ver + fi + fi + ;; + update) + do_update + ;; + *) + do_generate + ;; +esac + |