From owner-freebsd-ports@FreeBSD.ORG Thu May 17 21:34:18 2012 Return-Path: Delivered-To: freebsd-ports@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 90DF51065687 for ; Thu, 17 May 2012 21:34:18 +0000 (UTC) (envelope-from utisoft@gmail.com) Received: from mail-bk0-f54.google.com (mail-bk0-f54.google.com [209.85.214.54]) by mx1.freebsd.org (Postfix) with ESMTP id 06D9B8FC15 for ; Thu, 17 May 2012 21:34:17 +0000 (UTC) Received: by bkvi18 with SMTP id i18so2574588bkv.13 for ; Thu, 17 May 2012 14:34:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date :x-google-sender-auth:message-id:subject:to:cc:content-type :content-transfer-encoding; bh=U6y3u77zPeiSHvIPityYdEGTtv2vbbZxEHEpcnugz2A=; b=gHgBjjgcJPJnVPHgO1B3Nx2iLBzIO3J8JeEjE5e658hSkn8tkngaPo8QGmYtXtAPoo aEimvdEMBem+XjU8xS2Aqj13kadmlurJXvaUYGSfvYYSEN0NeoFV6jX9IoUThOPcvSIX 6N5UNyeXvPS3Kc3CNftCWjT3yRDLbeVOkCpX20YBZfmmrZ8yarHJKQSSmNza4gxbfPHY 19k9vG18UcJifjP23LXDpGnN2ol6/VJDfn3pF8wBqNZzBJQz4QbXQ8O8A5QZjcqjBpCv uCbjHAyMMx0QOplMMk05LciAqI9NypF75QpJFUPZIgF+xiqrMjQ3ybzlWD0W0VvcfNot Ks+Q== Received: by 10.204.156.69 with SMTP id v5mr3062798bkw.133.1337290456884; Thu, 17 May 2012 14:34:16 -0700 (PDT) MIME-Version: 1.0 Sender: utisoft@gmail.com Received: by 10.204.171.138 with HTTP; Thu, 17 May 2012 14:33:46 -0700 (PDT) In-Reply-To: References: From: Chris Rees Date: Thu, 17 May 2012 22:33:46 +0100 X-Google-Sender-Auth: 5O0U7X-ahAqGAWyyccTh3VvWU4k Message-ID: To: =?ISO-8859-1?Q?Fernando_Apestegu=EDa?= Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Cc: freebsd-ports@freebsd.org Subject: Re: On file installation X-BeenThere: freebsd-ports@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting software to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 May 2012 21:34:18 -0000 On 17 May 2012 22:30, Fernando Apestegu=EDa = wrote: > > El 17/05/2012 22:29, "Chris Rees" escribi=F3: >> >> On 17 May 2012 20:58, Fernando Apestegu=EDa >> wrote: >> > On Tue, May 15, 2012 at 9:11 PM, Fernando Apestegu=EDa >> > wrote: >> >> On Tue, May 15, 2012 at 7:29 PM, Chris Rees wrote= : >> >>> On 15 May 2012 18:14, Fernando Apestegu=EDa >> >>> wrote: >> >>>> On Mon, May 14, 2012 at 7:40 PM, Fernando Apestegu=EDa >> >>>> wrote: >> >>>>> On Mon, May 14, 2012 at 7:31 PM, Chris Rees >> >>>>> wrote: >> >>>>>> On 14 May 2012 18:23, Fernando Apestegu=EDa >> >>>>>> 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 somethi= ng >> >>>>>>> similar to bash's extglob so I can copy !(*.exe|*bat)? If not, h= ow >> >>>>>>> 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 (t= he >> >>>> asterisk). I found the following line in audio/xmp/Makefile: >> >>>> >> >>>> ( cd ${WRKSRC}/docs && ${COPYTREE_SHARE} \* \ >> >>>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0${DOCSDIR} '! ( -name Makefile -or -= name xmp.1 \ >> >>>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0-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}/ >> >>> =A0'! ( -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 =A02>&1) && =A0/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 =A0 =A0 =A0 =A0 =A0 JDownloaderBETA.exe =A0 =A0jd/ >> >> license.txt =A0 =A0 =A0 =A0 =A0 =A0outdated.dat =A0 =A0 =A0 =A0 =A0 t= ools/ >> >> windows_restore.bat >> >> JDownloader.exe =A0 =A0 =A0 =A0JDownloaderD3D.exe =A0 =A0 jdupdate.ja= r >> >> license_german.txt =A0 =A0 plugins/ =A0 =A0 =A0 =A0 =A0 =A0 =A0 versi= on.txt >> >> JDownloader.jar =A0 =A0 =A0 =A0java/ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0libs/ >> >> licenses/ =A0 =A0 =A0 =A0 =A0 =A0 =A0tmp/ =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 windows_createlog.bat >> >> >> >> The .exe files are still there. >> > >> > Sorry or my insistence :) >> > >> > This is what I have in my Makefile: >> > >> > =A0 =A0 =A0 =A0( cd ${WRKSRC}/JDownloader && ${COPYTREE_SHARE} \* \ >> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0${PREFIX}/${PORTNAM= E} '! ( -name *.exe -or >> > -name *.dll \ >> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0-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) >> > =A0 =A0 =A0 =A0${ECHO_MSG} Installing documentation in ${DOCSDIR} >> > =A0 =A0 =A0 =A0( cd ${WRKSRC}/docs && ${COPYTREE_SHARE} \* \ >> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0${DOCSDIR} '! ( -name Makefile -or -nam= e xmp.1 \ >> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0-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 >> > >> > =3D=3D=3D> =A0Installing for xmp-3.5.0,1 >> > =3D=3D=3D> =A0 xmp-3.5.0,1 depends on file: /usr/local/bin/unzip - fou= nd >> > =3D=3D=3D> =A0 Generating temporary packing list >> > =3D=3D=3D> =A0Checking 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 >> > >> > =A0Installation complete. To customize, copy /usr/local/etc/xmp/xmp.co= nf >> > =A0and /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. =A0Escaping 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}/=A0'! ( -regex .*.exe )' ) >> >> Hideous, but it works. =A0(If you're unfamiliar with REs, I might point >> out that you shouldn't forget the leading dot ;)) > > Thanks, I'll give it a try tomorrow. I'm familiar with REs, no problem th= ere > :) > I'm just surprised this wasn't noticed before. After all, the whole point > when using primaries is to match several files and not just one. However, > find primaries are not widely used in the ports collection, maybe that's = the > reason. Quite possibly it's easier to just delete the files in post-patch. post-patch: ${FIND} ${WRKSRC} -name *.exe -delete Manages to miss out the shell escape problem by being more straightforward = :) Chris