ports/89164: [PATCH] /var/db/pkg/{portname}/+CONTENTS files sometimes contain wrong data
Michael C. Shultz
ringworm01 at gmail.com
Thu Nov 17 20:06:38 UTC 2005
On Thursday 17 November 2005 11:33, Vasil Dimov wrote:
> On Thu, Nov 17, 2005 at 05:46:25PM +0100, Pav Lucistnik wrote:
> > Yes, there is a long standing problem and we're aware of it. Sadly, no
> > workable solution was submitted so far (at least I haven't found any PR
> > filed against it).
>
> Hmmz, what about the following:
>
> --- bsd.port.mk_dep.diff begins here ---
> --- bsd.port.mk.orig Thu Nov 17 21:04:11 2005
> +++ bsd.port.mk.dep Thu Nov 17 21:18:21 2005
> @@ -4638,7 +4638,7 @@
> dir=$$(${REALPATH} $$dir); \
> if [ -d $$dir ]; then \
> if (${ECHO_CMD} $$checked | ${GREP} -qwv "$$dir"); then \
> - childout=$$(cd $$dir; ${MAKE} CHILD_DEPENDS=yes
> PARENT_CHECKED="$$checked" package-depends-list); \ + childout=$$(cd
^^^^^^^^^^^^^^^^^^^^^^^^
I don't even pretend to understand scripting, but this line looks like a
problem, if you are using "package-depends-list" as a data source it
will fail the test I proposed in this PR's How To Repeat section because
results can be modified with WITH_* values placed into the environment.
To get the +CONTENTS file right need to gather the data like this:
port being registered = cd /usr/ports/cat/port;make -V PKGNAME
get first level dependencies then from
cd /usr/ports/cat/port;make -V RUN_DEPENDS -V LIB_DEPENDS -V DEPENDS
then each dependency returned go to it's /var/db/pkg/+CONTENTS file and
gather each dependency recorded when it was installed (this works recursively)
looking from bottom up at how to gather the information:
depPortLevel4 -=> no dpenedencies recodfed at install time
depPortLevel3 -=> make -V RUN_DEPENDS -V LIB_DEPENDS -V DEPENDS
returns depPortLevel4 so depPortLevel4 goes to +CONTENTS file
+CONTENTS=depPortLevel4
depPortLevel2 -=> make -V RUN_DEPENDS -V LIB_DEPENDS -V DEPENDS
returns depPortLevel3 so depPortLevel3 goes to +CONTENTS file
a look at depPortLevel3's +CONTENTS file reveils depPortLevel4 so
+CONTENTS=depPortLevel3
+CONTENTS=depPortLevel4
depPortLevel1 -=> make -V RUN_DEPENDS -V LIB_DEPENDS -V DEPENDS
returns depPortLevel2 and a look at
depPortLevel2's +CONTENTS file returns depPortLevel3
and depPortLevel4 so
+CONTENTS=depPortLevel2
+CONTENTS=depPortLevel3
+CONTENTS=depPortLevel4
-Mike
> $$dir ; pkgnm=`${MAKE} -V PKGNAME` ; if [ -d ${PKG_DBDIR}/$$pkgnm ] ; then
> for p in $$pkgnm `${PKG_INFO} -qr ${PKG_DBDIR}/$$pkgnm |${CUT} -f 2 -d ' '`
> ; do porigin=`pkg_info -qo /var/db/pkg/$$p` ; ${ECHO_CMD} "$$p
> ${PORTSDIR}/$$porigin $$porigin" ; done ; else ${MAKE} CHILD_DEPENDS=yes
> PARENT_CHECKED="$$checked" package-depends-list; fi); \ set -- $$childout;
> \
> childdir=""; \
> while [ $$\# != 0 ]; do \
> @@ -4651,7 +4651,7 @@
> else \
> ${ECHO_MSG} "${PKGNAME}: \"$$dir\" non-existent -- dependency list
> incomplete" >&2; \ fi; \
> - done
> + done | ${SORT} -u
>
> # Print out package names.
>
> --- bsd.port.mk_dep.diff ends here ---
>
> The idea is to check if the port is installed and get necessary
> info with `pkg_info -r', instead of `make package-depends-list'
>
> Looks quite ugly, some part of the sh code can be extracted
> into separate make variable or at least that 380+ bytes line can be
> broken down into shorter lines.
More information about the freebsd-ports-bugs
mailing list