On file installation

Chris Rees crees at FreeBSD.org
Thu May 17 20:29:53 UTC 2012


On 17 May 2012 20:58, Fernando Apesteguía <fernando.apesteguia at gmail.com> wrote:
> On Tue, May 15, 2012 at 9:11 PM, Fernando Apesteguía
> <fernando.apesteguia at gmail.com> wrote:
>> On Tue, May 15, 2012 at 7:29 PM, Chris Rees <crees at freebsd.org> wrote:
>>> On 15 May 2012 18:14, Fernando Apesteguía <fernando.apesteguia at gmail.com> wrote:
>>>> On Mon, May 14, 2012 at 7:40 PM, Fernando Apesteguía
>>>> <fernando.apesteguia at gmail.com> wrote:
>>>>> On Mon, May 14, 2012 at 7:31 PM, Chris Rees <crees at freebsd.org> wrote:
>>>>>> On 14 May 2012 18:23, Fernando Apesteguía <fernando.apesteguia at gmail.com> wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> I'm working on a port for an application written in Java and I'm
>>>>>>> having some problems deciding how to install the application.
>>>>>>> Previous to the installation, the WRKSRC directory contains some .jar
>>>>>>> files and some directories along with some .txt files for
>>>>>>> licenses, but also some .exe and .bat files _which I don't want to
>>>>>>> install_. It is basically a package that contains both files for
>>>>>>> windows and non-windows systems.
>>>>>>>
>>>>>>> I was thinking on using COPYTREE_SHARE to install everything and then
>>>>>>> remove the non necessary files, but doesn't look like
>>>>>>> an elegant solution. Also, I wouldn't like to explicitly specify every
>>>>>>> one of the files I want to copy. Is there a way of using something
>>>>>>> similar to bash's extglob so I can copy !(*.exe|*bat)? If not, how to proceed?
>>>>>>>
>>>>>>> I already looked at the existent ports to find something similar but
>>>>>>> it seems hard to find. I also had a look at bsd.port.mk but
>>>>>>> I couldn't find what I'm looking for.
>>>>>>
>>>>>> You can use find primaries with COPYTREE_SHARE such as;
>>>>>>
>>>>>> (cd ${WRKSRC}/wherever && ${COPYTREE_SHARE} \*
>>>>>> ${JAVALIBDIR}/${PORTNAME}/wherever "-not -name \*.exe -and -not -name
>>>>>> \*.bat"
>>>>>
>>>>> Thanks! I think that is what I was looking for :)
>>>>
>>>> Sorry guys, but I think I need more help :). I tried with the following line:
>>>>
>>>> ( cd ${WRKSRC}/JDownloader && ${COPYTREE_SHARE} \*
>>>> ${PREFIX}/${PORTNAME}/ "! -name \*.exe" )
>>>>
>>>> but it doesn't seem to follow primaries and it still installs the .exe
>>>> files. I just tried with:
>>>>
>>>> ( cd ${WRKSRC}/JDownloader && ${COPYTREE_SHARE} \*
>>>> ${PREFIX}/${PORTNAME}/ "! -name JDownloader.exe" )
>>>>
>>>> and check that effectively the file is not installed so I suppose this
>>>> has something to do with quoting and escaping special characters (the
>>>> asterisk). I found the following line in audio/xmp/Makefile:
>>>>
>>>> ( cd ${WRKSRC}/docs && ${COPYTREE_SHARE} \* \
>>>>                ${DOCSDIR} '! ( -name Makefile -or -name xmp.1 \
>>>>                -or -name *.bak -or -name *.orig )' )
>>>>
>>>> that seems pretty close to what I'm trying to do, so I tried with this:
>>>>
>>>> ( cd ${WRKSRC}/JDownloader && ${COPYTREE_SHARE} \*
>>>> ${PREFIX}/${PORTNAME}/ '! ( -name *.exe )' )
>>>>
>>>> but then, the asterisk is expanded and find fails:
>>>>
>>>> find: JDownloader.exe: unknown primary or operator
>>>>
>>>> what am I doing wrong?
>>>
>>> Escape the *;
>>>
>>> (cd ${WRKSRC}/JDownloader && ${COPYTREE_SHARE} \* ${PREFIX}/${PORTNAME}/
>>>  '! ( -name \*.exe )' )
>>
>> That executes the following:
>>
>> (cd /usr/home/fernape/porting/jdownloader/port/work/JDownloader &&
>> /bin/sh -c '(/usr/bin/find -d $0 $2 | /usr/bin/cpio -dumpl $1
>>>/dev/null  2>&1) &&  /usr/sbin/chown -R root:wheel $1 &&
>> /usr/bin/find -d $0 $2 -type d -exec chmod 755 $1/{} \; &&
>> /usr/bin/find -d $0 $2 -type f -exec chmod 444 $1/{} \;' -- \*
>> /usr/local/jdownloader/ '! ( -name \*.exe )' )
>>
>> which results in:
>>
>> $ ls /usr/local/jdownloader
>>
>> JDUpdate.exe           JDownloaderBETA.exe    jd/
>> license.txt            outdated.dat           tools/
>> windows_restore.bat
>> JDownloader.exe        JDownloaderD3D.exe     jdupdate.jar
>> license_german.txt     plugins/               version.txt
>> JDownloader.jar        java/                  libs/
>> licenses/              tmp/                   windows_createlog.bat
>>
>> The .exe files are still there.
>
> Sorry or my insistence :)
>
> This is what I have in my Makefile:
>
>        ( cd ${WRKSRC}/JDownloader && ${COPYTREE_SHARE} \* \
>                          ${PREFIX}/${PORTNAME} '! ( -name *.exe -or -name *.dll \
>                                                  -or -name *.bat )' )
>
> what I've observed is that 'make install' fails with this message:
>
> find: JDownloader.exe: unknown primary or operator
> find: JDownloader.exe: unknown primary or operator
>
> However, if I replace the expression so I filter with something like
> *.txt and there is only
> one file in the directory, it works. I checked this with audio/xmp
>
> $cat Makefile
> ...
> .if !defined(NOPORTDOCS)
>        ${ECHO_MSG} Installing documentation in ${DOCSDIR}
>        ( cd ${WRKSRC}/docs && ${COPYTREE_SHARE} \* \
>                ${DOCSDIR} '! ( -name Makefile -or -name xmp.1 \
>                -or -name *.bak -or -name *.orig )' )
> .endif
>
> ...
>
> $ make
>
> $ ls work/xmp-3.5.0/docs/*.bak
> work/xmp-3.5.0/docs/xmp.1.bak
>
> Only one file (make install works fine).
>
> $ touch work/xmp-3.5.0/docs/test.bak
>
> $make install
>
> ===>  Installing for xmp-3.5.0,1
> ===>   xmp-3.5.0,1 depends on file: /usr/local/bin/unzip - found
> ===>   Generating temporary packing list
> ===>  Checking if audio/xmp already installed
> Installing xmp in /usr/local/bin
> Installing xmp.conf in /usr/local/etc/xmp
> Installing modules.conf in /usr/local/etc/xmp
> Installing manpages in /usr/local/man/man1
>
>  Installation complete. To customize, copy /usr/local/etc/xmp/xmp.conf
>  and /usr/local/etc/xmp/modules.conf to $HOME/.xmp/
>
> Installing documentation in /usr/local/share/doc/xmp
> find: xmp.1.bak: unknown primary or operator
> chown: /usr/local/share/doc/xmp: No such file or directory
> *** Error code 1
>
> Stop in /usr/ports/audio/xmp.
> *** Error code 1
>
> Stop in /usr/ports/audio/xmp.
>
>
> Why is this?
>
> Thanks in advances

OK, you got me curious enough to get testing.

The problem is that the -name *.bak expands to -name test.bak
xmp1.bak, which fails.  Escaping for the shell without upsetting find
also appears non-trivial, due to the multiple levels of escaping
(Make, then sh, then sh again, then find)

You should instead use -regex:

(cd ${WRKSRC}/JDownloader && ${COPYTREE_SHARE} \* \
${PREFIX}/${PORTNAME}/ '! ( -regex .*.exe )' )

Hideous, but it works.  (If you're unfamiliar with REs, I might point
out that you shouldn't forget the leading dot ;))

Chris


More information about the freebsd-ports mailing list