On Wed, Jul 23, 2008 at 10:55:01PM +0200, Martin Toft wrote: > I'm trying to compile cwm (/usr/xenocara/app/cwm) on Linux, as I would > like to use this very supreme window manager on all my non-OpenBSD > systems as well. The version of cwm that I'm working with is from > yesterday's -current (23rd of July, 2008). The Linux distribution is > Ubuntu Feisty. [..]
oga@ and jsg@ pointed me to byacc - thanks! There is some yacc specific constructs in cwm's parser that bison doesn't support. To address the mail from [EMAIL PROTECTED]: I think this _is_ OpenBSD related (opposed to Linux related), as there might be other OpenBSD users, like me, who want to use cwm on their non-OpenBSD boxes as well, and Linux-only users hardly know about the cwm in OpenBSD. The following is an attempt to make a simple guide. OpenBSD's cwm window manager on Ubuntu Linux -------------------------------------------- 1. Install the following packages: byacc libxext-dev libexpat1-dev libxft-dev libfontconfig1-dev libxrender-dev libxau-dev xlibs-dev libxdmcp-dev zlib1g-dev You might also need to install cvs and xterm (xterm is the default terminal for cwm to start when one types ctrl+alt+enter). 2. Pick an anonymous CVS server close to you: http://www.openbsd.org/anoncvs.html#CVSROOT 3. Checkout cwm as of July 24, 2008: $ export CVSROOT=(what you picked in step 2) $ cvs -q -d$CVSROOT checkout -D 2008-07-24 xenocara/app/cwm U xenocara/app/cwm/LICENSE U xenocara/app/cwm/Makefile [..] U xenocara/app/cwm/xmalloc.c U xenocara/app/cwm/xutil.c $ cd xenocara/app/cwm 4. Patch the source using cwm-linux.patch (attached inline further down): $ patch < cwm-linux.patch patching file calmwm.c patching file calmwm.h patching file conf.c patching file headers.h patching file kbfunc.c patching file parse.y 5. Generate the parser using byacc: $ byacc -d parse.y $ mv y.tab.c parse.c 6. Compile and link: $ for i in *.c; do gcc -I /usr/include/freetype2 -c $i; done $ gcc -lXft -lXrender -lX11 -lXau -lXdmcp -lXext -lfontconfig -lexpat -lfreetype -lz -o cwm *.o 7. Enjoy: $ ls -l cwm -rwxr-xr-x 1 mt mt 83963 2008-07-24 21:21 cwm Corrections and flames are most welcome :-) Martin cwm-linux.patch: --- calmwm.c.orig 2008-07-23 15:25:38.000000000 +0200 +++ calmwm.c 2008-07-23 15:25:51.000000000 +0200 @@ -317,7 +317,7 @@ errno = save_errno; } -__dead void +void usage(void) { extern char *__progname; --- calmwm.h.orig 2008-07-23 15:25:30.000000000 +0200 +++ calmwm.h 2008-07-23 15:25:45.000000000 +0200 @@ -312,7 +312,7 @@ void x_setup(void); char *x_screenname(int); void x_setupscreen(struct screen_ctx *, u_int); -__dead void usage(void); +void usage(void); struct client_ctx *client_find(Window); void client_setup(void); --- conf.c.orig 2008-07-24 18:20:14.000000000 +0200 +++ conf.c 2008-07-24 18:37:49.000000000 +0200 @@ -464,9 +464,9 @@ if (strchr(name, '-') == NULL) substring = name; - current_binding->button = strtonum(substring, 1, 3, &errstr); - if (errstr) - warnx("number of buttons is %s: %s", errstr, substring); + current_binding->button = strtoll(substring, NULL, 10); + if (errno || current_binding->button < 1 || current_binding->button > 3) + warn("invalid number or out of range: %s", substring); conf_mouseunbind(c, current_binding); --- headers.h.orig 2008-07-24 16:52:46.000000000 +0200 +++ headers.h 2008-07-24 19:08:23.000000000 +0200 @@ -52,4 +52,8 @@ #include <err.h> +#define strlcpy(dst, src, size) (strncpy((dst), (src), (size) - 1)) +#define strlcat(dst, src, size) (strncat((dst), (src), (size) - 1)) +#define TAILQ_END(head) NULL + #endif /* _CALMWM_HEADERS_H_ */ --- kbfunc.c.orig 2008-07-24 19:04:56.000000000 +0200 +++ kbfunc.c 2008-07-24 19:04:15.000000000 +0200 @@ -345,7 +345,7 @@ FILE *fp; char *buf, *lbuf, *p, *home; char hostbuf[MAXHOSTNAMELEN], filename[MAXPATHLEN]; - char cmd[256]; + char cmd[256], buffer[1024]; int l; size_t len; @@ -361,7 +361,9 @@ TAILQ_INIT(&menuq); lbuf = NULL; - while ((buf = fgetln(fp, &len))) { + while (!feof(fp)) { + buf = fgets(buffer, sizeof(buffer), fp); + len = strlen(buf); if (buf[len - 1] == '\n') buf[len - 1] = '\0'; else { --- parse.y.orig 2008-07-23 15:44:14.000000000 +0200 +++ parse.y 2008-07-24 18:31:47.000000000 +0200 @@ -379,11 +379,9 @@ const char *errstr = NULL; *p = '\0'; - yylval.v.number = strtonum(buf, LLONG_MIN, - LLONG_MAX, &errstr); - if (errstr) { - yyerror("\"%s\" invalid number: %s", - buf, errstr); + yylval.v.number = strtoll(buf, NULL, 10); + if (errno) { + yyerror("invalid number: %s", buf); return (findeol()); } return (NUMBER);