Missing pkgconfig dependencies

Michael Schwendt bugs.michael at gmx.net
Wed Mar 30 15:00:13 UTC 2005


On Wed, 30 Mar 2005 09:23:54 -0500, Matthias Clasen wrote:

> On Wed, 2005-03-30 at 16:01 +0200, Miloslav Trmac wrote:
> > On Wed, Mar 30, 2005 at 08:43:38AM -0500, Matthias Clasen wrote:
> > > .pc files contain dependencies, e.g. the gdk-pixbuf-2.0.pc file has the
> > > line
> > > 
> > > Requires: gobject-2.0,gmodule-no-export-2.0
> > > 
> > > which means you'll get errors from pgk-config if you try to use the gdk-
> > > pixbuf-2.0.pc file without having glib-devel installed (which contains
> > > the gobject-2.0.pc and gmodule-no-export-2.0.pc files). Since rpm does
> > > not pick up these dependencies on its own,
> > Wouldn't It Be Cool(tm) if rpm did pick these dependencies automatically?
> > 
> > for i in $RPM_BUILD_DIR{%{_libdir},%{_datadir}}/pkgconfig/*.pc; do
> > 	set -- $(sed -n 's/^Requires: //p' < "$i")
> > 	for dep; do
> > 		f=%{_libdir}/pkgconfig/$dep.pc
> > 		[ -f "$f" ] && { rpm -qf "$f"; continue; }
> > 		f=%{_datadir}/pkgconfig/$dep.pc
> > 		[ -f "$f" ] && { rpm -qf "$f"; continue; }
> > 		echo "pkg-config file $dep.pc not found" >&2
> > 	done
> > done
> > 
> 
> Nice idea, but you'll run into difficulties with things like:
> 
> Requires: gdk-${target}-2.0 atk

Also with comma-separated lists and versioned ones like:

  Requires: atk >= 2.0, glib-2.0

The Perl fragment I use to parse pkgconfig files has not been changed
for a long time:

        open (PCFILE, "< $pc") or die "Unable to open: $pc\n";
        while ( <PCFILE> ) {
            chomp;
            # Crude hack to collect and substitute macros.
            if ( /([a-z_]+)=(.*)/ ) {
                $macros{$1} = $2;
            }
            while ( /(\${([a-z_]+)})/ ) {
                $a = $1;
                $b = $2;
                $a =~ s/\$/\\\$/g;
                s/$a/$macros{$b}/g;
            }
            /^Requires/ or next;
            s/^Requires:\s*//;
            s/,/ /g;  # pkgconfig permits space/comma separate lists
            s/>*=\s+\d+(\.\d+)*//g;  # get rid of versions like "foo >= 1.0"
            (my @req) = split;
            push @requires, @req;
        }




More information about the Fedora-maintainers mailing list