Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Jul 2015 12:26:47 +0200
From:      Tijl Coosemans <tijl@FreeBSD.org>
To:        Marcin Cieslak <saper@saper.info>
Cc:        ports@FreeBSD.org
Subject:   Re: Proper way to get base <iconv.h> with autoconf?
Message-ID:  <20150706122647.64b520e2@kalimero.tijl.coosemans.org>
In-Reply-To: <alpine.BSF.2.11.1507052035240.7491@z.fncre.vasb>
References:  <alpine.BSF.2.11.1507052035240.7491@z.fncre.vasb>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 5 Jul 2015 21:11:55 +0000 Marcin Cieslak <saper@saper.info> wrote:
> [X-posted, replies set to ports@FreeBSD.org]
> 
> Hello,
> 
> I have managed to upstream few things needed
> to make mono work on FreeBSD without local patches.
> 
> Now I am stuck with the iconv detection code.
> 
> Mono (or it's dumbled-down glib called eglib) need
> libiconv for two things - charset conversion:
> 
> 
> https://github.com/mono/mono/blob/master/eglib/src/giconv.c
> 
> and getting default charset information
> 
> https://github.com/mono/mono/blob/master/eglib/src/gunicode.c#L223
> 
> The latter can be solved by using "nl_langinfo (CODESET);"
> and avoiding the need to link libcharset.so
> 
> 
> Mono uses "standard" iconv.m4 autoconf test, version 11
> https://github.com/mono/mono/blob/master/eglib/m4/iconv.m4
> 
> which is developed in the gettext and gnulib (The GNU portability
> library):
> 
> http://git.savannah.gnu.org/cgit/gnulib.git/log/m4/iconv.m4
> 
> http://git.savannah.gnu.org/cgit/gettext.git/log/gettext-runtime/m4/iconv.m4
> 
> Whenever -I/usr/local/include is added to CPPFLAGS for
> some reason (some other library, or jest using /usr/local as
> default prefix) the configure script fails to use base header
> and libc support and needs using GNU iconv as a dependency;
> because this simple test fails:
> 
> 
> configure:13910: checking for iconv
> configure:13934: cc -o conftest -g -O2 -g -D_GNU_SOURCE -I/usr/local/include  conftest.c  >&5
> /tmp/conftest-ee6d62.o: In function `main':
> /home/saper/sw/mono/eglib/conftest.c:42: undefined reference to `libiconv_open'
> /home/saper/sw/mono/eglib/conftest.c:43: undefined reference to `libiconv'
> /home/saper/sw/mono/eglib/conftest.c:44: undefined reference to `libiconv_close'
> cc: error: linker command failed with exit code 1 (use -v to see invocation)
> configure:13934: $? = 1
> configure: failed program was:
> | /* confdefs.h */
> | #define PACKAGE_NAME "eglib"
> | #define PACKAGE_TARNAME "eglib"
> | #define PACKAGE_VERSION "0.3"
> | #define PACKAGE_STRING "eglib 0.3"
> | #define PACKAGE_BUGREPORT "http://bugzilla.xamarin.com/enter_bug.cgi?classification=Mono"
> 
> --snip--
> 
> | /* end confdefs.h.  */
> |
> | #include <stdlib.h>
> | #include <iconv.h>
> |
> | int
> | main ()
> | {
> | iconv_t cd = iconv_open("","");
> |            iconv(cd,NULL,NULL,NULL,NULL);
> |            iconv_close(cd);
> |   ;
> |   return 0;
> | }
> configure:13958: cc -o conftest -g -O2 -g -D_GNU_SOURCE -I/usr/local/include  conftest.c  /usr/local/lib/libiconv.so -Wl,-rpath -Wl,/usr/local/lib >&5
> configure:13958: $? = 0
> configure:13968: result: yes
> 
> The <iconv.h> test fails because /usr/local/include/iconv.h
> redefines iconv_open (and friends) to libiconv_open 
> 
> Any ideas how to fix/improve the iconv.m4 detection code
> - to use the FreeBSD's base <iconv.h> and not require a library?

This works as intended and behaves exactly the same as on Linux.

When you don't have libiconv installed, base iconv is used.
When you have libiconv installed, libiconv is used.
When you have libiconv installed, but don't want to use it you can
add -DLIBICONV_PLUG to CPPFLAGS.

It's up to the user to choose one of these and not something that you
as a developer need to worry about.  So no changes to mono or iconv.m4
are needed.

When creating a port that uses iconv you just add USES=iconv to the port
Makefile and it should do the right thing.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20150706122647.64b520e2>