Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Feb 2005 18:17:02 -0300
From:      Alejandro Pulver <alejandro@varnet.biz>
To:        Peter Pentchev <roam@ringlet.net>
Cc:        Florent Thoumie <flz@xbsd.org>
Subject:   Re: Questions about creating a port
Message-ID:  <20050217181702.77bccce2@ale.varnet.bsd>
In-Reply-To: <20050217084944.GB1161@straylight.m.ringlet.net>
References:  <20050116175951.20a95dfe@ale.varnet.bsd> <4213B71B.4070601@xbsd.org> <20050217084944.GB1161@straylight.m.ringlet.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 17 Feb 2005 10:49:44 +0200
Peter Pentchev <roam@ringlet.net> wrote:

> On Wed, Feb 16, 2005 at 10:11:55PM +0100, Florent Thoumie wrote:
> > Alejandro Pulver wrote:
> > >Hello,
> > >
> > >I want to create a port of the modified version of 'generator' called 
> > >'generator-cbiere'.
> > >
> > >I partially made the port: it compiles and runs, but I have some questions 
> > >about the distribution, installation, patching, compiler warnings and type 
> > >decalrations.
> > >
> > >Distribution:
> > >
> > >The program is distributed by the author as a (complete) compressed 
> > >(tar/bz2) source called 'generator-0.35-cbiere.tar.bz2', or as a 
> > >compressed (bz2) patch called 'generator-0.35-cbiere.udiff.bz2' (that must 
> > >be applied to the original version of 'generator').
> > >
> > >Both are called in a non-standard format 
> > >("${PORTNAME}${PORTVERSION}-cbiere"), I think it should be 
> > >'generator-cbiere-0.35'. So (for using the complete source) I have to 
> > >change ${DISTFILES} (or ${DISTNAME} and ${EXTRACT_SUFX}) and ${WORKSRC}, 
> > >or upload that file to my server with the correct name.
> > >
> > >Which one is the best method to distribute the port (full source or 
> > >patch)? Can I include the patch (96386 bytes) directly in the 'files/' 
> > >directory of the port?
> > 
> > 	I'll use full source, and modify DISTFILES, try to use upstream 
> > 	sites.
> 
> I personally would also go for full sources, yes.
> 
> As to the distfile name, a better solution would be to modify just
> DISTNAME and then define USE_BZIP2 - see section 5.4.3, "EXTRACT_SUFX",
> in the Porter's Handbook.  The Good Thing(tm) about USE_BZIP2 is that it
> pulls archivers/bzip2 as a dependency if bzip2 is not part of the base
> system.  While bzip2 is indeed part of the base system on recent
> versions of FreeBSD, this is still the right way to do it for various
> reasons related to portability.
> 
> > >Installation:
> > >
> > >The program is installed as 'bin/generator-gtk', like 'generator' (the 
> > >original version), so they will conflict. How can I avoid this (I mean how 
> > >to rename the binary 'generator-gtk' to 'generator-cbiere-gtk')?
> > 
> > 	You can either set CONFLICTS or use in-line editing (USE_REINPLACE 
> > 	and
> > 	REINPLACE_CMD) to modify the Makefile so that it installs generator
> > 	binary under a different name.
> 
> If there is a case when both the 'generator' and 'generator-cbiere' MAY
> be installed simultaneously, then either REINPLACE_CMD or passing a
> --program-prefix or --program-suffix to a GNU configure-style script
> would be best.  If nobody would ever really need to install both at the
> same time, CONFLICTS is better.
> 
> > >Compiler warnings:
> > >
> > >There are (a lot of) compiler warnings about unused variables. The 
> > >original port ('generator') does not show them, so I suppose the 
> > >responsible is who did the patch. Should I fix them?
> > 
> > 	You can try to fix them removing unused variables and sending patches
> > 	upstream (to the developers). I guess you could use :
> > 	CFLAGS += -Wno-unused too.
> 
> The point about sending the patches to the original authors cannot be
> stressed too much.  If you *do* make a patch to a port, then there are
> two cases:
> - the patch applies to all systems, not just FreeBSD: in that case you
>   really ought to send it to the program developers, since it would
>   probably be useful to people using the program on other systems,
>   too;
> - the patch only applies to FreeBSD: make it so it detects whether it's
>   running on FreeBSD if possible (with C, that would usually be a matter
>   of an #ifdef __FreeBSD__; for Perl, if ($^O eq 'freebsd'); for shell
>   scripts, if [ "`uname -s`" = "FreeBSD" ], and so on).  If you can do
>   that, see the first case about sending it to the developers - it might
>   turn out to be useful for other systems, too.
> 
> In this particular case, CFLAGS += -Wno-unused looks like a good
> workaround, although it might fail if the port is compiled with a
> compiler other than GCC.  If you can take the time to actually fix the
> unused variable definitions, it would indeed be best to do so and send
> the patch to the authors.
> 
> > >Type decalrations:
> > >
> > >The modified version (generator-cbiere) did not compile because there was 
> > >an invalid type declaration "u_int64_t", that I changed into "uint64_t". 
> > >Then I noticed declarations saying "uint8", and I think the standard 
> > >defines it as "uint8_t". Should I change them?
> > 
> > 	Just do a patch, or use REINPLACE_CMD.
> 
> Careful there - if you use REINPLACE_CMD, you have to be *certain* that
> you will only replace the literal string 'uint8' when it is NOT part of
> a correct 'uint8_t' declaration :)
> 
> > >Patching:
> > >
> > >In almost all the cases I will end with more than one patch, so: should I 
> > >use different patches or merge them in one?
> > 
> > 	Try to create a patch for each file modified and name it like these :
> > 	x patch-src::Makefile.in if the patch modifies
> > 	${WRKDIR}/src/Makefile.in.
> > 	x patch-foo.c if the patch modifies ${WRKDIR}/foo.c.
> > 
> > 	Put these patches in ${FILESDIR} (files/).
> 
> This is generally regarded as the correct way to do things - usually.
> However, if there are dozens (or in some cases even hundreds) of files
> to be patched for a single purpose (e.g. changing #include <malloc.h> to
> #include <stdlib.h>, or adding an #include <sys/types.h> to many files
> as needed, or something), then it might be a better idea to combine
> *those fixes* in a single patchfile.  However, in that case, try to
> avoid patching the same source file in two different patchfiles, as
> explained in the Porter's Handbook.  For any 'should I...' or 'how do
> I...' questions related to ports, please try the Porter's Handbook first
> :)
> 
> G'luck,
> Peter
> 
> -- 
> Peter Pentchev	roam@ringlet.net    roam@cnsys.bg    roam@FreeBSD.org
> PGP key:	http://people.FreeBSD.org/~roam/roam.key.asc
> Key fingerprint	FDBA FD79 C26F 3C51 C95E  DF9E ED18 B68D 1619 4553
> If the meanings of 'true' and 'false' were switched, then this sentence wouldn't be false.
> 

Thanks to all for your replies.

About the distribution, I did the following (it is right?):
DISTNAME=       generator-0.35-cbiere
EXTRACT_SUFX=   .tar.bz2
WRKSRC=		${WRKDIR}/generator-0.35-cbiere
MASTER_SITES=   http://www.ghostwhitecrab.com/generator/
USE_BZIP2=      yes

Installation:
The two ports will not be needed at the same time but I changed the binary name (was that right?). In case that is not good practice, how can I tell the other port's maintainer to add a CONFLICTS line (send PR, mail, etc.)?

Compiler warnings:
I tried to fix them, but the warnings are in 15 files generated by another C source file that is compiled and run to generate these files (it uses a kind of template for the functions, so it uses the same variables, but initialized with different values).
The original port did not show the warnings because the options "-Wall" and "-Wunused" were disabled (inside the real port's structure). So I used reinplace to disable them from 'configure.ac' and then added 'USE_AUTOCONF_VER=259'.

Data types:
Almost every file uses the format "[us]intXX" (int8, uint8, sint16). How can I implement a Perl script (I mean, I already made it) to process all source and header files (.h, .c) and add "#include <stdint.h>". Only for curiosity: I know the standard data types use the format "[u]intXX_t" and are decalred in "stdint.h". But where are the other types declared? Are them standard?

Patches:
At this point I end up with only one patch (main/generator.c: u_int64_t > uint64_t).

Today I was compiling the port and the file (at the author's website) changed. So I had to do a 'make makesum' again. If I submit the port, will I have to update it each time the md5 sum changes?

So my port (for now) is as follows, I appreciate any suggestions and/or comments. There are some notes at the end.

----------BEGIN----------
PORTNAME=	generator-cbiere
PORTVERSION=	0.35
PORTREVISION=	0
CATEGORIES=	emulators
DISTNAME=	generator-0.35-cbiere
EXTRACT_SUFX=	.tar.bz2
MASTER_SITES=	http://www.ghostwhitecrab.com/generator/
WRKSRC=		${WRKDIR}/generator-0.35-cbiere

MAINTAINER=	alejandro@varnet.biz
COMMENT=	SEGA Genesis emulator

LIB_DEPENDS=	jpeg.9:${PORTSDIR}/graphics/jpeg

PLIST_FILES=	bin/generator-cbiere-gtk
USE_BZIP2=	yes
USE_GNOME=	gtk12
USE_SDL=	sdl
USE_REINPLACE=	yes
USE_GMAKE=	yes
GNU_CONFIGURE=	yes
USE_AUTOCONF_VER=	259
CONFIGURE_TARGET=	--build=${MACHINE_ARCH}-portbld-freebsd${OSREL}
CONFIGURE_ENV=	CPPFLAGS="-I${LOCALBASE}/include" \
		LDFLAGS="-L${LOCALBASE}/lib"
CONFIGURE_ARGS=	--with-gtk --with-sdl-audio
MAKE_ARGS=	ACLOCAL="${TRUE}" AUTOCONF="${TRUE}" AUTOMAKE="${TRUE}" \
		AUTOHEADER="${TRUE}"

.include <bsd.port.pre.mk>

.if ${ARCH} == "alpha" && ${OSVERSION} >= 502102
BROKEN=		"Does not configure on alpha 5.x"
.endif

.if ${ARCH} == "i386"
BUILD_DEPENDS+=	nasm:${PORTSDIR}/devel/nasm
CONFIGURE_ARGS+=	--with-raze
.else
CONFIGURE_ARGS+=	--with-cmz80
.endif

post-patch:
	@${REINPLACE_CMD} -e 's|-O3||g ; \
	 s|-minline-all-stringops||g ; \
		 s|-march=pentium||g ; \
		 s|-malign-loops=5||g ; \
		 s|-malign-jumps=5||g ; \
		 s|-malign-functions=5||g ; \
		 s|-Wall||g ; \
		 s|-Wunused||g ; \
		 s|-W\ ||g ; \
		 s|generator|generator-cbiere|g' ${WRKSRC}/configure.ac
	@${REINPLACE_CMD} -e 's|generator-|generator-cbiere-|g ; \
		 s|generator_|generator-cbiere_|g' \
		 ${WRKSRC}/main/Makefile.in

.include <bsd.port.post.mk>
----------END-----------

It is based on the port of the original 'generator' (I did not changed it too much).

The reinplace for main/Makefile.in changes some rules like 'generator-gtk' or 'generator-sdl' to 'generator-cbiere-gtk' and 'generator-cbiere-sdl'.

The original port uses '--with-gtk' (like this), but there are other ways to compile it, and will result in different binaries. Should I add allow the user to choose?

Thanks and Best Regards,
Ale



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050217181702.77bccce2>