Skip to content

Commit fe34525

Browse files
author
Justin Erenkrantz
committed
Allow configure to complete successfully on mingw.
Originally titled: [patch 02/17] Windows library dependencies --- Windows symbols may a suffix of @<arg count>. A new macro APR_CHECK_DLL_FUNC looks for a @ sign in the function name; when present it will verify a symbol exists with the correct argument count. Otherwise, APR_CHECK_DLL_FUNC falls back to emulating AC_CHECK_LIB. Enables native threads, locking, DSO loading and shared memory. --- Submitted by: John Mark Vandenberg Tweaked by: Justin Erenkrantz git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@421013 13f79535-47bb-0310-9956-ffa450edef68
1 parent 2b35ac4 commit fe34525

File tree

3 files changed

+87
-9
lines changed

3 files changed

+87
-9
lines changed

build/apr_hints.m4

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,9 @@ dnl # Not a problem in 10.20. Otherwise, who knows?
422422
*cygwin*)
423423
APR_ADDTO(CPPFLAGS, [-DCYGWIN])
424424
;;
425+
*mingw*)
426+
APR_ADDTO(LDFLAGS, [-Wl,--enable-auto-import,--subsystem,console])
427+
;;
425428
esac
426429
427430
fi

build/apr_win32.m4

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
2+
dnl if $2 contains '@dd', links against mingw symbols
3+
dnl otherwise calls AC_CHECK_LIB
4+
AC_DEFUN([APR_CHECK_DLL_FUNC],[
5+
m4_define($1_function_name,m4_substr($2,0,m4_index($2,[@])))
6+
m4_define($1_function_arglength,m4_substr($2,m4_incr(m4_index($2,[@]))))
7+
m4_define($1_[function_name]_arglength,m4_substr($2,m4_incr(m4_index($2,[@]))))
8+
dnl m4_define(apr_check_dll_id,$1_m4_defn($1_function_name))
9+
10+
AC_CACHE_CHECK([for $2 in $1],[ac_cv_lib_$1_]$1_function_name,[
11+
12+
ac_func_search_save_LIBS=$LIBS
13+
LIBS="$LIBS -l$1"
14+
15+
AC_TRY_LINK([
16+
#pragma pack(1)
17+
struct x {
18+
]m4_for([byte_id], 1, m4_defn([$1_function_name_arglength]), 1,[[ char c]]byte_id;
19+
)[};
20+
__stdcall ]$1_function_name[(]struct x[);],[
21+
struct x s = {0};
22+
]$1_function_name[(s)],
23+
[ac_cv_lib_$1_]$1_function_name[=yes],[ac_cv_lib_$1_]$1_function_name[=no])
24+
LIBS=$ac_func_search_save_LIBS
25+
])dnl AC_CACHE_CHECK
26+
27+
AS_IF([test $ac_cv_lib_$1_]$1_function_name[ = yes],
28+
[m4_default([$3], [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_LIB$1),,Enable if this library is available)
29+
LIBS="-l$1 $LIBS"
30+
])],
31+
[$4])dnl
32+
])
33+

configure.in

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ dnl
1616
sinclude(build/apr_common.m4)
1717
sinclude(build/apr_network.m4)
1818
sinclude(build/apr_threads.m4)
19+
sinclude(build/apr_win32.m4)
1920
sinclude(build/apr_hints.m4)
2021
sinclude(build/libtool.m4)
2122
sinclude(build/ltsugar.m4)
@@ -404,6 +405,12 @@ case $host in
404405
OSDIR="as400"
405406
eolstr="\\n"
406407
;;
408+
*mingw*)
409+
OSDIR="win32"
410+
enable_threads="system_threads"
411+
eolstr="\\n"
412+
OBJECTS_PLATFORM='$(OBJECTS_win32)'
413+
;;
407414
*cygwin*)
408415
OSDIR="unix"
409416
APR_ADDTO(CPPFLAGS,-DCYGWIN)
@@ -520,12 +527,27 @@ dnl Note: Autoconf will always append LIBS with an extra " " in AC_CHECK_LIB.
520527
dnl It should check for LIBS being empty and set LIBS equal to the new value
521528
dnl without the extra " " in that case, but they didn't do that. So, we
522529
dnl end up LIBS="-lm -lcrypt -lnsl -ldl" which is an annoyance.
523-
AC_SEARCH_LIBS(gethostbyname, nsl)
524-
AC_SEARCH_LIBS(gethostname, nsl)
525-
AC_SEARCH_LIBS(socket, socket)
526-
AC_SEARCH_LIBS(crypt, crypt ufc)
527-
AC_CHECK_LIB(truerand, main)
528-
AC_SEARCH_LIBS(modf, m)
530+
case $host in
531+
*mingw*)
532+
dnl APR_ADDTO(LIBS,[-lmsvcrt --lshell32 -ladvapi32 -lws2_32])
533+
534+
AC_CHECK_LIB(msvcrt, getpid)
535+
APR_CHECK_DLL_FUNC(kernel32, SetErrorMode@4)
536+
APR_CHECK_DLL_FUNC(advapi32, GetSecurityInfo@32)
537+
APR_CHECK_DLL_FUNC(ws2_32, gethostbyname@4)
538+
APR_CHECK_DLL_FUNC(shell32, CommandLineToArgvW@8)
539+
APR_CHECK_DLL_FUNC(kernel32,[CreateFileMappingA@24],
540+
[ac_cv_func_CreateFileMapping=$ac_cv_lib_kernel32_CreateFileMappingA])
541+
;;
542+
*)
543+
AC_SEARCH_LIBS(gethostbyname, nsl)
544+
AC_SEARCH_LIBS(gethostname, nsl)
545+
AC_SEARCH_LIBS(socket, socket)
546+
AC_SEARCH_LIBS(crypt, crypt ufc)
547+
AC_CHECK_LIB(truerand, main)
548+
AC_SEARCH_LIBS(modf, m)
549+
;;
550+
esac
529551

530552
dnl ----------------------------- Checking for Threads
531553
echo "${nl}Checking for Threads..."
@@ -698,9 +720,10 @@ case $host in
698720
#endif";;
699721
esac
700722

701-
AC_CHECK_HEADERS([sys/types.h sys/mman.h sys/ipc.h sys/mutex.h sys/shm.h sys/file.h kernel/OS.h os2.h])
723+
AC_CHECK_HEADERS([sys/types.h sys/mman.h sys/ipc.h sys/mutex.h sys/shm.h sys/file.h kernel/OS.h os2.h windows.h])
702724
AC_CHECK_FUNCS([mmap munmap shm_open shm_unlink shmget shmat shmdt shmctl \
703725
create_area])
726+
704727
APR_CHECK_DEFINE(MAP_ANON, sys/mman.h)
705728
APR_CHECK_FILE(/dev/zero)
706729

@@ -760,6 +783,10 @@ APR_IFALLYES(header:kernel/OS.h func:create_area,
760783
[havebeosshm="1"
761784
APR_DECIDE(USE_SHMEM_BEOS_ANON,
762785
[BeOS areas])])
786+
APR_IFALLYES(header:windows.h func:CreateFileMapping,
787+
[havewin32shm="1"
788+
APR_DECIDE(USE_SHMEM_WIN32_ANON,
789+
[Windows CreateFileMapping()])])
763790
case $host in
764791
*linux* )
765792
# Linux has problems with MM_SHMT_MMANON even though it reports
@@ -806,6 +833,7 @@ havemmapshm="0"
806833
haveshmget="0"
807834
havebeosarea="0"
808835
haveos2shm="0"
836+
havewin32shm="0"
809837
APR_BEGIN_DECISION([namebased memory allocation method])
810838
APR_IFALLYES(header:sys/mman.h func:mmap func:munmap,
811839
[havemmaptmp="1"
@@ -826,6 +854,9 @@ APR_IFALLYES(header:kernel/OS.h func:create_area,
826854
APR_IFALLYES(header:os2.h,
827855
[haveos2shm="1"
828856
APR_DECIDE(USE_SHMEM_OS2, [OS/2 DosAllocSharedMem()])])
857+
APR_IFALLYES(header:windows.h,
858+
[havewin32shm="1"
859+
APR_DECIDE(USE_SHMEM_WIN32, [Windows shared memory])])
829860
case $host in
830861
*linux* )
831862
# Linux has problems with MM_SHMT_MMANON even though it reports
@@ -846,6 +877,7 @@ usemmapshm="0"
846877
useshmget="0"
847878
usebeosarea="0"
848879
useos2shm="0"
880+
usewin32shm="0"
849881

850882
case $ac_decision in
851883
USE_SHMEM_MMAP_TMP )
@@ -863,10 +895,13 @@ case $ac_decision in
863895
USE_SHMEM_OS2 )
864896
useos2shm="1"
865897
;;
898+
USE_SHMEM_WIN32 )
899+
usewin32shm="1"
900+
;;
866901
esac
867902

868903
# Do we have any shared memory support?
869-
if test "$usemmaptmp$usemmapshm$usemmapzero$useshmget$usemmapanon$usebeosarea$useos2shm" = "0000000"; then
904+
if test "$usemmaptmp$usemmapshm$usemmapzero$useshmget$usemmapanon$usebeosarea$useos2shm$usewin32shm" = "00000000"; then
870905
sharedmem="0"
871906
else
872907
sharedmem="1"
@@ -877,11 +912,13 @@ AC_SUBST(usemmapshm)
877912
AC_SUBST(useshmget)
878913
AC_SUBST(usebeosarea)
879914
AC_SUBST(useos2shm)
915+
AC_SUBST(usewin32shm)
880916
AC_SUBST(havemmaptmp)
881917
AC_SUBST(havemmapshm)
882918
AC_SUBST(haveshmget)
883919
AC_SUBST(havebeosarea)
884920
AC_SUBST(haveos2shm)
921+
AC_SUBST(havewin32shm)
885922
AC_SUBST(sharedmem)
886923

887924
dnl ----------------------------- Checks for Any required Functions
@@ -1462,7 +1499,7 @@ if test "$dsotype" = "any"; then
14621499
# Everything else:
14631500
if test "$dsotype" = "any"; then
14641501
case $host in
1465-
*os390|*-os2*|*os400|*-aix*) dsotype=other ;;
1502+
*os390|*-os2*|*os400|*-aix*|*mingw*) dsotype=other ;;
14661503
esac
14671504
fi
14681505
fi
@@ -1658,6 +1695,11 @@ APR_IFALLYES(header:OS.h func:create_sem,
16581695
if test "x$apr_lock_method" != "x"; then
16591696
APR_DECISION_FORCE($apr_lock_method)
16601697
fi
1698+
case "$host" in
1699+
*mingw* )
1700+
APR_DECISION_FORCE(win32)
1701+
;;
1702+
esac
16611703
APR_END_DECISION
16621704
AC_DEFINE_UNQUOTED($ac_decision)
16631705

0 commit comments

Comments
 (0)