Tru64 and 2.2 problems
Christos Soulios
soulbros at noc.uoa.gr
Wed Jul 23 06:23:14 EDT 2003
I also compiled cyrus-imapd-2.2.1-BETA on a Solaris 9 box with Forte C compiler.
I had some of the same problems, which come from the fact that cyrus is mostly
gcc compiler oriented.
> 2) So, I get past the above, and run right smack into another problem,
> this time with lib/imapopts.c. I get over a 100 lines of errors along
> the lines of the following:
>
> {IMAPOPT_ADMINS,"admins",0,(union config_value)((const char
> *)""),OPT_STRING},
> ---------------------------^
> {IMAPOPT_ALLOWALLSUBSCRIBE,"allowallsubscribe",0,(union
> config_value)((int)0),OPT_SWITCH},
> -------------------------------------------------^
> {IMAPOPT_ALLOWNEWNEWS,"allownewnews",0,(union
> config_value)((int)0),OPT_SWITCH},
> ---------------------------------------^
>
> Basically, ever line in that table generates an error on the union
> construct. I don't understand the error message, been even more so, I
> don't understand why the union is even there at all. It appears that
> this file is automatically generated by the following command:
>
> ../tools/config2header imapopts.c imapopts.h < imapoptions
>
> The config2header script talks about playing an interesting game to get
> the union to initialize itself in a syntacticly valid manner, namely to
> initialize the union itself and not the members of the union, as well
> as
> to ensure that the union is initialized to something of a type that is
> in that union. What do I say about that? Very bizarre, and it doesn't
> work in Tru64.
>
> Doing a mass delete of all the '(union config_value)' stuff in the file
> gets the code to compile, but I don't know what kind of problems that
> is
> going to cause me if it has to do with initializing things.
>
> Any thoughts on how to handle this problem?
>
> I get similar errors when compiling libcyr_cfg.c as well, but in a
> slightly different context, and doing the same deletion gets it to at
> least compile.
>
This is because there is a cast to a union. Union casts are not ansi C
compliant, but a gcc extension.
Please see :
http://gcc.gnu.org/onlinedocs/gcc/Cast-to-Union.html
and
http://groups.google.com/groups?q=union+cast+group:comp.lang.c.*&hl=en&lr=&ie=UTF-8&group=comp.lang.c.*&selm=21259%40mimsy.umd.edu&rnum=3
What I did is to remove the cast to a union type. This makes the syntax ansi c
compliant.
By default the compiler sets the rvalue to the first member of the union.
And because the union is
union config_value {
const char *s;
int i;
int b;
};
the compiler assigns the value to the char *s member of the union. For this
reason every assignment to a string gets perfectly compiled.
However, I had some warnings for the assignments of integers to a char *. In my
case (Sun with Solaris 9) this creates no further problems, because the char *s
and the integer members of the union share the same memory. But I am not sure
what happens with different architectures that although the union members share
the same memory, the byte alignment between the string and the integer may differ.
> 3) After that, it compiles for awhile and then stops on imap/protocol.c
> with the following error:
>
> cc: Error: ./../lib/prot.h, line 209: Missing ";". (nosemi)
> __attribute__ ((format (printf, 2, 3)));
>
> Looking in lib/prot.h, I see the following:
>
> extern int prot_printf(struct protstream *, const char *, ...)
> __attribute__ ((format (printf, 2, 3)));
>
> What is that supposed to do? I simply deleted the line that has the
> __attribute__ on it and put a semicolon on the previous line and it
> compiles. What problems will I see by doing that?
>
__atribute__ keyword handling is done at the configure script and for compilers
that do not support this extension there is a #define statement. However, a
'#include <config.h>' statement is missing from the lib/prot.h file and for this
reason it does not build with other than gcc compilers. If you add it, then it
is ok.
Regards,
Christos
--
/**
* Christos Soulios
* Department of Informatics
* University of Athens
* e-mail : soulbros at noc.uoa.gr
*/
More information about the Info-cyrus
mailing list