blob: df48bd29b6694c90f9d984e7aa2a4c0977389f0c [file] [log] [blame]
#!/bin/sh
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# slo.h -- (S)eparate (L)inker (O)ptions by library class
# Initially written by Ralf S. Engelschall <rse apache.org>
DIFS='
'
#
# parse out -L and -l options from command line
#
DIRS=''
LIBS=''
ARGV=''
optprev=""
OIFS="$IFS" IFS="$DIFS"
for opt
do
# concatenate with previous option if exists
if [ "x$optprev" != "x" ]; then
opt="${optprev}${opt}";
optprev=''
fi
# remember options for arg when used stand-alone
if [ "x$opt" = "x-L" -o "x$opt" = "x-l" ]; then
optprev="$opt"
continue;
fi
# split argument into option plus option argument
arg="`echo $opt | cut -c3-`"
opt="`echo $opt | cut -c1-2`"
# store into containers
case $opt in
-L) DIRS="$DIRS:$arg" ;;
-l) LIBS="$LIBS:$arg" ;;
*) ARGV="$ARGV $opt" ;;
esac
done
IFS="$OIFS"
#
# set linker default directories
#
DIRS_DEFAULT='/lib:/usr/lib'
if [ "x$LD_LIBRARY_PATH" != "x" ]; then
DIRS_DEFAULT="$DIRS_DEFAULT:$LD_LIBRARY_PATH"
fi
#
# sort options by class
#
DIRS_OBJ=''
LIBS_OBJ=''
DIRS_PIC=''
LIBS_PIC=''
DIRS_DSO=''
LIBS_DSO=''
# for each library...
OIFS="$IFS" IFS=':'
for lib in $LIBS; do
[ "x$lib" = "x" ] && continue
found='no'
found_indefdir='no'
found_type=''
found_dir=''
# for each directory...
OIFS2="$IFS" IFS=":$DIFS"
for dir in ${DIRS} switch-to-defdirs ${DIRS_DEFAULT}; do
[ "x$dir" = "x" ] && continue
[ "x$dir" = "xswitch-to-defdirs" ] && found_indefdir=yes
[ ! -d $dir ] && continue
# search the file
OIFS3="$IFS" IFS="$DIFS"
for file in '' `cd $dir && ls lib${lib}.* 2>/dev/null`; do
[ "x$file" = "x" ] && continue
case $file in
*.so|*.so.[0-9]*|*.sl|*.sl.[0-9]* )
found=yes;
found_type=DSO;
break
;;
*.lo|*.la )
found=yes;
found_type=PIC
;;
*.a )
if [ "x$found_type" = "x" ]; then
found=yes
found_type=OBJ
fi
;;
esac
done
IFS="$OIFS3"
if [ "x$found" = "xyes" ]; then
found_dir="$dir"
break
fi
done
IFS="$OIFS2"
if [ "x$found" = "xyes" ]; then
if [ "x$found_indefdir" != "xyes" ]; then
eval "dirlist=\"\${DIRS_${found_type}}:\""
if [ ".`echo \"$dirlist\" | fgrep :$found_dir:`" = . ]; then
eval "DIRS_${found_type}=\"\$DIRS_${found_type}:${found_dir}\""
fi
eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\""
else
eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\""
fi
else
LIBS_OBJ="$LIBS_OBJ:$lib"
#dirlist="`echo $DIRS $DIRS_DEFAULT | sed -e 's/:/ /g'`"
#echo "splitlibs:Warning: library \"$lib\" not found in any of the following dirs:" 2>&1
#echo "splitlibs:Warning: $dirlist" 1>&1
fi
done
IFS="$OIFS"
#
# also pass-through unused dirs even if it's useless
#
OIFS="$IFS" IFS=':'
for dir in $DIRS; do
dirlist="${DIRS_OBJ}:${DIRS_PIC}:${DIRS_DSO}:"
if [ ".`echo \"$dirlist\" | fgrep :$dir:`" = . ]; then
DIRS_OBJ="$DIRS_OBJ:$dir"
fi
done
IFS="$OIFS"
#
# reassemble the options but seperated by type
#
OIFS="$IFS" IFS="$DIFS"
for type in OBJ PIC DSO; do
OIFS2="$IFS" IFS=':'
eval "libs=\"\$LIBS_${type}\""
opts=''
for lib in $libs; do
[ "x$lib" = "x" ] && continue
opts="$opts -l$lib"
done
eval "LIBS_${type}=\"$opts\""
eval "dirs=\"\$DIRS_${type}\""
opts=''
for dir in $dirs; do
[ "x$dir" = "x" ] && continue
opts="$opts -L$dir"
done
eval "DIRS_${type}=\"$opts\""
IFS="$OIFS2"
done
IFS="$OIFS"
#
# give back results
#
OIFS="$IFS" IFS="$DIFS"
for var in ARGV DIRS_OBJ LIBS_OBJ DIRS_PIC LIBS_PIC DIRS_DSO LIBS_DSO; do
eval "val=\"\$${var}\""
val="`echo $val | sed -e 's/^ *//'`"
echo "SLO_${var}=\"${val}\""
done
IFS="$OIFS"
##EOF##