On file installation

Fernando Apesteguía fernando.apesteguia at gmail.com
Thu May 17 19:58:59 UTC 2012


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

>
>>
>> Chris


More information about the freebsd-ports mailing list