proj/scripts/create_proj_symbol_rename.sh

72 строки
2.9 KiB
Bash
Исполняемый файл

#!/bin/bash
# Script to extract exported symbols and rename them
# to avoid clashing with other older libproj
#
# This is done in provision for the integration of PROJ master with GDAL. GDAL is
# a complex library that links with many libraries, a number of them linking with
# PROJ. However in the continuous integration setups used by GDAL, it would be
# impractical to recompile all those libraries that use the system libproj (4.X or 5.X)
# that comes with the distribution. Linking GDAL directly against PROJ master
# and this system libproj with potential different ABI is prone to clash/crash
# (we experimented that painfully in GDAL with its internal libtiff 4.X copy whereas
# systems shipped with libtiff 3.X)
# Hence this solution to rename the symbols of PROJ master so that PROJ master
# can be used by GDAL without conflicting with the system PROJ.
# The renaming only happens if -DPROJ_RENAME_SYMBOLS is passed in CFLAGS and CXXFLAGS.
#
# Note: we potentially should do the same for C++ symbols, but that is not needed
# for now, and we would just set the NS_PROJ existing macro to change the C++ base
# namespace which defaults to osgeo::proj currently.
# To be run from a 'build' subdir after running configure
PROJ_ROOT=$(cd $(dirname ${BASH_SOURCE[0]})/..; pwd)
rm -rf tmp_alias
mkdir tmp_alias
for i in ${PROJ_ROOT}/src/*.c; do
echo $i
(cd tmp_alias; gcc -fvisibility=hidden ${i} -I../src -I${PROJ_ROOT}/src -I${PROJ_ROOT}/include -fPIC -c)
done
for i in ${PROJ_ROOT}/src/*.cpp ${PROJ_ROOT}/src/iso19111/*.cpp; do
echo $i
(cd tmp_alias; g++ -fvisibility=hidden -std=c++11 ${i} -I../src -I${PROJ_ROOT}/src -I${PROJ_ROOT}/include -fPIC -c)
done
(cd tmp_alias; g++ -fvisibility=hidden -std=c++11 *.o -shared -o libproj.so)
OUT_FILE=proj_symbol_rename.h
rm $OUT_FILE 2>/dev/null
echo "/* This is a generated file by create_proj_symbol_rename.sh. *DO NOT EDIT MANUALLY !* */" >> $OUT_FILE
echo "#ifndef PROJ_SYMBOL_RENAME_H" >> $OUT_FILE
echo "#define PROJ_SYMBOL_RENAME_H" >> $OUT_FILE
symbol_list=$(objdump -t tmp_alias/libproj.so | grep " g " | grep .text | awk '{print $6}' | grep -v -e _Z | sort)
for symbol in $symbol_list
do
echo "#define $symbol internal_$symbol" >> $OUT_FILE
done
rodata_symbol_list=$(objdump -t tmp_alias/libproj.so | grep " g O \\.rodata" | awk '{print $6}')
for symbol in $rodata_symbol_list
do
echo "#define $symbol internal_$symbol" >> $OUT_FILE
done
#data_symbol_list=$(objdump -t tmp_alias/libproj.so | grep "\\.data" | grep -v -e __dso_handle -e __TMC_END__ | awk '{print $6}' | grep -v "\\."| grep -v _Z)
#for symbol in $data_symbol_list
#do
# echo "#define $symbol internal_$symbol" >> $OUT_FILE
#done
bss_symbol_list=$(objdump -t tmp_alias/libproj.so | grep "g O \\.bss" | awk '{print $6}' | grep -v "\\."| grep -v _Z)
for symbol in $bss_symbol_list
do
echo "#define $symbol internal_$symbol" >> $OUT_FILE
done
echo "#endif /* PROJ_SYMBOL_RENAME_H */" >> $OUT_FILE