@@ -48,6 +48,8 @@ declare -r startdir="$(pwd -P)"
48
48
49
49
LIBRARY=${LIBRARY:- ' @libmakepkgdir@' }
50
50
51
+ packaging_options+=(' autolibprovides' )
52
+ packaging_options+=(' autolibdepends' )
51
53
build_options=(' ccache' ' distcc' ' buildflags' ' makeflags' )
52
54
splitpkg_overrides=(' pkgdesc' ' arch' ' url' ' license' ' groups' ' depends'
53
55
' optdepends' ' provides' ' conflicts' ' replaces' ' backup'
@@ -499,6 +501,42 @@ run_package() {
499
501
run_function_safe " package${1: +_$1 } "
500
502
}
501
503
504
+ auto_libdepends () {
505
+ local l f solib search_paths bin_paths autolibdepends
506
+
507
+ msg2 " $( gettext " Auto-adding libdepends..." ) "
508
+
509
+ # Only search default library/binary paths
510
+ search_paths=($( ${CC:- gcc} -print-search-dirs | grep ' ^lib' | sed " s|^libraries: =|:|;s|:| ${pkgdir} |g" ) )
511
+ bin_paths=(${pkgdir}${PATH//:/ ${pkgdir} } )
512
+
513
+ for f in $( find ${search_paths[@]} ${bin_paths[@]} -maxdepth 1 -type f 2> /dev/null) ; do
514
+ # Skip files with relative path to avoid wasting time on dups
515
+ if [[ ! " $f " =~ \.\. / ]]; then
516
+ while read solib; do
517
+ if ! in_array " ${solib} " ${autolibdepends[@]} ; then
518
+ autolibdepends+=(${solib} )
519
+ fi
520
+ done < <( LC_ALL=C readelf -d " $f " 2> /dev/null | grep ' (NEEDED)' | while read l; do
521
+ l=" ${l#* \[ } "
522
+ echo " ${l% .so* } .so"
523
+ done)
524
+ fi
525
+ done
526
+
527
+ # Pass depends if there is any
528
+ # We don't do this unconditionally to avoid passing an empty line to mapfile
529
+ if [[ ${depends[@]} ]]; then
530
+ printf ' %s\n' " ${depends[@]} "
531
+ fi
532
+
533
+ # Print and pass autolibdepends if any was found
534
+ if [[ ${autolibdepends[@]} ]]; then
535
+ msg2 " $( gettext " Auto-added libdepends %s" ) " " ${autolibdepends[@]} "
536
+ printf ' %s\n' " ${autolibdepends[@]} "
537
+ fi
538
+ }
539
+
502
540
find_libdepends () {
503
541
local d sodepends
504
542
@@ -563,6 +601,34 @@ find_libdepends() {
563
601
(( ${# libdepends[@]} )) && printf ' %s\n' " ${libdepends[@]} "
564
602
}
565
603
604
+ auto_libprovides () {
605
+ local f solib search_paths autolibprovides
606
+
607
+ msg2 " $( gettext " Auto-adding libprovides..." ) "
608
+
609
+ # Only search default library paths
610
+ search_paths=($( ${CC:- gcc} -print-search-dirs | grep ' ^lib' | sed " s|^libraries: =|:|;s|:| ${pkgdir} |g" ) )
611
+
612
+ for f in $( find ${search_paths[@]} -maxdepth 1 -type f 2> /dev/null) ; do
613
+ # Match solibs, but exclude ones with a relative path to avoid dups
614
+ if [[ " $f " =~ \. so ]] && [[ ! " $f " =~ \.\. / ]]; then
615
+ solib=" ${f##*/ } "
616
+ autolibprovides+=(" ${solib% .so* } .so" )
617
+ fi
618
+ done
619
+
620
+ # Pass provides if there is any
621
+ # We don't do this unconditionally to avoid passing an empty line to mapfile
622
+ if [[ ${provides[@]} ]]; then
623
+ printf ' %s\n' " ${provides[@]} "
624
+ fi
625
+
626
+ # Print and pass autolibprovides if any was found
627
+ if [[ ${autolibprovides[@]} ]]; then
628
+ msg2 " $( gettext " Auto-added libprovides %s" ) " " ${autolibprovides[@]} "
629
+ printf ' %s\n' " ${autolibprovides[@]} "
630
+ fi
631
+ }
566
632
567
633
find_libprovides () {
568
634
local p libprovides missing
@@ -655,7 +721,14 @@ write_pkginfo() {
655
721
write_kv_pair " size" " $size "
656
722
write_kv_pair " arch" " $pkgarch "
657
723
724
+ if check_option " autolibprovides" " y" ; then
725
+ mapfile -t provides < <( auto_libprovides)
726
+ fi
658
727
mapfile -t provides < <( find_libprovides)
728
+
729
+ if check_option " autolibdepends" " y" ; then
730
+ mapfile -t depends < <( auto_libdepends)
731
+ fi
659
732
mapfile -t depends < <( find_libdepends)
660
733
661
734
write_kv_pair " license" " ${license[@]} "
0 commit comments