Revision 509e241dbfab986144eca1d03b5f6da5ec1c1adf authored by Marek Gagolewski on 17 February 2020, 17:00:06 UTC, committed by cran-robot on 17 February 2020, 17:00:06 UTC
1 parent fb34357
configure.ac
# autoconf/configure script for stringi
# Copyright (C) 2013-2020, M. Gagolewski
# http://www.gagolewski.com/software/stringi/
##### INIT ####################################################################
AC_INIT(stringi, 1.4, marek@gagolewski.com)
ICU_VERSION_NEEDED="55" # minimal version of ICU4C required to build stringi
m4_ifndef([AC_CONFIG_MACRO_DIRS],
[m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS],
[_AM_CONFIG_MACRO_DIRS($@)])])
m4_include([tools/AC_CXX_HAVE_STL.m4])
m4_include([tools/AC_CXX_NAMESPACES.m4])
##### OPTIONS #################################################################
# shell variables/arguments accepted:
# R_HOME - R's home dir
AC_ARG_VAR(R_HOME, [Override the default directory with R installation,
e.g., /usr/lib64/R, where /usr/lib64 is in the search path.
Note that $R_HOME/bin/R should point to the R executable.])
AC_ARG_VAR([CAT], [The 'cat' command used for generating the list
of source files to compile.])
AC_ARG_VAR([PKG_CONFIG], [The 'pkg-config' command used for getting
necessary compiler flags to link to and existing libicu installation.])
AC_ARG_VAR(ICUDT_DIR, [Optional directory from which an already downloaded ICU
data archive (icudt*.zip) may be copied; either an absolute path or
a path relative to <package source dir>/src;
defaults to either icu55/data or icu61/data, depending on the version set up.])
AC_ARG_VAR(PKG_CONFIG_PATH, [An optional list of directories to search for
pkg-config's .pc files.])
AC_ARG_VAR([CC], [Purposedly ignored.])
AC_ARG_VAR([CFLAGS], [Purposedly ignored.])
AC_ARG_VAR([CPP], [Purposedly ignored.])
AC_ARG_VAR([CPPFLAGS], [Purposedly ignored.])
AC_ARG_VAR([CXX], [Purposedly ignored.])
AC_ARG_VAR([CXXFLAGS], [Purposedly ignored.])
# AC_ARG_VAR([CXXCPP], [Purposedly ignored.])
AC_ARG_VAR([LDFLAGS], [Purposedly ignored.])
AC_ARG_VAR([LIBS], [Purposedly ignored.])
AC_ARG_ENABLE([cxx11],
AS_HELP_STRING([--disable-cxx11],
[Disable the use of C++11; if you build ICU4C from sources,
make sure your C++ compiler supports the long long type.
If C++11 is disabled, the older ICU4C 55.1 bundle will be used.]))
AC_ARG_VAR([STRINGI_DISABLE_CXX11],
[Disable the use of C++11, see also --disable-cxx11.])
# ICU >= 60 requires full C++11 support
# ICU >= 61 has U_CHARSET_IS_UTF8=1 set by default
if test "x$enable_cxx11" != "xno" -a -z "${STRINGI_DISABLE_CXX11}"; then
enable_cxx11="yes"
else
enable_cxx11="no"
fi
AC_ARG_ENABLE([icu_bundle],
AS_HELP_STRING([--disable-icu-bundle],
[Force the use of the system ICU.]))
AC_ARG_VAR([STRINGI_DISABLE_ICU_BUNDLE],
[Force the use of the system ICU, see also --disable-icu-bundle.])
if test "x$enable_icu_bundle" != "xno" -a -z "${STRINGI_DISABLE_ICU_BUNDLE}"; then
enable_icu_bundle="yes"
else
enable_icu_bundle="no"
fi
AC_ARG_ENABLE([pkg_config],
AS_HELP_STRING([--disable-pkg-config],
[Disable pkg-config usage for finding ICU4C-devel;
in such a case ICU4C will be compiled from sources.]))
AC_ARG_VAR([STRINGI_DISABLE_PKG_CONFIG],
[Force the use of the ICU bundle, see also --disable-pkg-config.])
if test "x$enable_pkg_config" != "xno" -a -z "${STRINGI_DISABLE_PKG_CONFIG}"; then
enable_pkg_config="yes"
else
enable_pkg_config="no"
fi
AC_ARG_ENABLE([gcc_debug],
AS_HELP_STRING([--enable-gcc-debug],
[Enable -UNDEBUG when compiling stringi (for developers of stringi)]))
if test "x$enable_gcc_debug" = "xyes"; then
enable_gcc_debug="yes"
else
enable_gcc_debug="no"
fi
AC_ARG_ENABLE([gcc_pedantic],
AS_HELP_STRING([--enable-gcc-pedantic],
[Enable -Wall -Wextra -pedantic when compiling
stringi with gcc/clang (for developers of stringi)]))
if test "x$enable_gcc_pedantic" = "xyes"; then
enable_gcc_pedantic="yes"
else
enable_gcc_pedantic="no"
fi
AC_ARG_WITH([extra_cflags],
AS_HELP_STRING([--with-extra-cflags=FLAGS],
[Additional C compiler flags, see also the STRINGI_CFLAGS environment variable]))
AC_ARG_WITH([extra_cppflags],
AS_HELP_STRING([--with-extra-cppflags=FLAGS],
[Additional C/C++ preprocessor flags, see also the STRINGI_CPPFLAGS environment variable]))
AC_ARG_WITH([extra_cxxflags],
AS_HELP_STRING([--with-extra-cxxflags=FLAGS],
[Additional C++ compiler flags, see also the STRINGI_CXXFLAGS environment variable]))
AC_ARG_WITH([extra_ldflags],
AS_HELP_STRING([--with-extra-ldflags=FLAGS],
[Additional linker flags, see also the STRINGI_LDFLAGS environment variable]))
AC_ARG_WITH([extra_libs],
AS_HELP_STRING([--with-extra-libs=FLAGS],
[Additional libraries to link against, see also the STRINGI_LIBS environment variable]))
AC_ARG_VAR([STRINGI_CFLAGS],
[Additional C compiler flags, see also --with-extra-cflags.])
AC_ARG_VAR([STRINGI_CPPFLAGS],
[Additional C/C++ preprocessor flags, see also --with-extra-cppflags.])
AC_ARG_VAR([STRINGI_CXXFLAGS],
[Additional C++ compiler flags, see also --with-extra-cxxflags.])
AC_ARG_VAR([STRINGI_LDFLAGS],
[Additional linker flags, see also --with-extra-ldflags.])
AC_ARG_VAR([STRINGI_LIBS],
[Additional libraries to link against, see also --with-extra-libs.])
with_extra_cflags="${with_extra_cflags} ${STRINGI_CFLAGS}"
with_extra_cppflags="${with_extra_cppflags} ${STRINGI_CPPFLAGS}"
with_extra_cxxflags="${with_extra_cxxflags} ${STRINGI_CXXFLAGS}"
with_extra_ldflags="${with_extra_ldflags} ${STRINGI_LDFLAGS}"
with_extra_libs="${with_extra_libs} ${STRINGI_LIBS}"
##### CHECK FOR R #############################################################
# this is inspired by the "Writing R Extensions" manual:
# determine R_HOME directory...
AC_MSG_CHECKING(for R_HOME)
if test -z "${R_HOME}"; then
R_HOME=`R RHOME` # set R_HOME if it has not been set already
fi
if test -z "${R_HOME}"; then
AC_MSG_RESULT(no)
echo "*** Could not determine R_HOME. Did you install R properly?"
exit 1
fi
AC_MSG_RESULT($R_HOME)
AC_SUBST(R_HOME)
# ...and then R_PATH
AC_MSG_CHECKING(for R)
R_PATH="${R_HOME}/bin/R" # see "Writing R Extensions"
if test ! -e "${R_PATH}"; then
# if it was determined by calling `R RHOME`, then this is likely a bug
AC_MSG_RESULT(no)
echo "*** Could not find R at R_HOME/bin/R, i.e., ${R_HOME}/bin/R"
exit 1
fi
AC_MSG_RESULT($R_PATH)
AC_MSG_CHECKING([for endianness])
"${R_PATH}" --vanilla --slave -e "if (.Platform\$endian!=\"little\") q(\"no\", 1, FALSE)"
if test $? -ne 0; then
ICUDT_ENDIANNESS="big"
AC_MSG_RESULT(big)
else
ICUDT_ENDIANNESS="little"
AC_MSG_RESULT(little)
fi
AC_MSG_CHECKING(for R >= 3.1.0 for C++11 use)
R_GE_31=`"${R_PATH}" --vanilla --slave -e 'cat(if (getRversion() >= numeric_version("3.1.0")) "yes" else "no")'`
if test "x$R_GE_31" = "xyes"; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
if test "x$enable_cxx11" = "xyes"; then
echo "*** disabling C++11 use"
enable_cxx11="no"
fi
fi
AC_MSG_CHECKING(for R < 3.4.0 for CXX1X flag use)
R_GE_34=`"${R_PATH}" --vanilla --slave -e 'cat(if (getRversion() >= numeric_version("3.4.0")) "yes" else "no")'`
if test "x$R_GE_34" = "xyes"; then
AC_MSG_RESULT([no])
STRINGI_CXX1X="CXX11"
else
AC_MSG_RESULT([yes])
STRINGI_CXX1X="CXX1X"
fi
##### CHECK FOR CAT ############################################################
# Check for 'cat' and get full path.
AC_PATH_PROG([CAT],[cat],[])
if test "x$CAT" = "x"; then
AC_MSG_NOTICE([==> cat command not found!])
AC_MSG_NOTICE([==> Set CAT variable if present in non-standard path])
fi
###### SETUP COMPILER FLAGS FOR TESTING ######################################
if test "x$enable_gcc_debug" = "xyes"; then
# -fsanitize=address -fno-omit-frame-pointer
with_extra_cppflags="${with_extra_cppflags} -DDEBUG -UNDEBUG"
else
with_extra_cppflags="${with_extra_cppflags} -UDEBUG -DNDEBUG"
fi
if test "x$enable_gcc_pedantic" = "xyes"; then
with_extra_cflags="${with_extra_cflags} -Wall -Wextra -pedantic"
with_extra_cxxflags="${with_extra_cxxflags} -Wall -Wextra -pedantic"
fi
if test -z "${ICUDT_DIR}"; then
ICUDT_DIR_FORCE="yes"
else
ICUDT_DIR_FORCE="no"
fi
disable_cxx11() {
echo "*** trying with disabled C++11 compiler"
enable_cxx11="no"
# unset cached C++ compiler features:
unset ac_cv_cxx_compiler_gnu
unset ac_cv_c_compiler_gnu
unset ac_cv_prog_cxx_g
unset ac_cv_prog_cc_g
unset ac_cv_prog_cc_c89
unset ac_cv_prog_CPP
unset ac_cv_prog_CXX
unset ac_cv_prog_CC
unset ac_cv_header_stdc
unset ac_cv_prog_ac_ct_CXX
unset ac_cv_prog_ac_ct_CC
unset ac_cv_cxx_namespaces
unset ac_cv_cxx_have_stl
unset ac_cv_objext
}
while true; do
# if C++11 support is enabled, we'll try it first;
# if it fails, we'll switch to C++98
# if this fails again, we'll stop right there
CC=`"${R_PATH}" CMD config CC`
#CPP=`"${R_PATH}" CMD config CXXCPP`
LD=`"${R_PATH}" CMD config SHLIB_CXXLD`
CFLAGS_base=`"${R_PATH}" CMD config CFLAGS`
CFLAGS_pic=`"${R_PATH}" CMD config CPICFLAGS`
CFLAGS="${CFLAGS_base} ${CFLAGS_pic}"
CPPFLAGS=`"${R_PATH}" CMD config CPPFLAGS`
LIBS=
LDFLAGS=
if test "x$enable_cxx11" = "xyes"; then
CXX_tmp1=`"${R_PATH}" CMD config ${STRINGI_CXX1X}`
CXX_tmp2=`"${R_PATH}" CMD config ${STRINGI_CXX1X}STD`
CXX="${CXX_tmp1} ${CXX_tmp2}"
CXXFLAGS_base=`"${R_PATH}" CMD config ${STRINGI_CXX1X}FLAGS`
CXXFLAGS_pic=`"${R_PATH}" CMD config ${STRINGI_CXX1X}PICFLAGS`
CXXFLAGS="${CXXFLAGS_base} ${CXXFLAGS_pic}"
STRINGI_CXXSTD="CXX_STD=CXX11"
ICU_BUNDLE_VERSION="61"
else
CXX=`"${R_PATH}" CMD config CXX`
CXXFLAGS_base=`"${R_PATH}" CMD config CXXFLAGS`
CXXFLAGS_pic=`"${R_PATH}" CMD config CXXPICFLAGS`
CXXFLAGS="${CXXFLAGS_base} ${CXXFLAGS_pic}"
STRINGI_CXXSTD=""
ICU_BUNDLE_VERSION="55"
fi
CFLAGS="${CFLAGS} ${with_extra_cflags}"
CXXFLAGS="${CXXFLAGS} ${with_extra_cxxflags}"
CPPFLAGS="${CPPFLAGS} ${with_extra_cppflags}"
LDFLAGS="${LDFLAGS} ${with_extra_ldflags}"
LIBS="${LIBS} ${with_extra_libs}"
# set ICUDT_DIR
AC_MSG_CHECKING(for local ICUDT_DIR)
if test "x$ICUDT_DIR_FORCE" = "xyes"; then
# Remember to update the configure.win file too
ICUDT_DIR="icu${ICU_BUNDLE_VERSION}/data"
fi
AC_MSG_RESULT($ICUDT_DIR)
AC_LANG(C)
AC_PROG_CC
AC_CHECK_HEADER([elf.h],
[
with_extra_cppflags="${with_extra_cppflags} -DU_HAVE_ELF_H"
])
##### Checking whether the C++ compiler supports the long long type and STL ####
check_cpp() {
AC_LANG(C++)
AC_PROG_CXX
AC_MSG_CHECKING(whether the C++ compiler supports the long long type)
AC_LINK_IFELSE([AC_LANG_SOURCE([
#include <iostream>
using namespace std;
int main() {
long long x = 1;
cout << x << endl;
cout << 1LL << 1ULL << endl;
cout << 9223372036854775807LL << 18446744073709551615ULL << endl;
return 0;
}])
],
[
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([no])
return 1
])
AC_CXX_HAVE_STL
if test "$ac_cv_cxx_have_stl" = not; then
return 1
fi
AC_MSG_CHECKING(whether std::map is available)
AC_LINK_IFELSE([AC_LANG_SOURCE([
#include <iostream>
#include <map>
#include <vector>
#include <utility>
int main() {
std::map< int, std::vector< int > > curmap;
std::vector<int> v1(10);
curmap.insert(std::pair< int, std::vector< int > >(100, v1));
std::cout << curmap.size() << std::endl;
return 0;
}])
],
[
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([no])
return 1
])
CPP_OK=1
return 0
}
CPP_OK=0
check_cpp
if test $CPP_OK = 0; then
if test "x$enable_cxx11" = "xyes"; then
disable_cxx11
continue
else
echo "*** stringi cannot be built. Check your compiler flags (Makeconf, Makevars, etc.)."
echo "*** also, verify your C++ compiler's abilities (long long, STL, etc. support)"
exit 1
fi
fi
##### CHECK FOR ICU4C ##########################################################
##### 1. Get settings from pkg-config or system
# Note that according to http://userguide.icu-project.org/howtouseicu,
# icu-config is supported, but no longer recommended for production use.
detect_icu_with_pkg_config() {
# Retrieve pkg-config's path
AC_PATH_PROG(PKG_CONFIG, pkg-config, no,
[$PATH:/usr/local/bin:/bin:/usr/bin:ext/bin:ext:/sw/bin:/opt/bin]) # auto-detect
if test ! -f "${PKG_CONFIG}"; then
echo "*** pkg-config could not be found"
return 1 # go back immediately
fi
# check if pkg-config knows about icu-i18n
AC_MSG_CHECKING(with pkg-config for the system ICU4C)
if ! `"${PKG_CONFIG}" --exists icu-i18n icu-uc`; then
# pkg config doesn't know about icu-i18n
AC_MSG_RESULT(no)
echo "*** pkg-config did not detect ICU4C-devel libraries installed"
return 1 # nothing more to do
fi
# check which version of ICU4C is installed
ICU_VERSION=`"${PKG_CONFIG}" --modversion icu-i18n`
AC_MSG_RESULT($ICU_VERSION)
# check for a suitable version
AC_MSG_CHECKING(for ICU4C >= $ICU_VERSION_NEEDED)
#VERSION_CHECK=`expr $ICU_VERSION ">=" $ICU_VERSION_NEEDED`
#if test "$VERSION_CHECK" != "1" ; then
if ! `"${PKG_CONFIG}" --atleast-version=${ICU_VERSION_NEEDED} icu-i18n icu-uc`; then
AC_MSG_RESULT(no)
echo "*** ICU4C ${ICU_VERSION} has been detected"
echo "*** Minimal requirements, i.e., ICU4C >= ${ICU_VERSION_NEEDED}, are not met"
return 1 # you may quit querying pkg-config here
fi
AC_MSG_RESULT(yes) # detected version of ICU4C is sufficient
export PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 # always provide system -L
AC_MSG_CHECKING([for additional required CPPFLAGS, LDFLAGS, and LIBS])
ICU_CPPFLAGS=`"${PKG_CONFIG}" --cflags icu-uc icu-i18n`
ICU_LDFLAGS=`"${PKG_CONFIG}" --libs-only-L icu-uc icu-i18n`
ICU_LIBS=`"${PKG_CONFIG}" --libs-only-l icu-uc icu-i18n`
AC_MSG_RESULT(done)
# It has been indicated that icu-config may return 32bit libs
# when 64bit libs are not available, even if we compile a 64bit version.
# Thus, we should then check if the current settings are valid anyway.
return 0
}
check_icu_with_pkg_config() {
CPPFLAGS="${CPPFLAGS} ${ICU_CPPFLAGS}"
LDFLAGS="${LDFLAGS} ${ICU_LDFLAGS}"
LIBS="${LIBS} ${ICU_LIBS}"
AC_LANG(C++)
AC_MSG_CHECKING([whether we may build an ICU4C-based project])
AC_LINK_IFELSE([AC_LANG_SOURCE([
#include <unicode/unistr.h>
#include <unicode/uvernum.h>
#include <unicode/ptypes.h>
#include <unicode/uchar.h>
#include <unicode/utypes.h>
#include <stdio.h>
using namespace icu;
int main() {
// base tests
UnicodeString x("abc");
x = x+x;
printf(U_ICU_VERSION);
return 0;
}])
],
[
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([no])
echo "*** The available ICU4C cannot be used"
return 1
])
AC_MSG_CHECKING([programmatically for sufficient U_ICU_VERSION_MAJOR_NUM])
AC_LINK_IFELSE([AC_LANG_SOURCE([
#include <unicode/uvernum.h>
#if U_ICU_VERSION_MAJOR_NUM < ${ICU_VERSION_NEEDED}
#error "insufficient U_ICU_VERSION_MAJOR_NUM"
#endif
int main() {
return 0;
}])
],
[
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([no])
echo "*** The available ICU4C cannot be used"
return 1
])
AC_MSG_CHECKING([programmatically if U_CHARSET_IS_UTF8 is defined and set])
AC_LINK_IFELSE([AC_LANG_SOURCE([
#include <unicode/unistr.h>
#include <unicode/uvernum.h>
#include <unicode/ptypes.h>
#include <unicode/uchar.h>
#include <unicode/utypes.h>
#include <unicode/utf8.h>
#include <unicode/utf16.h>
#include <unicode/ucnv.h>
int main() {
#ifdef U_CHARSET_IS_UTF8
#if U_CHARSET_IS_UTF8
#error "U_CHARSET_IS_UTF8 is defined and set"
return 10;
#endif
#endif
/* we additionally verify if ucnv_setDefaultName() has no effect */
ucnv_setDefaultName("ISO-8859-2");
const char* val = ucnv_getDefaultName();
if (*(val+0)=='U' &&
*(val+1)=='T' &&
*(val+2)=='F' &&
*(val+3)=='-' &&
*(val+4)=='8'
)
return 1; /* :( */
else
return 0; /* :) */
}])
],
[
# U_CHARSET_IS_UTF8 is not defined
AC_MSG_RESULT([no])
U_CHARSET_IS_UTF8=0
],[
# U_CHARSET_IS_UTF8 is defined
AC_MSG_RESULT([yes])
## issue#314: fail now:
#echo "*** The available ICU4C cannot be used"
#return 1
# issue#335: revert#314; allow U_CHARSET_IS_UTF8=1;
# but warn in stri_enc_set()
U_CHARSET_IS_UTF8=1
# => continue
])
AC_MSG_CHECKING([for available ICU data library (ucnv, uloc, utrans)])
AC_LINK_IFELSE([AC_LANG_SOURCE([
#include <unicode/unistr.h>
#include <unicode/uvernum.h>
#include <unicode/ptypes.h>
#include <unicode/uchar.h>
#include <unicode/utypes.h>
#include <unicode/ucnv.h>
#include <unicode/ustring.h>
#include <unicode/stringpiece.h>
#include <unicode/utf8.h>
#include <unicode/utf16.h>
#include <unicode/normalizer2.h>
#include <unicode/locid.h>
#include <unicode/uloc.h>
#include <unicode/regex.h>
#include <unicode/brkiter.h>
#include <unicode/coll.h>
#include <unicode/ucol.h>
#include <unicode/ucsdet.h>
#include <unicode/stsearch.h>
#include <unicode/ulocdata.h>
#include <unicode/usearch.h>
#include <unicode/uniset.h>
#include <stdio.h>
#include <unicode/translit.h>
#include <unicode/uclean.h>
using namespace icu;
int main() {
UErrorCode status = U_ZERO_ERROR;
u_init(&status);
if (U_FAILURE(status)) {
printf("ICU init failed: %s", u_errorName(status));
return 10;
}
// check if we have some converters installed (icudt)
int c = ucnv_countAvailable();
if (c <= 0)
return 11;
// check if we have some locales defined (icudt)
c = uloc_countAvailable();
if (c <= 0)
return 12;
status = U_ZERO_ERROR;
StringEnumeration* trans_enum = Transliterator::getAvailableIDs(status);
if (!U_SUCCESS(status)) return 13;
trans_enum->reset(status);
if (!U_SUCCESS(status)) return 14;
c = trans_enum->count(status);
if (!U_SUCCESS(status)) return 15;
if (c <= 0) return 16;
delete trans_enum;
return 0;
}])
],
[
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([no])
echo "*** The available ICU4C cannot be used"
return 1
])
AC_MSG_CHECKING([for available ICU data library (ucol)])
AC_LINK_IFELSE([AC_LANG_SOURCE([
#include <unicode/unistr.h>
#include <unicode/uvernum.h>
#include <unicode/ptypes.h>
#include <unicode/uchar.h>
#include <unicode/utypes.h>
#include <unicode/ucnv.h>
#include <unicode/ustring.h>
#include <unicode/stringpiece.h>
#include <unicode/utf8.h>
#include <unicode/utf16.h>
#include <unicode/normalizer2.h>
#include <unicode/locid.h>
#include <unicode/uloc.h>
#include <unicode/regex.h>
#include <unicode/brkiter.h>
#include <unicode/coll.h>
#include <unicode/ucol.h>
#include <unicode/ucsdet.h>
#include <unicode/stsearch.h>
#include <unicode/ulocdata.h>
#include <unicode/usearch.h>
#include <unicode/uniset.h>
#include <stdio.h>
using namespace icu;
int main() {
UnicodeString a = UnicodeString::fromUTF8("hladny");
UnicodeString b = UnicodeString::fromUTF8("chladny");
UErrorCode status = U_ZERO_ERROR;
Locale l = Locale::createFromName("sk_SK");
Collator* c = Collator::createInstance(l, status);
if (!U_SUCCESS(status)) return 1;
status = U_ZERO_ERROR;
if (UCOL_GREATER != c->compare(a, b, status))
return 2;
if (!U_SUCCESS(status)) return 3;
delete c;
return 0;
}])
],
[
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([no])
echo "*** The available ICU4C cannot be used"
return 1
])
ICU_FOUND=1 # DONE
return 0
}
ICU_FOUND=0
if test $ICU_FOUND = 0; then
if test $enable_pkg_config = "no"; then
# Use of pkg-config disabled, nothing to do
echo "*** The use of system ICU4C has been disabled."
else
OLD_CPPFLAGS=$CPPFLAGS
OLD_LDFLAGS=$LDFLAGS
OLD_LIBS=$LIBS
if ! detect_icu_with_pkg_config; then
echo "*** Trying with \"standard\" fallback flags"
# (#238, #220) trying "standard" fallback flags
ICU_CPPFLAGS=""
ICU_LDFLAGS=""
ICU_LIBS="-licui18n -licuuc -licudata"
fi
check_icu_with_pkg_config
CPPFLAGS=$OLD_CPPFLAGS
LDFLAGS=$OLD_LDFLAGS
LIBS=$OLD_LIBS
fi
fi
check_flags_icu_bundle() {
CPPFLAGS="${CPPFLAGS} -Isrc/ -Isrc/icu${ICU_BUNDLE_VERSION} -Isrc/icu${ICU_BUNDLE_VERSION}/unicode \
-Isrc/icu${ICU_BUNDLE_VERSION}/common -Isrc/icu${ICU_BUNDLE_VERSION}/i18n -DU_STATIC_IMPLEMENTATION \
-DU_COMMON_IMPLEMENTATION -DU_I18N_IMPLEMENTATION -D_REENTRANT" # don't use uconfig_local yet
# one way for dealing with the *Compiler or options invalid for pre-UNIX 03
# X/Open applications and pre-2001 POSIX applications* error on Solaris
# is to file a patch for sys/feature_tests.h. Unfortunately, the original
# file is copyrighted, so we have to cope with this error in another way:
# adding -D_XPG6 flag conditionally.
if test ${ICU_BUNDLE_VERSION} -le 60; then
# ICU 61 doesn't provide any .c files anymore
AC_LANG(C)
AC_MSG_CHECKING([whether we may compile src/icu${ICU_BUNDLE_VERSION}/common/umapfile.c])
AC_COMPILE_IFELSE([
AC_LANG_SOURCE([`${CAT} src/icu${ICU_BUNDLE_VERSION}/common/umapfile.c`])
],
[
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([no])
with_extra_cflags="${with_extra_cflags} -D_XPG6"
CFLAGS="${CFLAGS} -D_XPG6"
AC_MSG_CHECKING([whether we may compile src/icu${ICU_BUNDLE_VERSION}/common/umapfile.c with -D_XPG6])
AC_COMPILE_IFELSE([
AC_LANG_SOURCE([`${CAT} src/icu${ICU_BUNDLE_VERSION}/common/umapfile.c`])
],
[
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([no])
echo "*** The ICU bundle cannot be built. Upgrade your compiler flags."
if test "x$enable_cxx11" = "xyes"; then
disable_cxx11
continue
else
echo "*** stringi cannot be built. Check your compiler flags (Makeconf, Makevars, etc.)."
exit 1
fi
])
])
fi
AC_LANG(C++)
AC_MSG_CHECKING([whether we may compile src/icu${ICU_BUNDLE_VERSION}/common/putil.cpp])
AC_COMPILE_IFELSE([
AC_LANG_SOURCE([`${CAT} src/icu${ICU_BUNDLE_VERSION}/common/putil.cpp`])
],
[
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([no])
with_extra_cxxflags="${with_extra_cxxflags} -D_XPG6"
CXXFLAGS="${CXXFLAGS} -D_XPG6"
AC_MSG_CHECKING([whether we may compile src/icu${ICU_BUNDLE_VERSION}/common/putil.cpp with -D_XPG6])
AC_COMPILE_IFELSE([
AC_LANG_SOURCE([`${CAT} src/icu${ICU_BUNDLE_VERSION}/common/putil.cpp`])
],
[
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([no])
echo "*** The ICU4C bundle could not be built. Upgrade your compiler flags."
if test "x$enable_cxx11" = "xyes"; then
disable_cxx11
continue
else
echo "*** stringi cannot be built. Check your compiler flags (Makeconf, Makevars, etc.)."
exit 1
fi
])
])
if test ${ICU_BUNDLE_VERSION} -gt 60; then
AC_LANG(C++)
AC_MSG_CHECKING([whether we may compile src/icu${ICU_BUNDLE_VERSION}/i18n/number_affixutils.cpp])
AC_COMPILE_IFELSE([
AC_LANG_SOURCE([`${CAT} src/icu${ICU_BUNDLE_VERSION}/i18n/number_affixutils.cpp`])
],
[
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([no])
with_extra_cxxflags="${with_extra_cxxflags} -D_XPG6"
CXXFLAGS="${CXXFLAGS} -D_XPG6"
AC_MSG_CHECKING([whether we may compile src/icu${ICU_BUNDLE_VERSION}/i18n/number_affixutils.cpp with -D_XPG6])
AC_COMPILE_IFELSE([
AC_LANG_SOURCE([`${CAT} src/icu${ICU_BUNDLE_VERSION}/i18n/number_affixutils.cpp`])
],
[
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([no])
echo "*** The ICU4C bundle could not be built. Upgrade your compiler flags."
if test "x$enable_cxx11" = "xyes"; then
disable_cxx11
continue
else
echo "*** stringi cannot be built. Check your compiler flags (Makeconf, Makevars, etc.)."
exit 1
fi
])
])
fi
return 0
}
if test $ICU_FOUND = 0; then
if test $enable_icu_bundle = "no"; then
echo "*** Failed to configure package build with forced system ICU usage"
echo "*** Consider installing, e.g., libicu-devel (RHEL, Fedora) or libicu-dev (Debian, Ubuntu)"
echo "*** together with pkg-config"
if test "x$enable_cxx11" = "xyes"; then
disable_cxx11
continue
else
echo "*** stringi cannot be built. Check your compiler flags (Makeconf, Makevars, etc.)."
exit 1
fi
fi
OLD_CFLAGS=$CFLAGS
OLD_CXXFLAGS=$CXXFLAGS
OLD_CPPFLAGS=$CPPFLAGS
OLD_LIBS=$LIBS
check_flags_icu_bundle
CFLAGS=$OLD_CFLAGS
CXXFLAGS=$OLD_CXXFLAGS
CPPFLAGS=$OLD_CPPFLAGS
fi
break # once we're here, we're good to go
done # end while
###### DOWNLOAD ICUDT (IF NEEDED) ##############################################
if test $ICU_FOUND = 0; then
AC_MSG_CHECKING([whether we can fetch icudt])
"${R_PATH}" --vanilla --slave -e "setwd(\"src/\"); \
source(\"../R/install.R\"); \
if (identical(FALSE,stri_download_icudt(\"${ICUDT_DIR}\",${ICU_BUNDLE_VERSION}))) \
stop(\"Stopping on error\")"
if test $? -ne 0; then
echo "*** icudt download failed. stopping."
exit 1
fi
fi
##### PREPARE LIST OF SOURCE FILES #############################################
STRINGI_SOURCES_CPP=`${CAT} src/stri_cpp.txt`
AC_SUBST(STRINGI_SOURCES_CPP)
STRINGI_ICU_COMMON_SOURCES_CPP=`${CAT} src/icu${ICU_BUNDLE_VERSION}_common_cpp.txt`
AC_SUBST(STRINGI_ICU_COMMON_SOURCES_CPP)
STRINGI_ICU_COMMON_SOURCES_C=`${CAT} src/icu${ICU_BUNDLE_VERSION}_common_c.txt`
AC_SUBST(STRINGI_ICU_COMMON_SOURCES_C)
STRINGI_ICU_I18N_SOURCES_CPP=`${CAT} src/icu${ICU_BUNDLE_VERSION}_i18n_cpp.txt`
AC_SUBST(STRINGI_ICU_I18N_SOURCES_CPP)
STRINGI_ICU_I18N_SOURCES_C=`${CAT} src/icu${ICU_BUNDLE_VERSION}_i18n_c.txt`
AC_SUBST(STRINGI_ICU_I18N_SOURCES_C)
STRINGI_ICU_STUBDATA_SOURCES_CPP=`${CAT} src/icu${ICU_BUNDLE_VERSION}_stubdata_cpp.txt`
AC_SUBST(STRINGI_ICU_STUBDATA_SOURCES_CPP)
STRINGI_ICU_STUBDATA_SOURCES_C=`${CAT} src/icu${ICU_BUNDLE_VERSION}_stubdata_c.txt`
AC_SUBST(STRINGI_ICU_STUBDATA_SOURCES_C)
##### SETUP COMPILER 2 ###########################################################
if test $ICU_FOUND = 0; then
if test $enable_icu_bundle = "no"; then
echo "*** Failed to configure package build with forced system ICU usage"
echo "*** Consider installing, e.g., libicu-devel (RHEL, Fedora) or libicu-dev (Debian, Ubuntu)"
echo "*** together with pkg-config"
exit 1
fi
# build ICU4C from sources
STRINGI_OBJECTS="\$(STRI_OBJECTS) \$(ICU_COMMON_OBJECTS) \
\$(ICU_I18N_OBJECTS) \$(ICU_STUBDATA_OBJECTS)"
STRINGI_CFLAGS=""
STRINGI_CPPFLAGS="-I. -Iicu${ICU_BUNDLE_VERSION} \
-Iicu${ICU_BUNDLE_VERSION}/unicode -Iicu${ICU_BUNDLE_VERSION}/common \
-Iicu${ICU_BUNDLE_VERSION}/i18n -DU_STATIC_IMPLEMENTATION \
-DU_COMMON_IMPLEMENTATION -DU_I18N_IMPLEMENTATION -DUCONFIG_USE_LOCAL"
#-DU_HIDE_DRAFT_API -DU_HIDE_DEPRECATED_API"
STRINGI_CXXFLAGS=""
STRINGI_LDFLAGS=""
STRINGI_LIBS=""
else
# use system ICU4C
STRINGI_OBJECTS="\$(STRI_OBJECTS)"
STRINGI_CFLAGS=""
STRINGI_CPPFLAGS="-I. ${ICU_CPPFLAGS}"
STRINGI_CXXFLAGS=""
STRINGI_LDFLAGS="${ICU_LDFLAGS}"
STRINGI_LIBS="${ICU_LIBS}"
fi
with_extra_cflags="${with_extra_cflags} ${CFLAGS_pic}"
with_extra_cxxflags="${with_extra_cxxflags} ${CXXFLAGS_pic}"
STRINGI_CFLAGS="${STRINGI_CFLAGS} ${with_extra_cflags}"
STRINGI_CPPFLAGS="${STRINGI_CPPFLAGS} ${with_extra_cppflags}"
STRINGI_CXXFLAGS="${STRINGI_CXXFLAGS} ${with_extra_cxxflags}"
STRINGI_LDFLAGS="${STRINGI_LDFLAGS} ${with_extra_ldflags}"
STRINGI_LIBS="${STRINGI_LIBS} ${with_extra_libs}"
AC_SUBST(STRINGI_OBJECTS)
AC_SUBST(STRINGI_CXXSTD)
AC_SUBST(STRINGI_CXXFLAGS)
AC_SUBST(STRINGI_CPPFLAGS)
AC_SUBST(STRINGI_CFLAGS)
AC_SUBST(STRINGI_LDFLAGS)
AC_SUBST(STRINGI_LIBS)
AC_SUBST(ICU_FOUND)
AC_SUBST(ICUDT_DIR)
AC_SUBST(ICU_BUNDLE_VERSION)
AC_SUBST(ICUDT_ENDIANNESS)
# Remember also to update the configure.win file
AC_CONFIG_FILES([src/Makevars])
AC_CONFIG_FILES([src/uconfig_local.h])
AC_CONFIG_FILES([src/install.libs.R])
AC_OUTPUT
echo ""
echo "*** stringi configure summary:"
echo " ICU_FOUND=${ICU_FOUND}"
if test $ICU_FOUND = 0; then
echo " ICUDT_DIR=${ICUDT_DIR}"
echo " ICU_BUNDLE_VERSION=${ICU_BUNDLE_VERSION}"
echo " ICUDT_ENDIANNESS=${ICUDT_ENDIANNESS}"
fi
echo " STRINGI_CXXSTD=${STRINGI_CXXSTD}"
echo " STRINGI_CFLAGS=${STRINGI_CFLAGS}"
echo " STRINGI_CPPFLAGS=${STRINGI_CPPFLAGS}"
echo " STRINGI_CXXFLAGS=${STRINGI_CXXFLAGS}"
echo " STRINGI_LDFLAGS=${STRINGI_LDFLAGS}"
echo " STRINGI_LIBS=${STRINGI_LIBS}"
echo ""
echo "*** compiler settings used:"
echo " CC=${CC}"
#echo " CPP=${CPP}"
echo " LD=${LD}"
echo " CFLAGS=${CFLAGS}"
echo " CPPFLAGS=${CPPFLAGS}"
echo " CXX=${CXX}"
echo " CXXFLAGS=${CXXFLAGS}"
echo " LDFLAGS=${LDFLAGS}"
echo " LIBS=${LIBS}"
echo ""
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...