#stdout to /dev/null to see only the error messages

It comes down to more issues with how IBM xlc handles (less elegantly) Compound Literals compared to GCC.


michael@x071:[/data/prj/aixtools/github/dovecot/x071-test]make -i >/dev/null
"../../../../src/x071-test/src/plugins/quota/quota.c", line 382.17: 1506-196 (S) Initialization between types "char* const" and "struct quota_param_parser" is not allowed. "../../../../src/x071-test/src/plugins/quota/quota.c", line 383.17: 1506-196 (S) Initialization between types "void(* const)(struct quota_root*,const char*)" and "struct quota_param_parser" is not allowed. "../../../../src/x071-test/src/plugins/quota/quota.c", line 384.17: 1506-196 (S) Initialization between types "char* const" and "struct quota_param_parser" is not allowed. "../../../../src/x071-test/src/plugins/quota/quota.c", line 385.17: 1506-196 (S) Initialization between types "void(* const)(struct quota_root*,const char*)" and "struct quota_param_parser" is not allowed.
make[4]: [quota.lo] Error 1 (ignored)

The above issues I resolved by changing

/*
 * Sigh, xlc and Compound Literals
 *
struct quota_param_parser quota_param_hidden = {.param_name = "hidden", .param_handler = hidden_param_handler}; struct quota_param_parser quota_param_ignoreunlimited = {.param_name = "ignoreunlimited", .param_handler = ignoreunlim_param_handler}; struct quota_param_parser quota_param_noenforcing = {.param_name = "noenforcing", .param_handler = noenforcing_param_handler}; struct quota_param_parser quota_param_ns = {.param_name = "ns=", .param_handler = ns_param_handler};
 */

to

#define quota_param_hidden {.param_name = "hidden", .param_handler = hidden_param_handler} #define quota_param_ignoreunlimited {.param_name = "ignoreunlimited", .param_handler = ignoreunlim_param_handler} #define quota_param_noenforcing {.param_name = "noenforcing", .param_handler = noenforcing_param_handler} #define quota_param_ns {.param_name = "ns=", .param_handler = ns_param_handler}

Unfortunately, this did not help quota-fs.c, so I move the defines to quota.h.

However, since hidden_param_handler() is defined as a static routine, it is not visible outside of quota.c. As such the error messages change from:

"../../../../src/x071-test/src/plugins/quota/quota-fs.c", line 125.17: 1506-196 (S) Initialization between types "char* const" and "struct quota_param_parser" is not allowed. "../../../../src/x071-test/src/plugins/quota/quota-fs.c", line 125.37: 1506-196 (S) Initialization between types "void(* const)(struct quota_root*,const char*)" and "struct quota_param_parser" is not allowed. "../../../../src/x071-test/src/plugins/quota/quota-fs.c", line 125.62: 1506-196 (S) Initialization between types "char* const" and "struct quota_param_parser" is not allowed. "../../../../src/x071-test/src/plugins/quota/quota-fs.c", line 126.18: 1506-515 (S) Member designator cannot be applied to an object of type "const struct quota_param_parser[]".
make[4]: [quota-fs.lo] Error 1 (ignored)
"../../../../src/x071-test/src/plugins/quota/quota-dict.c", line 47.17: 1506-196 (S) Initialization between types "char* const" and "struct quota_param_parser" is not allowed. "../../../../src/x071-test/src/plugins/quota/quota-dict.c", line 47.37: 1506-196 (S) Initialization between types "void(* const)(struct quota_root*,const char*)" and "struct quota_param_parser" is not allowed. "../../../../src/x071-test/src/plugins/quota/quota-dict.c", line 47.66: 1506-196 (S) Initialization between types "char* const" and "struct quota_param_parser" is not allowed. "../../../../src/x071-test/src/plugins/quota/quota-dict.c", line 47.91: 1506-196 (S) Initialization between types "void(* const)(struct quota_root*,const char*)" and "struct quota_param_parser" is not allowed.
make[4]: [quota-dict.lo] Error 1 (ignored)
"../../../../src/x071-test/src/plugins/quota/quota-imapc.c", line 66.17: 1506-196 (S) Initialization between types "char* const" and "struct quota_param_parser" is not allowed. "../../../../src/x071-test/src/plugins/quota/quota-imapc.c", line 67.18: 1506-515 (S) Member designator cannot be applied to an object of type "const struct quota_param_parser[]".
make[4]: [quota-imapc.lo] Error 1 (ignored)
libtool:   error: 'quota.lo' is not a valid libtool object
make[4]: [lib10_quota_plugin.la] Error 1 (ignored)
libtool:   error: 'quota.lo' is not a valid libtool object
make[4]: [quota-status] Error 1 (ignored)
make[4]: *** No rule to make target `../quota/lib10_quota_plugin.la', needed by `lib11_imap_quota_plugin.la'. Stop.
make[3]: [all-recursive] Error 1 (ignored)

to:

michael@x071:[/data/prj/aixtools/github/dovecot/x071-test/src/plugins/quota]make -i >/dev/null "../../../../src/x071-test/src/plugins/quota/quota-fs.c", line 125.17: 1506-045 (S) Undeclared identifier hidden_param_handler. "../../../../src/x071-test/src/plugins/quota/quota-fs.c", line 126.17: 1506-045 (S) Undeclared identifier noenforcing_param_handler. "../../../../src/x071-test/src/plugins/quota/quota-fs.c", line 127.17: 1506-045 (S) Undeclared identifier ns_param_handler.
make: [quota-fs.lo] Error 1 (ignored)
"../../../../src/x071-test/src/plugins/quota/quota-dict.c", line 47.17: 1506-045 (S) Undeclared identifier hidden_param_handler. "../../../../src/x071-test/src/plugins/quota/quota-dict.c", line 47.37: 1506-045 (S) Undeclared identifier ignoreunlim_param_handler. "../../../../src/x071-test/src/plugins/quota/quota-dict.c", line 47.66: 1506-045 (S) Undeclared identifier noenforcing_param_handler. "../../../../src/x071-test/src/plugins/quota/quota-dict.c", line 47.91: 1506-045 (S) Undeclared identifier ns_param_handler.
make: [quota-dict.lo] Error 1 (ignored)
"../../../../src/x071-test/src/plugins/quota/quota-imapc.c", line 66.17: 1506-045 (S) Undeclared identifier ns_param_handler.
make: [quota-imapc.lo] Error 1 (ignored)
libtool:   error: 'quota-fs.lo' is not a valid libtool object
make: [lib10_quota_plugin.la] Error 1 (ignored)
libtool:   error: 'quota-fs.lo' is not a valid libtool object
make: [quota-status] Error 1 (ignored)

For me, this is a procedure declaration issue I may not resolve on my own - I must assume there is a reason that these routines are "static".

Michael

p.s. Once this is resolved I hope to be able to use "make check". I had to massage the Makefiles to get gnulib/getopt to link into dovecot. Once I can run "make check" I'll request help on how to get a new directory included in the Makefile list, and also assistance with making sure it can also work with out-of-tree builds.

Reply via email to