From 74f715bd9cc86702aa3bda5e0827500fabd83e10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20R=C3=BChsen?= Date: Fri, 27 Jun 2014 17:13:30 +0200 Subject: [PATCH] started with libidn2 integration --- configure.ac | 47 ++++++++++++++++++++++++++++++++++++----------- src/Makefile.am | 11 +++++++++-- src/psl2c.c | 24 ++++++++++++------------ tests/Makefile.am | 13 ++++++------- 4 files changed, 63 insertions(+), 32 deletions(-) diff --git a/configure.ac b/configure.ac index f89b1e1..2260f3a 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ AC_INIT([libpsl], [0.4.0], [tim.ruehsen@gmx.de], [libpsl], [http://github.com/rockdaboot/libpsl]) AC_PREREQ([2.59]) -AM_INIT_AUTOMAKE([1.10 -Wall no-define]) +AM_INIT_AUTOMAKE([1.10 -Wall no-define foreign]) # Generate two configuration headers; one for building the library itself with # an autogenerated template, and a second one that will be installed alongside @@ -93,25 +93,50 @@ AC_ARG_WITH(libicu, # Check for enable/disable builtin PSL data AC_ARG_ENABLE(builtin, - AS_HELP_STRING([--disable-builtin], [do not compile PSL data into library]), [ - enable_builtin=no + --enable-builtin[=IDNA library] + Specify the IDNA library used for built-in data generation: + libicu [[default]]: IDNA2008 UTS#46 library + libidn2: IDNA2008 library also needs libunistring + --disable-builtin Do not generate built-in data ], [ - enable_builtin=yes + if test "$enableval" = "libicu" -o "$enableval" = "yes"; then + if test "$HAVE_LIBICU" != "yes"; then + AC_MSG_ERROR(You requested libicu but it is not installed.) + fi + enable_builtin=libicu + AC_DEFINE([BUILTIN_GENERATOR_LIBICU], [1], [generate PSL data using libicu]) + elif test "$enableval" = "libidn2"; then + if test "$HAVE_LIBIDN2" != "yes"; then + AC_MSG_ERROR(You requested libidn2 but it is not installed.) + fi + enable_builtin=libidn2 + AC_DEFINE([BUILTIN_GENERATOR_LIBIDN2], [1], [generate PSL data using libidn2]) + elif test "$enableval" = "no"; then + enable_builtin=no + else + AC_MSG_ERROR(Unknown value $enableval) + fi + ], [ + # this is the default if neither --enable-builtin nor --disable-built were specified + enable_builtin=libicu + if test "$HAVE_LIBIDN2" != "yes"; then + AC_MSG_ERROR(You requested libidn2 but it is not installed.) + fi + AC_DEFINE([BUILTIN_GENERATOR_LIBICU], [1], [generate PSL data using libicu]) AC_DEFINE([WITH_BUILTIN], [1], [compile PSL data into library]) - AS_IF([test $HAVE_LIBICU != yes], - [ - # Check for idn2 fallback to generate punycode - AC_CHECK_PROG(HAVE_IDN2, idn2, yes, AC_MSG_ERROR(Cannot find required tool 'idn2' as fallback.)) - ]) ]) -AM_CONDITIONAL([WITH_BUILTIN], [test $enable_builtin = yes]) + +AM_CONDITIONAL([BUILTIN_GENERATOR_LIBICU], test "x$enable_builtin" = "xlibicu") +AM_CONDITIONAL([BUILTIN_GENERATOR_LIBIDN2], test "x$enable_builtin" = "xlibidn2") +AM_CONDITIONAL([WITH_BUILTIN], test $enable_builtin = yes) # Check for valgrind ac_enable_valgrind=no AC_ARG_ENABLE(valgrind-tests, AS_HELP_STRING([--enable-valgrind-tests], [enable using Valgrind for tests]), - [ac_enable_valgrind=$enableval], [ac_enable_valgrind=no]) + [ac_enable_valgrind=$enableval], + [ac_enable_valgrind=no]) if test "${ac_enable_valgrind}" = "yes" ; then AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no) diff --git a/src/Makefile.am b/src/Makefile.am index 0fe1ec7..36da6d4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,8 +13,15 @@ libpsl_la_LDFLAGS = -version-info $(LIBPSL_SO_VERSION) noinst_PROGRAMS = psl2c psl2c_SOURCES = psl2c.c -psl2c_CPPFLAGS = -I$(top_srcdir)/include -D _GNU_SOURCE $(LIBICU_CFLAGS) -psl2c_LDADD = $(LIBICU_LIBS) +psl2c_CPPFLAGS = -I$(top_srcdir)/include -D _GNU_SOURCE +if BUILTIN_GENERATOR_LIBICU + psl2c_CPPFLAGS += $(LIBICU_CFLAGS) + psl2c_LDADD = $(LIBICU_LIBS) +endif +if BUILTIN_GENERATOR_LIBIDN2 + psl2c_CPPFLAGS += $(LIBIDN2_CFLAGS) + psl2c_LDADD = $(LIBIDN2_LIBS) +endif # Build rule for suffix.c # PSL_FILE can be set by ./configure --with-psl-file=[PATH] diff --git a/src/psl2c.c b/src/psl2c.c index daeec83..0909c7e 100644 --- a/src/psl2c.c +++ b/src/psl2c.c @@ -39,7 +39,7 @@ #include #include -#ifdef WITH_BUILTIN +#if defined(BUILTIN_GENERATOR_LIBICU) || defined(BUILTIN_GENERATOR_LIBIDN2) #include @@ -52,7 +52,7 @@ static void _print_psl_entries(FILE *fpout, const _psl_vector_t *v, const char * { int it; -#ifdef WITH_LIBICU +#ifdef BUILTIN_GENERATOR_LIBICU do { UVersionInfo version_info; char version[U_MAX_VERSION_STRING_LENGTH]; @@ -61,9 +61,11 @@ static void _print_psl_entries(FILE *fpout, const _psl_vector_t *v, const char * u_versionToString(version_info, version); fprintf(fpout, "/* automatically generated by psl2c (punycode generated with libicu/%s) */\n", version); } while (0); +#elif BUILTIN_GENERATOR_LIBIDN2 + fprintf(fpout, "/* automatically generated by psl2c (punycode generated with libidn2/%s) */\n", idn2_check_version(NULL)); #else fprintf(fpout, "/* automatically generated by psl2c (without punycode support) */\n"); -#endif /* WITH_LIBICU */ +#endif fprintf(fpout, "static _psl_entry_t %s[] = {\n", varname); @@ -77,7 +79,7 @@ static void _print_psl_entries(FILE *fpout, const _psl_vector_t *v, const char * fprintf(fpout, "};\n"); } -#ifndef WITH_LIBICU +#if !defined(WITH_LIBICU) && !defined(WITH_IDN2) static int _str_needs_encoding(const char *s) { while (*s > 0) s++; @@ -117,14 +119,14 @@ static void _add_punycode_if_needed(_psl_vector_t *v) _vector_sort(v); } -#endif /* ! WITH_LIBICU */ +#endif /* !defined(WITH_LIBICU) && !defined(WITH_IDN2) */ -#endif /* WITH_BUILTIN */ +#endif /* defined(BUILTIN_GENERATOR_LIBICU) || defined(BUILTIN_GENERATOR_LIBIDN2) */ int main(int argc, const char **argv) { FILE *fpout; -#ifdef WITH_BUILTIN +#if defined(BUILTIN_GENERATOR_LIBICU) || defined(BUILTIN_GENERATOR_LIBIDN2) psl_ctx_t *psl; #endif int ret = 0; @@ -136,7 +138,7 @@ int main(int argc, const char **argv) return 1; } -#ifdef WITH_BUILTIN +#if defined(BUILTIN_GENERATOR_LIBICU) || defined(BUILTIN_GENERATOR_LIBIDN2) if (!(psl = psl_load_file(argv[1]))) return 2; @@ -146,9 +148,8 @@ int main(int argc, const char **argv) size_t cmdsize = 16 + strlen(argv[1]); char *cmd = alloca(cmdsize), checksum[64] = ""; -#ifndef WITH_LIBICU - /* If libicu is not configured, we still need to have punycode in our built-in data. */ - /* Else the test suite fails. */ +#if !defined(WITH_LIBICU) && !defined(WITH_IDN2) + /* library is compiled without ability to generate punycode, so let's generate punycode at least for the builtin data */ _add_punycode_if_needed(psl->suffixes); _add_punycode_if_needed(psl->suffix_exceptions); #endif @@ -193,7 +194,6 @@ int main(int argc, const char **argv) fprintf(stderr, "Failed to write open '%s'\n", argv[2]); ret = 3; } - #endif /* WITH_BUILTIN */ return ret; diff --git a/tests/Makefile.am b/tests/Makefile.am index 9234320..e3324f9 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -2,18 +2,17 @@ DEFS = @DEFS@ -DDATADIR=\"$(top_srcdir)/data\" -DSRCDIR=\"$(srcdir)\" -DPSL_FILE AM_CPPFLAGS = -I$(top_srcdir)/include LDADD = ../src/libpsl.la -if WITH_BUILTIN - -PSL_TESTS = test-is-public test-is-public-builtin test-is-public-all test-registrable-domain \ - test-is-cookie-domain-acceptable - -else - # ./configure'd with '--disable-builtin' # Do not call test-is-public-builtin here: it does not make sense. # Do not call test-registrable-domain here: it would fail due to missing punycode entries in PSL file. PSL_TESTS = test-is-public test-is-public-all test-is-cookie-domain-acceptable +if BUILTIN_GENERATOR_LIBICU + PSL_TESTS += test-is-public-builtin test-registrable-domain +endif + +if BUILTIN_GENERATOR_LIBIDN2 + PSL_TESTS += test-is-public-builtin test-registrable-domain endif check_PROGRAMS = $(PSL_TESTS)