This construction doesn't work

Darren Pilgrim freebsd at
Tue Jun 29 06:34:26 UTC 2010

Paul Schmehl wrote:
> I'm working on a port update for one of the ports that I maintain, and I've run 
> into a problem that I can't seem to solve.
> I use this construction to ensure that the port doesn't overwrite the conf 
> file, if one exists:
> .for f in barnyard2.conf
>         ${INSTALL_DATA} ${WRKSRC}/etc/${f} ${PREFIX}/etc/${f}-sample
>         [ -f ${PREFIX}/etc/${f} ] || \
>         ${INSTALL_DATA} ${WRKSRC}/etc/${f} ${PREFIX}/etc/${f}
> .endfor
> But it gets overwritten anyway.  What am I doing wrong?  I thought this worked 
> before, but I can't be sure.  Testing proves that it does not work now.  I 
> tried to changing to an if [ ! -f construction, but that didn't do a thing.

Instead of doing this in Makefile, do it in pkg-plist:

@unexec if cmp -s %D/etc/barnyard2.conf.sample %D/etc/barnyard2.conf; 
then rm -f %D/etc/barnyard2.conf; fi
@exec if [ ! -f %D/etc/barnyard2.conf ] ; then cp -p %D/%F 
%D/etc/barnyard2.conf && chmod 600 %D/etc/barnyard2.conf; fi

Relevant section of the Porter's Handbook:

More information about the freebsd-ports mailing list