web commit by http://weakish.int.eu.org/
[ikiwiki] / doc / bugs / build_in_opensolaris.mdwn
1 I've learned I'm not yet clever enough to get IkiWiki to build in OpenSolaris (as running on a [Joyent Accelerator][ja]). Anyone figured this out already?
2
3 I think problem lies mostly, if not entirely, in getting ikiwiki.cgi.c to compile in an OpenSolaris context (this is ikiwiki-2.2):
4
5 > <code>$ ikiwiki --setup ~/etc/ikiwiki/ikiwiki-edit.setup  
6 > [...]  
7 > Error: failed to compile /home/username/domains/domain.tld/cgi-bin/ikiwiki.cgi.c at /opt/local/lib/perl5/site_perl/IkiWiki.pm line 104.
8 BEGIN failed--compilation aborted at (eval 3) line 145.</code>
9
10 More specifically, 
11
12 > <code>$ /usr/sfw/bin/gcc ikiwiki.cgi.c  
13 > Undefined               first referenced  
14 > symbol                     in file  
15 > asprintf                   /var/tmp//cczPaG7R.o  
16 > ld: fatal: Symbol referencing errors. No output written to a.out  
17 > collect2: ld returned 1 exit status</code>
18
19 [ja]: <http://www.joyent.com/accelerator/technical-specifications/>
20
21 Thanks, Joey et al., for a really cool tool.
22
23 --Mike
24
25 > Looks like the ikiwiki wrapper uses asprintf.  glibc has that, and I think some other libc implementations have that, but apparently the Solaris libc does not.  The same problem will come up on other platforms that don't use glibc.  The ikiwiki wrapper needs to either avoid asprintf or use a portable asprintf implementation from somewhere like gnulib. --[[JoshTriplett]]
26
27 >> I used asprintf because it was easy, and safe. That is a good reason for
28 >> C libraries to support asprintf, IMHO. Note that both linux and *BSD
29 >> support asprintf.
30 >> 
31 >> Of the possible patches to make this more portable, I'd generally prefer
32 >> one that uses portable functions (safely), rather than one that includes
33 >> an asprintf implementation in ikiwiki. --[[Joey]]
34
35 > I got ikiwiki working (sort of) on OpenSolaris today.  I ran into this problem too, and wrote a version of asprintf() from scratch which uses more portable APIs:
36  
37 <code>
38     #include &lt;stdarg.h&gt;
39  
40     int
41     asprintf(char **string_ptr, const char *format, ...)
42     {
43         va_list arg;
44         char *str;
45         int size;
46         int rv;
47  
48         va_start(arg, format);
49         size = vsnprintf(NULL, 0, format, arg);
50         size++;
51         va_start(arg, format);
52         str = malloc(size);
53         if (str == NULL) {
54                 va_end(arg);
55                 /*
56                  * Strictly speaking, GNU asprintf doesn't do this,
57                  * but the caller isn't checking the return value.
58                  */
59                 fprintf(stderr, "failed to allocate memory\\n");
60                 exit(1);
61         }
62         rv = vsnprintf(str, size, format, arg);
63         va_end(arg);
64  
65         *string_ptr = str;
66         return (rv);
67     }
68
69 </code>
70
71 > I added this after the rest of the #include's in Wrapper.pm, and it seems to work. --Blake
72
73 >> I have this marked [[bugs/done]] already, because I changed it in svn to
74 >> not use asprintf --[[Joey]]