1. Resolve the dependency of gnu-gettext
In most cases, the
gettext(3C) on solaris could fulfill the requirements of your application. You could make following change in configure.in (or configure.ac):
-AM_GNU_GETTEXT
+AM_GLIB_GNU_GETTEXT
+LTLIBINTL=
+AC_SUBST(LTLIBINTL)
The source package may ship with a completed gnu-gettext in its source tree (normally named
'intl'), remove it from the
'SUBDIRS' in the top-level Makefile.am. Sometimes, there is a
'm4' directory in the source tree, contains some macro files for checking gnu libraries or GCC compiler options, remove the option
'-I m4' from
'ACLOCAL_AMFLAGS' in the top-level Makefile.am.
Then execute the following steps to update m4 macros and configure script:
glib-gettextize --force
aclocal $ACLOCAL_FLAGS
autoheader
libtoolize -c --automake
automake --add-missing
autoconfAnother note is, the gnu-gettext could not retrieve the localized message compiled by solaris' msgfmt (/usr/bin/msgfmt), but solaris' gettext works fine with the message compiled by gnu's msgfmt.
2. Build socket programs
You may find that the commonly used macro
'SUN_LEN' is not defined in Solaris, add the follow definition in your header file:
+#if defined(sun) && !defined(SUN_LEN)
+#define SUN_LEN(su) (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
+#endif
And before you run configure script, set the LDFLAGS as following:
export LDFLAGS=-lsocket
3. 0-sized array member in C struct
struct Foo {int bar; char data[0];};
-char data[0];
+char data[]; //change the 0-sized array to flexible array
Note, according to C99 standard, the flexible array member could only be placed in the end of a structure. And this change will not impact the layout and size of the original data structure. (Thanks
tchaikov for providing the perfect solution!) While, if the 0-sized array member is not on the tail, you may have to use
'union', which requires to change the accessing code.
4. struct initialization
struct point {int x, y, z;};
- struct point x = {x:2, z:3};
+ struct point x = {.x=2, .z=3}; // c99 extension, not supported
// by sunstudio C++ compiler
5. alloca(3C) on Solaris
You need include
alloca.h in your source file where you call
alloca(3C).
6. wchar_t
Do
NOT assume a wide char is always a UCS4 character. It's true only in UTF-8 locales on Solaris.
7. Using gcc if the source uses too much gcc extensions.
The last choice, /usr/sfw/bin/gcc. The SunStudio C compiler and gcc are compatible in ABI. But C++ compilers are different. If you are building the package on SPARC platform,
GCC4SS has better performance than gcc.