Merge pull request #6 from drvink/recent-ghc

Fixes for GHC 8.x, archive loading, -dynamic, and file generation
This commit is contained in:
Jeremy Shaw 2018-01-22 22:34:40 -06:00 committed by GitHub
commit 98892b0fa3
18 changed files with 468 additions and 226 deletions

View File

@ -30,6 +30,9 @@
/* Define to the one symbol short name of this package. */ /* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME #undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
/* Define to the version of this package. */ /* Define to the version of this package. */
#undef PACKAGE_VERSION #undef PACKAGE_VERSION

274
configure vendored Normal file → Executable file
View File

@ -1,11 +1,9 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.67. # Generated by GNU Autoconf 2.69.
# #
# #
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
# Foundation, Inc.
# #
# #
# This configure script is free software; the Free Software Foundation # This configure script is free software; the Free Software Foundation
@ -89,6 +87,7 @@ fi
IFS=" "" $as_nl" IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator. # Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #(( case $0 in #((
*[\\/]* ) as_myself=$0 ;; *[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@ -133,6 +132,31 @@ export LANGUAGE
# CDPATH. # CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# Use a proper internal environment variable to ensure we don't fall
# into an infinite loop, continuously re-executing ourselves.
if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
_as_can_reexec=no; export _as_can_reexec;
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
# Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
case $- in # ((((
*v*x* | *x*v* ) as_opts=-vx ;;
*v* ) as_opts=-v ;;
*x* ) as_opts=-x ;;
* ) as_opts= ;;
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
as_fn_exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then if test "x$CONFIG_SHELL" = x; then
as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
emulate sh emulate sh
@ -166,7 +190,8 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
else else
exitcode=1; echo positional parameters were not saved. exitcode=1; echo positional parameters were not saved.
fi fi
test x\$exitcode = x0 || exit 1" test x\$exitcode = x0 || exit 1
test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
@ -210,14 +235,25 @@ IFS=$as_save_IFS
if test "x$CONFIG_SHELL" != x; then : if test "x$CONFIG_SHELL" != x; then :
export CONFIG_SHELL
# We cannot yet assume a decent shell, so we have to provide a # We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also # neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables. # works around shells that cannot unset nonexistent variables.
# Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null BASH_ENV=/dev/null
ENV=/dev/null ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
export CONFIG_SHELL case $- in # ((((
exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} *v*x* | *x*v* ) as_opts=-vx ;;
*v* ) as_opts=-v ;;
*x* ) as_opts=-x ;;
* ) as_opts= ;;
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi fi
if test x$as_have_required = xno; then : if test x$as_have_required = xno; then :
@ -319,6 +355,14 @@ $as_echo X"$as_dir" |
} # as_fn_mkdir_p } # as_fn_mkdir_p
# as_fn_executable_p FILE
# -----------------------
# Test if FILE is an executable regular file.
as_fn_executable_p ()
{
test -f "$1" && test -x "$1"
} # as_fn_executable_p
# as_fn_append VAR VALUE # as_fn_append VAR VALUE
# ---------------------- # ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take # Append the text in VALUE to the end of the definition contained in VAR. Take
@ -440,6 +484,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
chmod +x "$as_me.lineno" || chmod +x "$as_me.lineno" ||
{ $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# If we had to re-execute with $CONFIG_SHELL, we're ensured to have
# already done that, so ensure we don't try to do so again and fall
# in an infinite loop. This has already happened in practice.
_as_can_reexec=no; export _as_can_reexec
# Don't try to exec as it changes $[0], causing all sort of problems # Don't try to exec as it changes $[0], causing all sort of problems
# (the dirname of $[0] is not the place where we might find the # (the dirname of $[0] is not the place where we might find the
# original and so on. Autoconf is especially sensitive to this). # original and so on. Autoconf is especially sensitive to this).
@ -474,16 +522,16 @@ if (echo >conf$$.file) 2>/dev/null; then
# ... but there are two gotchas: # ... but there are two gotchas:
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
# In both cases, we have to default to `cp -p'. # In both cases, we have to default to `cp -pR'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
as_ln_s='cp -p' as_ln_s='cp -pR'
elif ln conf$$.file conf$$ 2>/dev/null; then elif ln conf$$.file conf$$ 2>/dev/null; then
as_ln_s=ln as_ln_s=ln
else else
as_ln_s='cp -p' as_ln_s='cp -pR'
fi fi
else else
as_ln_s='cp -p' as_ln_s='cp -pR'
fi fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null rmdir conf$$.dir 2>/dev/null
@ -495,28 +543,8 @@ else
as_mkdir_p=false as_mkdir_p=false
fi fi
if test -x / >/dev/null 2>&1; then
as_test_x='test -x' as_test_x='test -x'
else as_executable_p=as_fn_executable_p
if ls -dL / >/dev/null 2>&1; then
as_ls_L_option=L
else
as_ls_L_option=
fi
as_test_x='
eval sh -c '\''
if test -d "$1"; then
test -d "$1/.";
else
case $1 in #(
-*)set "./$1";;
esac;
case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
???[sx]*):;;*)false;;esac;fi
'\'' sh
'
fi
as_executable_p=$as_test_x
# Sed expression to map a string onto a valid CPP name. # Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@ -1032,7 +1060,7 @@ Try \`$0 --help' for more information"
$as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
$as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
: ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;; ;;
esac esac
@ -1083,8 +1111,6 @@ target=$target_alias
if test "x$host_alias" != x; then if test "x$host_alias" != x; then
if test "x$build_alias" = x; then if test "x$build_alias" = x; then
cross_compiling=maybe cross_compiling=maybe
$as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
If a cross compiler is detected then cross compile mode will be used" >&2
elif test "x$build_alias" != "x$host_alias"; then elif test "x$build_alias" != "x$host_alias"; then
cross_compiling=yes cross_compiling=yes
fi fi
@ -1324,9 +1350,9 @@ test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
configure configure
generated by GNU Autoconf 2.67 generated by GNU Autoconf 2.69
Copyright (C) 2010 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it. gives unlimited permission to copy, distribute and modify it.
_ACEOF _ACEOF
@ -1370,7 +1396,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1 ac_retval=1
fi fi
eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval as_fn_set_status $ac_retval
} # ac_fn_c_try_compile } # ac_fn_c_try_compile
@ -1402,7 +1428,7 @@ $as_echo "$ac_try_echo"; } >&5
test ! -s conftest.err test ! -s conftest.err
} && test -s conftest$ac_exeext && { } && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes || test "$cross_compiling" = yes ||
$as_test_x conftest$ac_exeext test -x conftest$ac_exeext
}; then : }; then :
ac_retval=0 ac_retval=0
else else
@ -1416,7 +1442,7 @@ fi
# interfere with the next link command; also delete a directory that is # interfere with the next link command; also delete a directory that is
# left behind by Apple's compiler. We do this before executing the actions. # left behind by Apple's compiler. We do this before executing the actions.
rm -rf conftest.dSYM conftest_ipa8_conftest.oo rm -rf conftest.dSYM conftest_ipa8_conftest.oo
eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval as_fn_set_status $ac_retval
} # ac_fn_c_try_link } # ac_fn_c_try_link
@ -1429,7 +1455,7 @@ ac_fn_c_check_func ()
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; } $as_echo_n "checking for $2... " >&6; }
if eval "test \"\${$3+set}\"" = set; then : if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@ -1484,7 +1510,7 @@ fi
eval ac_res=\$$3 eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; } $as_echo "$ac_res" >&6; }
eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_func } # ac_fn_c_check_func
cat >config.log <<_ACEOF cat >config.log <<_ACEOF
@ -1492,7 +1518,7 @@ This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by $as_me, which was It was created by $as_me, which was
generated by GNU Autoconf 2.67. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@ -1883,7 +1909,7 @@ $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
$as_echo_n "checking build system type... " >&6; } $as_echo_n "checking build system type... " >&6; }
if test "${ac_cv_build+set}" = set; then : if ${ac_cv_build+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
ac_build_alias=$build_alias ac_build_alias=$build_alias
@ -1996,7 +2022,7 @@ else
set dummy ghc; ac_word=$2 set dummy ghc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; } $as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_GHC+set}" = set; then : if ${ac_cv_prog_GHC+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
if test -n "$GHC"; then if test -n "$GHC"; then
@ -2008,7 +2034,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_GHC="ghc" ac_cv_prog_GHC="ghc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -2119,7 +2145,7 @@ if test -n "$ac_tool_prefix"; then
set dummy ${ac_tool_prefix}gcc; ac_word=$2 set dummy ${ac_tool_prefix}gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; } $as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_CC+set}" = set; then : if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
if test -n "$CC"; then if test -n "$CC"; then
@ -2131,7 +2157,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc" ac_cv_prog_CC="${ac_tool_prefix}gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -2159,7 +2185,7 @@ if test -z "$ac_cv_prog_CC"; then
set dummy gcc; ac_word=$2 set dummy gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; } $as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : if ${ac_cv_prog_ac_ct_CC+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
if test -n "$ac_ct_CC"; then if test -n "$ac_ct_CC"; then
@ -2171,7 +2197,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc" ac_cv_prog_ac_ct_CC="gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -2212,7 +2238,7 @@ if test -z "$CC"; then
set dummy ${ac_tool_prefix}cc; ac_word=$2 set dummy ${ac_tool_prefix}cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; } $as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_CC+set}" = set; then : if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
if test -n "$CC"; then if test -n "$CC"; then
@ -2224,7 +2250,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc" ac_cv_prog_CC="${ac_tool_prefix}cc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -2252,7 +2278,7 @@ if test -z "$CC"; then
set dummy cc; ac_word=$2 set dummy cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; } $as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_CC+set}" = set; then : if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
if test -n "$CC"; then if test -n "$CC"; then
@ -2265,7 +2291,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes ac_prog_rejected=yes
continue continue
@ -2311,7 +2337,7 @@ if test -z "$CC"; then
set dummy $ac_tool_prefix$ac_prog; ac_word=$2 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; } $as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_CC+set}" = set; then : if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
if test -n "$CC"; then if test -n "$CC"; then
@ -2323,7 +2349,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog" ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -2355,7 +2381,7 @@ do
set dummy $ac_prog; ac_word=$2 set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; } $as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : if ${ac_cv_prog_ac_ct_CC+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
if test -n "$ac_ct_CC"; then if test -n "$ac_ct_CC"; then
@ -2367,7 +2393,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog" ac_cv_prog_ac_ct_CC="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -2638,7 +2664,7 @@ rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
$as_echo_n "checking for suffix of object files... " >&6; } $as_echo_n "checking for suffix of object files... " >&6; }
if test "${ac_cv_objext+set}" = set; then : if ${ac_cv_objext+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@ -2689,7 +2715,7 @@ OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT ac_objext=$OBJEXT
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
if test "${ac_cv_c_compiler_gnu+set}" = set; then : if ${ac_cv_c_compiler_gnu+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@ -2726,7 +2752,7 @@ ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS ac_save_CFLAGS=$CFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
$as_echo_n "checking whether $CC accepts -g... " >&6; } $as_echo_n "checking whether $CC accepts -g... " >&6; }
if test "${ac_cv_prog_cc_g+set}" = set; then : if ${ac_cv_prog_cc_g+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
ac_save_c_werror_flag=$ac_c_werror_flag ac_save_c_werror_flag=$ac_c_werror_flag
@ -2804,7 +2830,7 @@ else
fi fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
if test "${ac_cv_prog_cc_c89+set}" = set; then : if ${ac_cv_prog_cc_c89+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
ac_cv_prog_cc_c89=no ac_cv_prog_cc_c89=no
@ -2813,8 +2839,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */ /* end confdefs.h. */
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <sys/types.h> struct stat;
#include <sys/stat.h>
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
struct buf { int x; }; struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int); FILE * (*rcsopen) (struct buf *, struct stat *, int);
@ -2903,7 +2928,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
for ac_func in arc4random for ac_func in arc4random
do : do :
ac_fn_c_check_func "$LINENO" "arc4random" "ac_cv_func_arc4random" ac_fn_c_check_func "$LINENO" "arc4random" "ac_cv_func_arc4random"
if test "x$ac_cv_func_arc4random" = x""yes; then : if test "x$ac_cv_func_arc4random" = xyes; then :
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
#define HAVE_ARC4RANDOM 1 #define HAVE_ARC4RANDOM 1
_ACEOF _ACEOF
@ -2929,7 +2954,7 @@ done
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
$as_echo_n "checking for a BSD-compatible install... " >&6; } $as_echo_n "checking for a BSD-compatible install... " >&6; }
if test -z "$INSTALL"; then if test -z "$INSTALL"; then
if test "${ac_cv_path_install+set}" = set; then : if ${ac_cv_path_install+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@ -2949,7 +2974,7 @@ case $as_dir/ in #((
# by default. # by default.
for ac_prog in ginstall scoinst install; do for ac_prog in ginstall scoinst install; do
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
if test $ac_prog = install && if test $ac_prog = install &&
grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# AIX install. It has an incompatible calling convention. # AIX install. It has an incompatible calling convention.
@ -3073,10 +3098,21 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
:end' >>confcache :end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then if test -w "$cache_file"; then
test "x$cache_file" != "x/dev/null" && if test "x$cache_file" != "x/dev/null"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
$as_echo "$as_me: updating cache $cache_file" >&6;} $as_echo "$as_me: updating cache $cache_file" >&6;}
cat confcache >$cache_file if test ! -f "$cache_file" || test -h "$cache_file"; then
cat confcache >"$cache_file"
else
case $cache_file in #(
*/* | ?:*)
mv -f confcache "$cache_file"$$ &&
mv -f "$cache_file"$$ "$cache_file" ;; #(
*)
mv -f confcache "$cache_file" ;;
esac
fi
fi
else else
{ $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
@ -3108,7 +3144,7 @@ LTLIBOBJS=$ac_ltlibobjs
: ${CONFIG_STATUS=./config.status} : "${CONFIG_STATUS=./config.status}"
ac_write_fail=0 ac_write_fail=0
ac_clean_files_save=$ac_clean_files ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS" ac_clean_files="$ac_clean_files $CONFIG_STATUS"
@ -3209,6 +3245,7 @@ fi
IFS=" "" $as_nl" IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator. # Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #(( case $0 in #((
*[\\/]* ) as_myself=$0 ;; *[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@ -3404,16 +3441,16 @@ if (echo >conf$$.file) 2>/dev/null; then
# ... but there are two gotchas: # ... but there are two gotchas:
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
# In both cases, we have to default to `cp -p'. # In both cases, we have to default to `cp -pR'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
as_ln_s='cp -p' as_ln_s='cp -pR'
elif ln conf$$.file conf$$ 2>/dev/null; then elif ln conf$$.file conf$$ 2>/dev/null; then
as_ln_s=ln as_ln_s=ln
else else
as_ln_s='cp -p' as_ln_s='cp -pR'
fi fi
else else
as_ln_s='cp -p' as_ln_s='cp -pR'
fi fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null rmdir conf$$.dir 2>/dev/null
@ -3473,28 +3510,16 @@ else
as_mkdir_p=false as_mkdir_p=false
fi fi
if test -x / >/dev/null 2>&1; then
# as_fn_executable_p FILE
# -----------------------
# Test if FILE is an executable regular file.
as_fn_executable_p ()
{
test -f "$1" && test -x "$1"
} # as_fn_executable_p
as_test_x='test -x' as_test_x='test -x'
else as_executable_p=as_fn_executable_p
if ls -dL / >/dev/null 2>&1; then
as_ls_L_option=L
else
as_ls_L_option=
fi
as_test_x='
eval sh -c '\''
if test -d "$1"; then
test -d "$1/.";
else
case $1 in #(
-*)set "./$1";;
esac;
case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
???[sx]*):;;*)false;;esac;fi
'\'' sh
'
fi
as_executable_p=$as_test_x
# Sed expression to map a string onto a valid CPP name. # Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@ -3516,7 +3541,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by $as_me, which was This file was extended by $as_me, which was
generated by GNU Autoconf 2.67. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_HEADERS = $CONFIG_HEADERS
@ -3578,10 +3603,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
config.status config.status
configured by $0, generated by GNU Autoconf 2.67, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"
Copyright (C) 2010 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it." gives unlimited permission to copy, distribute and modify it."
@ -3670,7 +3695,7 @@ fi
_ACEOF _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then if \$ac_cs_recheck; then
set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift shift
\$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL' CONFIG_SHELL='$SHELL'
@ -3726,9 +3751,10 @@ fi
# after its creation but before its name has been assigned to `$tmp'. # after its creation but before its name has been assigned to `$tmp'.
$debug || $debug ||
{ {
tmp= tmp= ac_tmp=
trap 'exit_status=$? trap 'exit_status=$?
{ test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status : "${ac_tmp:=$tmp}"
{ test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
' 0 ' 0
trap 'as_fn_exit 1' 1 2 13 15 trap 'as_fn_exit 1' 1 2 13 15
} }
@ -3736,12 +3762,13 @@ $debug ||
{ {
tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
test -n "$tmp" && test -d "$tmp" test -d "$tmp"
} || } ||
{ {
tmp=./conf$$-$RANDOM tmp=./conf$$-$RANDOM
(umask 077 && mkdir "$tmp") (umask 077 && mkdir "$tmp")
} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
ac_tmp=$tmp
# Set up the scripts for CONFIG_FILES section. # Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES. # No need to generate them if there are no CONFIG_FILES.
@ -3763,7 +3790,7 @@ else
ac_cs_awk_cr=$ac_cr ac_cs_awk_cr=$ac_cr
fi fi
echo 'BEGIN {' >"$tmp/subs1.awk" && echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
_ACEOF _ACEOF
@ -3791,7 +3818,7 @@ done
rm -f conf$$subs.sh rm -f conf$$subs.sh
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
cat >>"\$tmp/subs1.awk" <<\\_ACAWK && cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
_ACEOF _ACEOF
sed -n ' sed -n '
h h
@ -3839,7 +3866,7 @@ t delim
rm -f conf$$subs.awk rm -f conf$$subs.awk
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACAWK _ACAWK
cat >>"\$tmp/subs1.awk" <<_ACAWK && cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
for (key in S) S_is_set[key] = 1 for (key in S) S_is_set[key] = 1
FS = "" FS = ""
@ -3871,7 +3898,7 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
else else
cat cat
fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
|| as_fn_error $? "could not setup config files machinery" "$LINENO" 5 || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
_ACEOF _ACEOF
@ -3905,7 +3932,7 @@ fi # test -n "$CONFIG_FILES"
# No need to generate them if there are no CONFIG_HEADERS. # No need to generate them if there are no CONFIG_HEADERS.
# This happens for instance with `./config.status Makefile'. # This happens for instance with `./config.status Makefile'.
if test -n "$CONFIG_HEADERS"; then if test -n "$CONFIG_HEADERS"; then
cat >"$tmp/defines.awk" <<\_ACAWK || cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
BEGIN { BEGIN {
_ACEOF _ACEOF
@ -3917,8 +3944,8 @@ _ACEOF
# handling of long lines. # handling of long lines.
ac_delim='%!_!# ' ac_delim='%!_!# '
for ac_last_try in false false :; do for ac_last_try in false false :; do
ac_t=`sed -n "/$ac_delim/p" confdefs.h` ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
if test -z "$ac_t"; then if test -z "$ac_tt"; then
break break
elif $ac_last_try; then elif $ac_last_try; then
as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
@ -4038,7 +4065,7 @@ do
for ac_f for ac_f
do do
case $ac_f in case $ac_f in
-) ac_f="$tmp/stdin";; -) ac_f="$ac_tmp/stdin";;
*) # Look for the file first in the build tree, then in the source tree *) # Look for the file first in the build tree, then in the source tree
# (if the path is not absolute). The absolute path cannot be DOS-style, # (if the path is not absolute). The absolute path cannot be DOS-style,
# because $ac_f cannot contain `:'. # because $ac_f cannot contain `:'.
@ -4073,7 +4100,7 @@ $as_echo "$as_me: creating $ac_file" >&6;}
esac esac
case $ac_tag in case $ac_tag in
*:-:* | *:-) cat >"$tmp/stdin" \ *:-:* | *:-) cat >"$ac_tmp/stdin" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
esac esac
;; ;;
@ -4204,21 +4231,22 @@ s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
s&@INSTALL@&$ac_INSTALL&;t t s&@INSTALL@&$ac_INSTALL&;t t
$ac_datarootdir_hack $ac_datarootdir_hack
" "
eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5 >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5 which seems to be undefined. Please make sure it is defined" >&5
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;} which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$tmp/stdin" rm -f "$ac_tmp/stdin"
case $ac_file in case $ac_file in
-) cat "$tmp/out" && rm -f "$tmp/out";; -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
*) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
esac \ esac \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5 || as_fn_error $? "could not create $ac_file" "$LINENO" 5
;; ;;
@ -4229,20 +4257,20 @@ which seems to be undefined. Please make sure it is defined" >&2;}
if test x"$ac_file" != x-; then if test x"$ac_file" != x-; then
{ {
$as_echo "/* $configure_input */" \ $as_echo "/* $configure_input */" \
&& eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
} >"$tmp/config.h" \ } >"$ac_tmp/config.h" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5 || as_fn_error $? "could not create $ac_file" "$LINENO" 5
if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
$as_echo "$as_me: $ac_file is unchanged" >&6;} $as_echo "$as_me: $ac_file is unchanged" >&6;}
else else
rm -f "$ac_file" rm -f "$ac_file"
mv "$tmp/config.h" "$ac_file" \ mv "$ac_tmp/config.h" "$ac_file" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5 || as_fn_error $? "could not create $ac_file" "$LINENO" 5
fi fi
else else
$as_echo "/* $configure_input */" \ $as_echo "/* $configure_input */" \
&& eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
|| as_fn_error $? "could not create -" "$LINENO" 5 || as_fn_error $? "could not create -" "$LINENO" 5
fi fi
;; ;;

View File

@ -25,6 +25,7 @@ Tested-with: GHC == 7.4.*
, GHC == 7.8.* , GHC == 7.8.*
, GHC == 7.10.* , GHC == 7.10.*
, GHC == 8.0.* , GHC == 8.0.*
, GHC == 8.2.*
extra-source-files: config.guess, config.h.in, config.mk.in, config.sub, extra-source-files: config.guess, config.h.in, config.mk.in, config.sub,
configure, configure.ac, install.sh, Makefile, configure, configure.ac, install.sh, Makefile,
testsuite/makewith/io/TestIO.conf.in, testsuite/makewith/io/TestIO.conf.in,

View File

@ -239,7 +239,7 @@ dynwrap expr nm mods =
x = ident () x = ident ()
ident () = unsafePerformIO $ ident () = unsafePerformIO $
sequence (take 3 (repeat $ getStdRandom (randomR (97,122)) >>= return . chr)) sequence (Prelude.take 3 (repeat $ getStdRandom (randomR (97,122)) >>= return . chr))
-- --------------------------------------------------------------------- -- ---------------------------------------------------------------------
-- unsafe wrapper -- unsafe wrapper

View File

@ -43,8 +43,8 @@ sysPkgConf = "package.conf"
-- | This code is from runtime_loader: -- | This code is from runtime_loader:
-- The extension used by system modules. -- The extension used by system modules.
sysPkgSuffix = ".o" sysPkgSuffix = ".a"
objSuf = sysPkgSuffix objSuf = ".o"
hiSuf = ".hi" hiSuf = ".hi"
hsSuf = ".hs" hsSuf = ".hs"
#if defined(CYGWIN) || defined(__MINGW32__) #if defined(CYGWIN) || defined(__MINGW32__)

View File

@ -43,6 +43,7 @@ module System.Plugins.Env (
union, union,
addStaticPkg, addStaticPkg,
isStaticPkg, isStaticPkg,
rmStaticPkg,
grabDefaultPkgConf, grabDefaultPkgConf,
readPackageConf, readPackageConf,
lookupPkg lookupPkg
@ -69,7 +70,19 @@ import System.IO.Error ( catch, ioError, isDoesNotExistError )
import Control.Concurrent.MVar ( MVar(), newMVar, withMVar ) import Control.Concurrent.MVar ( MVar(), newMVar, withMVar )
import Distribution.Package hiding (depends, packageName, PackageName(..) import GHC.Paths (libdir)
import DynFlags (
#if MIN_VERSION_ghc(7,8,0)
Way(WayDyn), dynamicGhc, ways,
#endif
defaultDynFlags, initDynFlags)
import SysTools (initSysTools)
import Distribution.Package hiding (
#if MIN_VERSION_ghc(7,6,0)
Module,
#endif
depends, packageName, PackageName(..)
#if MIN_VERSION_ghc(7,10,0) #if MIN_VERSION_ghc(7,10,0)
, installedPackageId , installedPackageId
#endif #endif
@ -358,6 +371,12 @@ addStaticPkg pkg = modifyStaticPkgEnv env $ \set -> return $ S.insert pkg set
isStaticPkg :: PackageName -> IO Bool isStaticPkg :: PackageName -> IO Bool
isStaticPkg pkg = withStaticPkgEnv env $ \set -> return $ S.member pkg set isStaticPkg pkg = withStaticPkgEnv env $ \set -> return $ S.member pkg set
rmStaticPkg :: String -> IO Bool
rmStaticPkg pkg = do
(willRemove, s) <- withStaticPkgEnv env $ \s -> return (S.member pkg s, s)
if not willRemove then return False
else do modifyStaticPkgEnv env $ \s' -> return $ S.delete pkg s'
return True
-- --
-- Package path, given a package name, look it up in the environment and -- Package path, given a package name, look it up in the environment and
-- return the path to all the libraries needed to load this package. -- return the path to all the libraries needed to load this package.
@ -382,7 +401,9 @@ lookupPkg pn = go [] pn
go :: [PackageName] -> PackageName -> IO ([FilePath],[FilePath]) go :: [PackageName] -> PackageName -> IO ([FilePath],[FilePath])
go seen p = do go seen p = do
(ps, (f, g)) <- lookupPkg' p (ps, (f, g)) <- lookupPkg' p
static <- isStaticPkg p static <- if not (null f) && null g
then addStaticPkg p >> return True
else isStaticPkg p
(f', g') <- liftM unzip $ mapM (go (nub $ seen ++ ps)) (ps \\ seen) (f', g') <- liftM unzip $ mapM (go (nub $ seen ++ ps)) (ps \\ seen)
return $ (nub $ (concat f') ++ f, if static then [] else nub $ (concat g') ++ g) return $ (nub $ (concat f') ++ f, if static then [] else nub $ (concat g') ++ g)
@ -444,7 +465,16 @@ lookupPkg' p = withPkgEnvs env $ \fms -> go fms p
#endif #endif
-- If we're loading dynamic libs we need the cbits to appear before the -- If we're loading dynamic libs we need the cbits to appear before the
-- real packages. -- real packages.
libs <- mapM (findHSlib libdirs) (cbits ++ hslibs) settings <- initSysTools (Just libdir)
dflags <- initDynFlags $ defaultDynFlags settings
libs <- mapM (findHSlib
#if MIN_VERSION_ghc(7,8,0)
(WayDyn `elem` ways dflags || dynamicGhc)
#else
False
#endif
libdirs)
(cbits ++ hslibs)
#if defined(CYGWIN) || defined(__MINGW32__) #if defined(CYGWIN) || defined(__MINGW32__)
windowsos <- catch (getEnv "OS") windowsos <- catch (getEnv "OS")
(\e -> if isDoesNotExistError e then return "Windows_98" else ioError e) (\e -> if isDoesNotExistError e then return "Windows_98" else ioError e)
@ -490,23 +520,24 @@ lookupPkg' p = withPkgEnvs env $ \fms -> go fms p
if b then return $ Just l -- found it! if b then return $ Just l -- found it!
else findHSlib' dirs lib else findHSlib' dirs lib
findHSslib dirs lib = findHSlib' dirs $ lib ++ sysPkgSuffix findHSslib dirs lib = findHSlib' dirs $ "lib" ++ lib ++ sysPkgSuffix
findHSdlib dirs lib = findHSlib' dirs $ mkDynPkgName lib findHSdlib dirs lib = findHSlib' dirs $ mkDynPkgName lib
-- Problem: sysPkgSuffix is ".o", but extra libraries could be findHSlib :: Bool -> [FilePath] -> String -> IO (Either String HSLib)
-- ".so" findHSlib dynonly dirs lib = do
-- Solution: first look for static library, if we don't find it -- Problem: sysPkgSuffix is ".a", but system packages could be dynamic, and
-- look for a dynamic version. -- extra dynamic libraries could be needed even when using normal (static) linkage.
findHSlib :: [FilePath] -> String -> IO (Either String HSLib) -- Solution: look for dynamic libraries only if using -dynamic; otherwise, use static
findHSlib dirs lib = do -- and add any other dynamic libraries found.
static <- findHSslib dirs lib dl <- findHSdlib dirs lib
case static of let rdl = case dl of
Just file -> return $ Right $ Static file Just file -> Right $ Dynamic file
Nothing -> do Nothing -> Left lib
dynamic <- findHSdlib dirs lib if dynonly then return rdl else do
case dynamic of rsl <- findHSslib dirs lib
Just file -> return $ Right $ Dynamic file return $ case rsl of
Nothing -> return $ Left lib Just file -> Right $ Static file
Nothing -> rdl
findDLL :: [FilePath] -> String -> IO (Either String FilePath) findDLL :: [FilePath] -> String -> IO (Either String FilePath)
findDLL [] lib = return (Left lib) findDLL [] lib = return (Left lib)

View File

@ -70,12 +70,17 @@ import System.Plugins.Consts ( sysPkgSuffix, hiSuf, prefixUnderscore )
import System.Plugins.LoadTypes import System.Plugins.LoadTypes
-- import Language.Hi.Parser -- import Language.Hi.Parser
import Encoding (zEncodeString)
import BinIface import BinIface
import HscTypes import HscTypes
import Module (moduleName, moduleNameString) import Module (moduleName, moduleNameString)
#if MIN_VERSION_ghc(8,0,0) #if MIN_VERSION_ghc(8,0,0)
#if MIN_VERSION_Cabal(2,0,0)
import Module (installedUnitIdString)
#else
import Module (unitIdString) import Module (unitIdString)
#endif
#elif MIN_VERSION_ghc(7,10,0) #elif MIN_VERSION_ghc(7,10,0)
import Module (packageKeyString) import Module (packageKeyString)
#else #else
@ -91,6 +96,7 @@ import Data.Typeable ( Typeable )
import Data.List ( isSuffixOf, nub, nubBy ) import Data.List ( isSuffixOf, nub, nubBy )
import Control.Monad ( when, filterM, liftM ) import Control.Monad ( when, filterM, liftM )
import System.Directory ( doesFileExist, removeFile ) import System.Directory ( doesFileExist, removeFile )
import Foreign.C ( CInt(..) )
import Foreign.C.String ( CString, withCString, peekCString ) import Foreign.C.String ( CString, withCString, peekCString )
#if !MIN_VERSION_ghc(7,2,0) #if !MIN_VERSION_ghc(7,2,0)
@ -173,7 +179,7 @@ load :: FilePath -- ^ object file
-> IO (LoadStatus a) -> IO (LoadStatus a)
load obj incpaths pkgconfs sym = do load obj incpaths pkgconfs sym = do
initLinker initLinker_ $ fromIntegral 0
-- load extra package information -- load extra package information
mapM_ addPkgConf pkgconfs mapM_ addPkgConf pkgconfs
@ -443,7 +449,8 @@ reload m@(Module{path = p, iface = hi}) sym = do
-- | Call the initLinker function first, before calling any of the other -- | Call the initLinker function first, before calling any of the other
-- functions in this module - otherwise you\'ll get unresolved symbols. -- functions in this module - otherwise you\'ll get unresolved symbols.
-- initLinker :: IO () initLinker :: IO ()
initLinker = initLinker_ $ fromIntegral 0
-- our initLinker transparently calls the one in GHC -- our initLinker transparently calls the one in GHC
-- --
@ -466,8 +473,8 @@ loadFunction__ :: Maybe String
-> String -> String
-> IO (Maybe a) -> IO (Maybe a)
loadFunction__ pkg m valsym loadFunction__ pkg m valsym
= do let symbol = prefixUnderscore++(maybe "" (\p -> encode p++"_") pkg) = do let symbol = prefixUnderscore++(maybe "" (\p -> zEncodeString p++"_") pkg)
++encode m++"_"++(encode valsym)++"_closure" ++zEncodeString m++"_"++(zEncodeString valsym)++"_closure"
#if DEBUG #if DEBUG
putStrLn $ "Looking for <<"++symbol++">>" putStrLn $ "Looking for <<"++symbol++">>"
#endif #endif
@ -525,17 +532,21 @@ loadObject p ky@(Package k) = loadObject' p ky k
loadObject' :: FilePath -> Key -> String -> IO Module loadObject' :: FilePath -> Key -> String -> IO Module
loadObject' p ky k loadObject' p ky k
| ("HSrts"++sysPkgSuffix) `isSuffixOf` p = return (emptyMod p)
| otherwise
= do alreadyLoaded <- isLoaded k = do alreadyLoaded <- isLoaded k
when (not alreadyLoaded) $ do when (not alreadyLoaded) $ do
r <- withCString p c_loadObj let ld = if sysPkgSuffix `isSuffixOf` p
when (not r) (panic $ "Could not load module `"++p++"'") then c_loadArchive
addModule k (emptyMod p) -- needs to Z-encode module name else c_loadObj
return (emptyMod p) r <- withCString p ld
when (not r) (panic $ "Could not load module or package `"++p++"'")
let hifile = replaceSuffix p hiSuf
exists <- doesFileExist hifile
hiface <- if exists then readBinIface' hifile else return undefined
let m = emptyMod p hiface
addModule k m
return m
where emptyMod q = Module q (mkModid q) Vanilla undefined ky where emptyMod q hiface = Module q (mkModid q) Vanilla hiface ky
-- | -- |
-- load a single object. no dependencies. You should know what you're -- load a single object. no dependencies. You should know what you're
@ -711,7 +722,11 @@ loadDepends obj incpaths = do
-- and find some packages to load, as well. -- and find some packages to load, as well.
let ps = dep_pkgs ds let ps = dep_pkgs ds
#if MIN_VERSION_ghc(8,0,0) #if MIN_VERSION_ghc(8,0,0)
#if MIN_VERSION_Cabal(2,0,0)
ps' <- filterM loaded . map installedUnitIdString . nub $ map fst ps
#else
ps' <- filterM loaded . map unitIdString . nub $ map fst ps ps' <- filterM loaded . map unitIdString . nub $ map fst ps
#endif
#elif MIN_VERSION_ghc(7,10,0) #elif MIN_VERSION_ghc(7,10,0)
ps' <- filterM loaded . map packageKeyString . nub $ map fst ps ps' <- filterM loaded . map packageKeyString . nub $ map fst ps
#elif MIN_VERSION_ghc(7,2,0) #elif MIN_VERSION_ghc(7,2,0)
@ -758,11 +773,14 @@ foreign import ccall unsafe "loadObj"
foreign import ccall unsafe "unloadObj" foreign import ccall unsafe "unloadObj"
c_unloadObj :: CString -> IO Bool c_unloadObj :: CString -> IO Bool
foreign import ccall unsafe "loadArchive"
c_loadArchive :: CString -> IO Bool
foreign import ccall unsafe "resolveObjs" foreign import ccall unsafe "resolveObjs"
c_resolveObjs :: IO Bool c_resolveObjs :: IO Bool
foreign import ccall unsafe "addDLL" foreign import ccall unsafe "addDLL"
c_addDLL :: CString -> IO CString c_addDLL :: CString -> IO CString
foreign import ccall unsafe "initLinker" foreign import ccall unsafe "initLinker_"
initLinker :: IO () initLinker_ :: CInt -> IO ()

View File

@ -57,20 +57,33 @@ module System.Plugins.Utils (
) where ) where
#include "../../../config.h" #include "../../../config.h"
import System.Plugins.Env ( isLoaded ) import System.Plugins.Env ( isLoaded )
import System.Plugins.Consts ( objSuf, hiSuf, tmpDir ) import System.Plugins.Consts ( objSuf, hiSuf, tmpDir )
-- import qualified System.MkTemp ( mkstemps )
import Foreign.C (CInt(..), CString, withCString)
import Foreign.C.Error (Errno, eEXIST, getErrno, errnoToIOError)
import System.Posix.Internals
import System.Posix.Types (CMode)
import Control.Exception (IOException, catch) import Control.Exception (IOException, catch)
import Data.Bits
import Data.Char import Data.Char
import Data.List import Data.List
import Prelude hiding (catch) import Prelude hiding (catch)
import System.IO import System.IO hiding (openBinaryTempFile, openTempFile)
import System.Random (randomRIO)
import GHC.IO.Encoding (getLocaleEncoding)
import GHC.IO.Handle.FD
import qualified GHC.IO.FD as FD
import System.Environment ( getEnv ) import System.Environment ( getEnv )
import System.Directory ( doesFileExist, getModificationTime, removeFile ) import System.Directory ( doesFileExist, getModificationTime, removeFile )
import System.FilePath (pathSeparator)
-- --------------------------------------------------------------------- -- ---------------------------------------------------------------------
-- some misc types we use -- some misc types we use
@ -90,31 +103,129 @@ hWrite hdl src = hPutStr hdl src >> hClose hdl >> return ()
-- --------------------------------------------------------------------- -- ---------------------------------------------------------------------
-- | mkstemps. -- | openTempFile.
-- --
-- We use the Haskell version now... it is faster than calling into -- System.IO.openTempFile uses undesirable characters in its filenames, which
-- mkstemps(3). -- breaks e.g. merge and other functions that try to compile Haskell source.
-- Sadly, this means we must provide our own secure temporary file facility.
-- --
-- mkstemps :: String -> Int -> IO (String,Handle) openTempFile :: FilePath -- ^ Directory in which to create the file
-- mkstemps path slen = do -> String -- ^ File name prefix. If the prefix is \"fooie\",
-- m_v <- System.MkTemp.mkstemps path slen -- the full name will be \"fooie\" followed by six
-- case m_v of Nothing -> error "mkstemps : couldn't create temp file" -- random alphanumeric characters followed by, if
-- Just v' -> return v' -- given, the suffix. Should not contain any path
-- separator characters.
-> String -- ^ File name suffix. Should not contain any path
-- separator characters.
-> IO (FilePath, Handle)
openTempFile tmp_dir pfx sfx
= openTempFile' "openTempFile" tmp_dir pfx sfx False 0o600
{- -- | Like 'openTempFile', but opens the file in binary mode. See 'openBinaryFile' for more comments.
openBinaryTempFile :: FilePath -> String -> String -> IO (FilePath, Handle)
openBinaryTempFile tmp_dir pfx sfx
= openTempFile' "openBinaryTempFile" tmp_dir pfx sfx True 0o600
mkstemps path slen = do -- | Like 'openTempFile', but uses the default file permissions
withCString path $ \ ptr -> do openTempFileWithDefaultPermissions :: FilePath -> String -> String
let c_slen = fromIntegral $ slen+1 -> IO (FilePath, Handle)
fd <- throwErrnoIfMinus1 "mkstemps" $ c_mkstemps ptr c_slen openTempFileWithDefaultPermissions tmp_dir pfx sfx
name <- peekCString ptr = openTempFile' "openTempFileWithDefaultPermissions" tmp_dir pfx sfx False 0o666
hdl <- fdToHandle fd
return (name, hdl)
foreign import ccall unsafe "mkstemps" c_mkstemps :: CString -> CInt -> IO Fd -- | Like 'openBinaryTempFile', but uses the default file permissions
openBinaryTempFileWithDefaultPermissions :: FilePath -> String -> String
-> IO (FilePath, Handle)
openBinaryTempFileWithDefaultPermissions tmp_dir pfx sfx
= openTempFile' "openBinaryTempFileWithDefaultPermissions" tmp_dir pfx sfx True 0o666
-} badfnmsg :: String
badfnmsg = "openTempFile': Template string must not contain path separator characters: "
openTempFile' :: String -> FilePath -> String -> String -> Bool -> CMode
-> IO (FilePath, Handle)
openTempFile' loc tmp_dir pfx sfx binary mode
| pathSeparator `elem` pfx
= fail $ badfnmsg++pfx
| pathSeparator `elem` sfx
= fail $ badfnmsg++sfx
| otherwise = findTempName
where
findTempName = do
filename <- mkTempFileName tmp_dir pfx sfx
r <- openNewFile filename binary mode
case r of
FileExists -> findTempName
OpenNewError errno -> ioError (errnoToIOError loc errno Nothing (Just tmp_dir))
NewFileCreated fd -> do
(fD,fd_type) <- FD.mkFD fd ReadWriteMode Nothing{-no stat-}
False{-is_socket-}
True{-is_nonblock-}
enc <- getLocaleEncoding
h <- mkHandleFromFD fD fd_type filename ReadWriteMode False{-set non-block-} (Just enc)
return (filename, h)
mkTempFileName :: FilePath -> String -> String -> IO String
mkTempFileName dir pfx sfx = do
let rs = filter isAlphaNum ['0'..'z']
maxInd = length rs - 1
rchoose = do
i <- randomRIO (0, maxInd)
return (rs !! i)
rnd <- sequence $ replicate 6 rchoose
return $ dir </> pfx ++ rnd ++ sfx
data OpenNewFileResult
= NewFileCreated CInt
| FileExists
| OpenNewError Errno
openNewFile :: FilePath -> Bool -> CMode -> IO OpenNewFileResult
openNewFile filepath binary mode = do
let oflags1 = rw_flags .|. o_EXCL
binary_flags
| binary = o_BINARY
| otherwise = 0
oflags = oflags1 .|. binary_flags
fd <- withFilePath filepath $ \ f ->
c_open f oflags mode
if fd < 0
then do
errno <- getErrno
case errno of
_ | errno == eEXIST -> return FileExists
#ifdef mingw32_HOST_OS
-- If c_open throws EACCES on windows, it could mean that filepath is a
-- directory. In this case, we want to return FileExists so that the
-- enclosing openTempFile can try again instead of failing outright.
-- See bug #4968.
_ | errno == eACCES -> do
withCString filepath $ \path -> do
-- There is a race here: the directory might have been moved or
-- deleted between the c_open call and the next line, but there
-- doesn't seem to be any direct way to detect that the c_open call
-- failed because of an existing directory.
exists <- c_fileExists path
return $ if exists
then FileExists
else OpenNewError errno
#endif
_ -> return (OpenNewError errno)
else return (NewFileCreated fd)
#ifdef mingw32_HOST_OS
foreign import ccall "file_exists" c_fileExists :: CString -> IO Bool
#endif
-- XXX Copied from GHC.Handle
std_flags, output_flags, rw_flags :: CInt
std_flags = o_NONBLOCK .|. o_NOCTTY
output_flags = std_flags .|. o_CREAT
rw_flags = output_flags .|. o_RDWR
-- --------------------------------------------------------------------- -- ---------------------------------------------------------------------
-- | create a new temp file, returning name and handle. -- | create a new temp file, returning name and handle.
@ -126,10 +237,8 @@ mkTemp = do tmpd <- catch (getEnv "TMPDIR") (\ (_ :: IOException) -> return tmp
mkTempIn :: String -> IO (String, Handle) mkTempIn :: String -> IO (String, Handle)
mkTempIn tmpd = do mkTempIn tmpd = do
-- XXX (tmpf,hdl) <- mkstemps (tmpd++"/MXXXXXXXXX.hs") 3 (tmpf, hdl) <- openTempFile tmpd "Hsplugins" ".hs"
let modname = mkModid tmpf
(tmpf, hdl) <- openTempFile tmpd "MXXXXX.hs"
let modname = mkModid $ dropSuffix tmpf
if and $ map (\c -> isAlphaNum c && c /= '_') modname if and $ map (\c -> isAlphaNum c && c /= '_') modname
then return (tmpf,hdl) then return (tmpf,hdl)
else panic $ "Illegal characters in temp file: `"++tmpf++"'" else panic $ "Illegal characters in temp file: `"++tmpf++"'"

View File

@ -13,21 +13,21 @@ REALBIN= ./Main
API_OBJ= api/API.o API_OBJ= api/API.o
INCLUDES= -i$(TOP)/testsuite/$(TEST)/api INCLUDES= -i$(TOP)/testsuite/$(TEST)/api
GHCFLAGS= -O0 -cpp -fglasgow-exts GHCFLAGS= -rdynamic -O0 -cpp -fglasgow-exts
.SUFFIXES : .o .hs .hi .lhs .hc .s .SUFFIXES : .o .hs .hi .lhs .hc .s
all: $(BIN) all: $(BIN)
$(BIN) : $(PRIOR_OBJS) $(API_OBJ) $(SRC) $(EXTRA_OBJS) $(BIN) : $(PRIOR_OBJS) $(API_OBJ) $(SRC) $(EXTRA_OBJS)
@rm -f $@ rm -f $@
@$(GHC) --make -o $@ $(INCLUDES) $(PKGFLAGS) $(GHCFLAGS) $(EXTRAFLAGS) $(API) $(SRC) $(GHC) --make -o $@ $(INCLUDES) $(PKGFLAGS) $(GHCFLAGS) $(EXTRAFLAGS) $(API) $(SRC)
# Standard suffix rules # Standard suffix rules
.o.hi: .o.hi:
@: :
.hs.o: .hs.o: $(API_OBJ)
@$(GHC) $(INCLUDES) $(PKGFLAGS) $(GHCFLAGS) $(EXTRAFLAGS) -c $< $(GHC) $(INCLUDES) $(PKGFLAGS) $(GHCFLAGS) $(EXTRAFLAGS) -c $<
clean: clean:
find . -name '*~' -exec rm {} \; find . -name '*~' -exec rm {} \;

View File

@ -1,7 +1,7 @@
include $(TOP)/config.mk include $(TOP)/config.mk
check: $(BIN) check: $(BIN)
@(cd $(BINDIR) ;\ (cd $(BINDIR) ;\
expected="expected" ;\ expected="expected" ;\
if [ -f "expected" -o -f "expected.$(GLASGOW_HASKELL)" ] ;\ if [ -f "expected" -o -f "expected.$(GLASGOW_HASKELL)" ] ;\
then \ then \

View File

@ -1,4 +1,3 @@
{-# OPTIONS -fglasgow-exts -cpp #-}
-- --
-- Copyright (c) 2004 Don Stewart - http://www.cse.unsw.edu.au/~dons -- Copyright (c) 2004 Don Stewart - http://www.cse.unsw.edu.au/~dons
-- LGPL version 2.1 or later (see http://www.gnu.org/copyleft/lesser.html) -- LGPL version 2.1 or later (see http://www.gnu.org/copyleft/lesser.html)
@ -9,6 +8,8 @@ module TestIO ( resource_dyn ) where
import API import API
import Data.Dynamic import Data.Dynamic
import Control.Exception (SomeException, catch)
import System.IO import System.IO
import System.Posix.Types ( ProcessID, Fd ) import System.Posix.Types ( ProcessID, Fd )
import System.Posix.Process ( forkProcess, executeFile, getProcessID ) import System.Posix.Process ( forkProcess, executeFile, getProcessID )
@ -26,7 +27,7 @@ resource = testio { field = date }
-- call a shell command , returning it's output -- call a shell command , returning it's output
-- --
date :: IO String date :: IO String
date = do (hdl,_,_) <- catch (popen "/bin/date") (\_->error "popen failed") date = do (hdl,_,_) <- catch (popen "/bin/date") (\(_ :: SomeException)->error "popen failed")
hGetLine hdl hGetLine hdl
------------------------------------------------------------------------ ------------------------------------------------------------------------

View File

@ -1,19 +1,20 @@
{-# OPTIONS -fglasgow-exts #-}
module API where module API where
import Data.Typeable import Data.Typeable
data TestIO = TestIO { data TestIO = TestIO {
field :: IO String field :: IO String
#if __GLASGOW_HASKELL__ >= 800
} deriving Typeable
#else
} }
instance Typeable TestIO where instance Typeable TestIO where
#if __GLASGOW_HASKELL__ >= 603 #if __GLASGOW_HASKELL__ >= 603
typeOf i = mkTyConApp (mkTyCon "API.TestIO") [] typeOf i = mkTyConApp (mkTyCon "API.TestIO") []
#else #else
typeOf i = mkAppTy (mkTyCon "API.TestIO") [] typeOf i = mkAppTy (mkTyCon "API.TestIO") []
#endif #endif
#endif
testio :: TestIO testio :: TestIO
testio = TestIO { field = return "default value" } testio = TestIO { field = return "default value" }

View File

@ -1,12 +1,13 @@
import System.Plugins import System.Plugins
import API import API
main = do main = do
m_v <- dynload "../TestIO.o" ["../api"] m_v <- dynload "../TestIO.o" ["../api"]
[] "resource_dyn" [] "resource_dyn" :: IO (LoadStatus TestIO)
case m_v of case m_v of
LoadFailure _ -> error "couldn't compile" LoadFailure _ -> error "couldn't link"
LoadSuccess _ v -> do LoadSuccess _ v -> do
s <- field v s <- field v
if s /= [] then print True else print False if s /= "" then print True else print False

View File

@ -12,14 +12,14 @@ REALBIN= ./$(BIN)
all: $(BIN) all: $(BIN)
$(BIN): $(SRC) $(OBJS) $(BIN): $(SRC) $(OBJS)
@rm -f $@ rm -f $@
@$(GHC) --make -fglasgow-exts $(GHCFLAGS) $(PKGFLAGS) $(EXTRAFLAGS) $(SRC) $(GHC) --make -fglasgow-exts $(GHCFLAGS) $(PKGFLAGS) $(EXTRAFLAGS) $(SRC)
# Standard suffix rules # Standard suffix rules
.o.hi: .o.hi:
@: :
.hs.o: .hs.o:
@$(GHC) $(INCLUDES) $(PKGFLAGS) $(GHCFLAGS) $(EXTRAFLAGS) -c $< $(GHC) $(INCLUDES) $(PKGFLAGS) $(GHCFLAGS) $(EXTRAFLAGS) -c $<
clean: clean:
@rm -rf *.hi *.o *~ $(BIN) rm -rf *.hi *.o *~ $(BIN)

View File

@ -0,0 +1,6 @@
TEST=load/plain
EXTRA_OBJS=TestIO.o
TOP=../../..
include ../../build.mk

View File

@ -0,0 +1,11 @@
module TestIO (resource) where
import Control.Monad (forever)
import API
resource :: CLIInterface
resource = testio { repl = loop }
loop :: IO ()
loop = forever $ getLine >>= putStrLn

View File

@ -0,0 +1,10 @@
module API(CLIInterface(..), testio) where
import Data.Typeable
data CLIInterface = CLIInterface {
repl :: IO ()
} deriving Typeable
testio :: CLIInterface
testio = CLIInterface { repl = return () }

View File

@ -0,0 +1,22 @@
module Main (main) where
import Control.Exception (handle)
import System.Plugins
import API
fexn :: IOError -> IO ()
fexn = print
main :: IO ()
main = handle fexn $ do
mf <- load "../TestIO.o" ["../api"] [] "resource"
case mf of
LoadFailure _ -> error "nope"
LoadSuccess _ v -> do
putStrLn "success"
engage v
engage :: CLIInterface -> IO ()
engage plugin = repl plugin