our
@EXPORT_OK
=
qw(
blank_library_paths
setup_library_paths
get_library_paths
add_library_dir
find_library
)
;
use
Dpkg::Arch
qw(get_build_arch get_host_arch :mappers)
;
qw(/lib /usr/lib)
;
qw(/lib32 /usr/lib32 /lib64 /usr/lib64)
;
my
@custom_librarypaths
;
my
@system_librarypaths
;
my
$librarypaths_init
;
sub
parse_ldso_conf {
my
$file
=
shift
;
state
%visited
;
local
$_
;
open
my
$fh
,
'<'
,
$file
or syserr(g_(
'cannot open %s'
),
$file
);
$visited
{
$file
}++;
while
(<
$fh
>) {
next
if
/^\s*$/;
chomp
;
s{/+$}{};
if
(/^include\s+(\S.*\S)\s*$/) {
foreach
my
$include
(
glob
($1)) {
parse_ldso_conf(
$include
)
if
-e
$include
&& !
$visited
{
$include
};
}
}
elsif
(m{^\s*/}) {
s/^\s+//;
my
$libdir
=
$_
;
if
(none {
$_
eq
$libdir
} (
@custom_librarypaths
,
@system_librarypaths
)) {
push
@system_librarypaths
,
$libdir
;
}
}
}
close
$fh
;
}
sub
blank_library_paths {
@custom_librarypaths
= ();
@system_librarypaths
= ();
$librarypaths_init
= 1;
}
sub
setup_library_paths {
@custom_librarypaths
= ();
@system_librarypaths
= ();
if
(
$ENV
{LD_LIBRARY_PATH}) {
my
$cwd
= Cwd::getcwd;
foreach
my
$path
(
split
/:/,
$ENV
{LD_LIBRARY_PATH}) {
$path
=~ s{/+$}{};
my
$realpath
= Cwd::realpath(
$path
);
next
unless
defined
$realpath
;
if
(
$realpath
=~ m/^\Q
$cwd
\E/) {
if
(get_build_api() >= 1) {
error(g_(
'use -l option instead of LD_LIBRARY_PATH'
));
}
else
{
warning(g_(
'deprecated use of LD_LIBRARY_PATH with private '
.
'library directory which interferes with '
.
'cross-building, please use -l option instead'
));
}
}
next
if
get_build_api() >= 1;
push
@system_librarypaths
,
$path
;
}
}
my
$multiarch
;
if
(
$ENV
{DEB_TARGET_GNU_TYPE} and
(
$ENV
{DEB_TARGET_GNU_TYPE} ne
$ENV
{DEB_BUILD_GNU_TYPE}))
{
$multiarch
= gnutriplet_to_multiarch(
$ENV
{DEB_TARGET_GNU_TYPE});
}
if
(get_build_arch() ne get_host_arch()) {
$multiarch
= debarch_to_multiarch(get_host_arch());
}
if
(
$multiarch
) {
push
@system_librarypaths
,
"/lib/$multiarch"
,
"/usr/lib/$multiarch"
;
}
push
@system_librarypaths
, DEFAULT_LIBRARY_PATH;
parse_ldso_conf(
'/etc/ld.so.conf'
)
if
-e
'/etc/ld.so.conf'
;
push
@system_librarypaths
, DEFAULT_MULTILIB_PATH;
$librarypaths_init
= 1;
}
sub
add_library_dir {
my
$dir
=
shift
;
setup_library_paths()
if
not
$librarypaths_init
;
push
@custom_librarypaths
,
$dir
;
}
sub
get_library_paths {
setup_library_paths()
if
not
$librarypaths_init
;
return
(
@custom_librarypaths
,
@system_librarypaths
);
}
sub
find_library {
my
(
$lib
,
$rpath
,
$format
,
$root
) =
@_
;
setup_library_paths()
if
not
$librarypaths_init
;
my
@librarypaths
= (@{
$rpath
},
@custom_librarypaths
,
@system_librarypaths
);
my
@libs
;
$root
//=
''
;
$root
=~ s{/+$}{};
foreach
my
$dir
(
@librarypaths
) {
my
$checkdir
=
"$root$dir"
;
if
(-e
"$checkdir/$lib"
) {
my
$libformat
= Dpkg::Shlibs::Objdump::get_format(
"$checkdir/$lib"
);
if
(not
defined
$libformat
) {
warning(g_(
"unknown executable format in file '%s'"
),
"$checkdir/$lib"
);
}
elsif
(
$format
eq
$libformat
) {
push
@libs
, canonpath(
"$checkdir/$lib"
);
}
else
{
debug(1,
"Skipping lib $checkdir/$lib, libabi=<%s> != objabi=<%s>"
,
$libformat
,
$format
);
}
}
}
return
@libs
;
}
1;