15f9996aaSopenharmony_ci#!/bin/bash
25f9996aaSopenharmony_ci# Copyright (c) 2013 The Chromium Authors. All rights reserved.
35f9996aaSopenharmony_ci# Use of this source code is governed by a BSD-style license that can be
45f9996aaSopenharmony_ci# found in the LICENSE file.
55f9996aaSopenharmony_ci
65f9996aaSopenharmony_ci# Reads etc/ld.so.conf and/or etc/ld.so.conf.d/*.conf and returns the
75f9996aaSopenharmony_ci# appropriate linker flags.
85f9996aaSopenharmony_ci#
95f9996aaSopenharmony_ci#  sysroot_ld_path.sh /abspath/to/sysroot
105f9996aaSopenharmony_ci#
115f9996aaSopenharmony_ci
125f9996aaSopenharmony_cilog_error_and_exit() {
135f9996aaSopenharmony_ci  echo $0: $@
145f9996aaSopenharmony_ci  exit 1
155f9996aaSopenharmony_ci}
165f9996aaSopenharmony_ci
175f9996aaSopenharmony_ciprocess_entry() {
185f9996aaSopenharmony_ci  if [ -z "$1" ] || [ -z "$2" ]; then
195f9996aaSopenharmony_ci    log_error_and_exit "bad arguments to process_entry()"
205f9996aaSopenharmony_ci  fi
215f9996aaSopenharmony_ci  local root="$1"
225f9996aaSopenharmony_ci  local localpath="$2"
235f9996aaSopenharmony_ci
245f9996aaSopenharmony_ci  echo $localpath | grep -qs '^/'
255f9996aaSopenharmony_ci  if [ $? -ne 0 ]; then
265f9996aaSopenharmony_ci    log_error_and_exit $localpath does not start with /
275f9996aaSopenharmony_ci  fi
285f9996aaSopenharmony_ci  local entry="$root$localpath"
295f9996aaSopenharmony_ci  echo $entry
305f9996aaSopenharmony_ci}
315f9996aaSopenharmony_ci
325f9996aaSopenharmony_ciprocess_ld_so_conf() {
335f9996aaSopenharmony_ci  if [ -z "$1" ] || [ -z "$2" ]; then
345f9996aaSopenharmony_ci    log_error_and_exit "bad arguments to process_ld_so_conf()"
355f9996aaSopenharmony_ci  fi
365f9996aaSopenharmony_ci  local root="$1"
375f9996aaSopenharmony_ci  local ld_so_conf="$2"
385f9996aaSopenharmony_ci
395f9996aaSopenharmony_ci  # ld.so.conf may include relative include paths. pushd is a bashism.
405f9996aaSopenharmony_ci  local saved_pwd=$(pwd)
415f9996aaSopenharmony_ci  cd $(dirname "$ld_so_conf")
425f9996aaSopenharmony_ci
435f9996aaSopenharmony_ci  cat "$ld_so_conf" | \
445f9996aaSopenharmony_ci    while read ENTRY; do
455f9996aaSopenharmony_ci      echo "$ENTRY" | grep -qs ^include
465f9996aaSopenharmony_ci      if [ $? -eq 0 ]; then
475f9996aaSopenharmony_ci        local included_files=$(echo "$ENTRY" | sed 's/^include //')
485f9996aaSopenharmony_ci        echo "$included_files" | grep -qs ^/
495f9996aaSopenharmony_ci        if [ $? -eq 0 ]; then
505f9996aaSopenharmony_ci          if ls $root$included_files >/dev/null 2>&1 ; then
515f9996aaSopenharmony_ci            for inc_file in $root$included_files; do
525f9996aaSopenharmony_ci              process_ld_so_conf "$root" "$inc_file"
535f9996aaSopenharmony_ci            done
545f9996aaSopenharmony_ci          fi
555f9996aaSopenharmony_ci        else
565f9996aaSopenharmony_ci          if ls $(pwd)/$included_files >/dev/null 2>&1 ; then
575f9996aaSopenharmony_ci            for inc_file in $(pwd)/$included_files; do
585f9996aaSopenharmony_ci              process_ld_so_conf "$root" "$inc_file"
595f9996aaSopenharmony_ci            done
605f9996aaSopenharmony_ci          fi
615f9996aaSopenharmony_ci        fi
625f9996aaSopenharmony_ci        continue
635f9996aaSopenharmony_ci      fi
645f9996aaSopenharmony_ci
655f9996aaSopenharmony_ci      echo "$ENTRY" | grep -qs ^/
665f9996aaSopenharmony_ci      if [ $? -eq 0 ]; then
675f9996aaSopenharmony_ci        process_entry "$root" "$ENTRY"
685f9996aaSopenharmony_ci      fi
695f9996aaSopenharmony_ci    done
705f9996aaSopenharmony_ci
715f9996aaSopenharmony_ci  # popd is a bashism
725f9996aaSopenharmony_ci  cd "$saved_pwd"
735f9996aaSopenharmony_ci}
745f9996aaSopenharmony_ci
755f9996aaSopenharmony_ci# Main
765f9996aaSopenharmony_ciif [ $# -ne 1 ]; then
775f9996aaSopenharmony_ci  echo "Usage $0 abspath to sysroot"
785f9996aaSopenharmony_ci  exit 1
795f9996aaSopenharmony_cifi
805f9996aaSopenharmony_ci
815f9996aaSopenharmony_ciecho $1 | grep -qs ' '
825f9996aaSopenharmony_ciif [ $? -eq 0 ]; then
835f9996aaSopenharmony_ci  log_error_and_exit $1 contains whitespace.
845f9996aaSopenharmony_cifi
855f9996aaSopenharmony_ci
865f9996aaSopenharmony_ciLD_SO_CONF="$1/etc/ld.so.conf"
875f9996aaSopenharmony_ciLD_SO_CONF_D="$1/etc/ld.so.conf.d"
885f9996aaSopenharmony_ci
895f9996aaSopenharmony_ciif [ -e "$LD_SO_CONF" ]; then
905f9996aaSopenharmony_ci  process_ld_so_conf "$1" "$LD_SO_CONF" | xargs echo
915f9996aaSopenharmony_cielif [ -e "$LD_SO_CONF_D" ]; then
925f9996aaSopenharmony_ci  find "$LD_SO_CONF_D" -maxdepth 1 -name '*.conf' -print -quit > /dev/null
935f9996aaSopenharmony_ci  if [ $? -eq 0 ]; then
945f9996aaSopenharmony_ci    for entry in $LD_SO_CONF_D/*.conf; do
955f9996aaSopenharmony_ci      process_ld_so_conf "$1" "$entry"
965f9996aaSopenharmony_ci    done | xargs echo
975f9996aaSopenharmony_ci  fi
985f9996aaSopenharmony_cifi
99