#!/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 ${PROJ_ROOT}/src/iso19111/operation/*.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
