#!/bin/sh
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Reads etc/ld.so.conf and/or etc/ld.so.conf.d/*.conf and returns the
# appropriate linker flags.
#
#  sysroot_ld_path.sh /abspath/to/sysroot
#

log_error_and_exit() {
  echo $0: $@
  exit 1
}

process_entry() {
  if [ -z "$1" ] || [ -z "$2" ]; then
    log_error_and_exit "bad arguments to process_entry()"
  fi
  local root="$1"
  local localpath="$2"

  echo $localpath | grep -qs '^/'
  if [ $? -ne 0 ]; then
    log_error_and_exit $localpath does not start with /
  fi
  local entry="$root$localpath"
  echo $entry
}

process_ld_so_conf() {
  if [ -z "$1" ] || [ -z "$2" ]; then
    log_error_and_exit "bad arguments to process_ld_so_conf()"
  fi
  local root="$1"
  local ld_so_conf="$2"

  # ld.so.conf may include relative include paths. pushd is a bashism.
  local saved_pwd=$(pwd)
  cd $(dirname "$ld_so_conf")

  cat "$ld_so_conf" | \
    while read ENTRY; do
      echo "$ENTRY" | grep -qs ^include
      if [ $? -eq 0 ]; then
        local included_files=$(echo "$ENTRY" | sed 's/^include //')
        echo "$included_files" | grep -qs ^/
        if [ $? -eq 0 ]; then
          if ls $root$included_files >/dev/null 2>&1 ; then
            for inc_file in $root$included_files; do
              process_ld_so_conf "$root" "$inc_file"
            done
          fi
        else
          if ls $(pwd)/$included_files >/dev/null 2>&1 ; then
            for inc_file in $(pwd)/$included_files; do
              process_ld_so_conf "$root" "$inc_file"
            done
          fi
        fi
        continue
      fi

      echo "$ENTRY" | grep -qs ^/
      if [ $? -eq 0 ]; then
        process_entry "$root" "$ENTRY"
      fi
    done

  # popd is a bashism
  cd "$saved_pwd"
}

# Main

if [ $# -ne 1 ]; then
  echo Usage $0 /abspath/to/sysroot
  exit 1
fi

echo $1 | grep -qs ' '
if [ $? -eq 0 ]; then
  log_error_and_exit $1 contains whitespace.
fi

LD_SO_CONF="$1/etc/ld.so.conf"
LD_SO_CONF_D="$1/etc/ld.so.conf.d"

if [ -e "$LD_SO_CONF" ]; then
  process_ld_so_conf "$1" "$LD_SO_CONF" | xargs echo
elif [ -e "$LD_SO_CONF_D" ]; then
  find "$LD_SO_CONF_D" -maxdepth 1 -name '*.conf' -print -quit > /dev/null
  if [ $? -eq 0 ]; then
    for entry in $LD_SO_CONF_D/*.conf; do
      process_ld_so_conf "$1" "$entry"
    done | xargs echo
  fi
fi
