Home | History | Annotate | Download | only in linux
      1 #!/bin/sh
      2 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 # Reads etc/ld.so.conf and/or etc/ld.so.conf.d/*.conf and returns the
      7 # appropriate linker flags.
      8 #
      9 #  sysroot_ld_path.sh /abspath/to/sysroot
     10 #
     11 
     12 log_error_and_exit() {
     13   echo $0: $@
     14   exit 1
     15 }
     16 
     17 process_entry() {
     18   if [ -z "$1" ] || [ -z "$2" ]; then
     19     log_error_and_exit "bad arguments to process_entry()"
     20   fi
     21   local root="$1"
     22   local localpath="$2"
     23 
     24   echo $localpath | grep -qs '^/'
     25   if [ $? -ne 0 ]; then
     26     log_error_and_exit $localpath does not start with /
     27   fi
     28   local entry="$root$localpath"
     29   echo -L$entry
     30   echo -Wl,-rpath-link=$entry
     31 }
     32 
     33 process_ld_so_conf() {
     34   if [ -z "$1" ] || [ -z "$2" ]; then
     35     log_error_and_exit "bad arguments to process_ld_so_conf()"
     36   fi
     37   local root="$1"
     38   local ld_so_conf="$2"
     39 
     40   # ld.so.conf may include relative include paths. pushd is a bashism.
     41   local saved_pwd=$(pwd)
     42   cd $(dirname "$ld_so_conf")
     43 
     44   cat "$ld_so_conf" | \
     45     while read ENTRY; do
     46       echo "$ENTRY" | grep -qs ^include
     47       if [ $? -eq 0 ]; then
     48         local included_files=$(echo "$ENTRY" | sed 's/^include //')
     49         echo "$included_files" | grep -qs ^/
     50         if [ $? -eq 0 ]; then
     51           if ls $root$included_files >/dev/null 2>&1 ; then
     52             for inc_file in $root$included_files; do
     53               process_ld_so_conf "$root" "$inc_file"
     54             done
     55           fi
     56         else
     57           if ls $(pwd)/$included_files >/dev/null 2>&1 ; then
     58             for inc_file in $(pwd)/$included_files; do
     59               process_ld_so_conf "$root" "$inc_file"
     60             done
     61           fi
     62         fi
     63         continue
     64       fi
     65 
     66       echo "$ENTRY" | grep -qs ^/
     67       if [ $? -eq 0 ]; then
     68         process_entry "$root" "$ENTRY"
     69       fi
     70     done
     71 
     72   # popd is a bashism
     73   cd "$saved_pwd"
     74 }
     75 
     76 # Main
     77 
     78 if [ $# -ne 1 ]; then
     79   echo Usage $0 /abspath/to/sysroot
     80   exit 1
     81 fi
     82 
     83 echo $1 | grep -qs ' '
     84 if [ $? -eq 0 ]; then
     85   log_error_and_exit $1 contains whitespace.
     86 fi
     87 
     88 LD_SO_CONF="$1/etc/ld.so.conf"
     89 LD_SO_CONF_D="$1/etc/ld.so.conf.d"
     90 
     91 if [ -e "$LD_SO_CONF" ]; then
     92   process_ld_so_conf "$1" "$LD_SO_CONF" | xargs echo
     93 elif [ -e "$LD_SO_CONF_D" ]; then
     94   find "$LD_SO_CONF_D" -maxdepth 1 -name '*.conf' -print -quit > /dev/null
     95   if [ $? -eq 0 ]; then
     96     for entry in $LD_SO_CONF_D/*.conf; do
     97       process_ld_so_conf "$1" "$entry"
     98     done | xargs echo
     99   fi
    100 fi
    101