blob: c2e0d4aa46f867dbdb0abfd51d1cb0722057827a [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
include(CheckIncludeFiles)
include(CheckFunctionExists)
include(CheckLibraryExists)
include(CheckSymbolExists)
include(CheckTypeSize)
include(CheckCSourceCompiles)
include(CheckCXXSourceCompiles)
check_include_files(dlfcn.h HAVE_DLFCN_H )
check_include_files(errno.h HAVE_ERRNO_H )
check_include_files(iconv.h HAVE_ICONV_H )
check_include_files(limits.h HAVE_LIMITS_H )
check_include_files(sys/types.h HAVE_SYS_TYPES_H )
check_include_files("sys/types.h;sys/socket.h" HAVE_SYS_SOCKET_H )
check_include_files(sys/syscall.h HAVE_SYS_SYSCALL_H )
check_include_files("sys/types.h;sys/time.h" HAVE_SYS_TIME_H )
check_include_files("sys/types.h;sys/timeb.h" HAVE_SYS_TIMEB_H )
check_include_files("sys/types.h;sys/stat.h" HAVE_SYS_STAT_H )
check_include_files(sys/file.h HAVE_SYS_FILE_H )
check_include_files(syslog.h HAVE_SYSLOG_H )
check_include_files(arpa/inet.h HAVE_ARPA_INET_H )
check_include_files(netinet/in.h HAVE_NETINET_IN_H )
check_include_files("sys/types.h;netinet/tcp.h" HAVE_NETINET_TCP_H )
check_include_files(netdb.h HAVE_NETDB_H )
check_include_files(unistd.h HAVE_UNISTD_H )
check_include_files(fcntl.h HAVE_FCNTL_H )
check_include_files(stdio.h HAVE_STDIO_H )
check_include_files(stdarg.h HAVE_STDARG_H )
check_include_files(stdlib.h HAVE_STDLIB_H )
check_include_files(time.h HAVE_TIME_H )
check_include_files(wchar.h HAVE_WCHAR_H )
check_include_files(poll.h HAVE_POLL_H )
check_include_files(inttypes.h HAVE_INTTYPES_H )
check_include_files(memory.h HAVE_MEMORY_H )
check_include_files(stdint.h HAVE_STDINT_H )
check_include_files(strings.h HAVE_STRINGS_H )
check_include_files(string.h HAVE_STRING_H )
check_include_files("stdlib.h;stdio.h;stdarg.h;string.h;float.h" STDC_HEADERS )
find_library(LIBADVAPI32 advapi32)
find_library(LIBKERNEL32 kernel32)
find_library(LIBNSL nsl)
find_library(LIBRT rt)
find_library(LIBICONV iconv)
find_library(LIBPOSIX4 posix4)
find_library(LIBCPOSIX cposix)
find_library(LIBSOCKET socket)
find_library(LIBWS2_32 ws2_32)
check_function_exists(gmtime_r HAVE_GMTIME_R )
check_function_exists(localtime_r HAVE_LOCALTIME_R )
check_function_exists(gettimeofday HAVE_GETTIMEOFDAY )
check_function_exists(getpid HAVE_GETPID )
check_function_exists(poll HAVE_POLL )
check_function_exists(pipe HAVE_PIPE )
check_function_exists(pipe2 HAVE_PIPE2 )
check_function_exists(ftime HAVE_FTIME )
check_function_exists(stat HAVE_STAT )
check_function_exists(lstat HAVE_LSTAT )
check_function_exists(fcntl HAVE_FCNTL )
check_function_exists(lockf HAVE_FLOCK )
check_function_exists(flock HAVE_LOCKF )
check_function_exists(htons HAVE_HTONS )
check_function_exists(ntohs HAVE_NTOHS )
check_function_exists(htonl HAVE_HTONL )
check_function_exists(ntohl HAVE_NTOHL )
check_function_exists(shutdown HAVE_SHUTDOWN )
check_function_exists(vsnprintf HAVE_VSNPRINTF )
check_function_exists(_vsnprintf HAVE__VSNPRINTF )
check_function_exists(vsprintf_s HAVE_VSPRINTF_S )
check_function_exists(vswprintf_s HAVE_VSWPRINTF_S )
check_function_exists(vfprintf_s HAVE_VFPRINTF_S )
check_function_exists(vfwprintf_s HAVE_VFWPRINTF_S )
check_function_exists(_vsnprintf_s HAVE__VSNPRINTF_S )
check_function_exists(_vsnwprintf_s HAVE__VSNWPRINTF_S )
check_function_exists(mbstowcs HAVE_MBSTOWCS )
check_function_exists(wcstombs HAVE_WCSTOMBS )
check_symbol_exists(ENAMETOOLONG errno.h HAVE_ENAMETOOLONG )
check_symbol_exists(SYS_gettid sys/syscall.h HAVE_GETTID )
check_symbol_exists(__FUNCTION__ "" HAVE_FUNCTION_MACRO )
check_symbol_exists(__PRETTY_FUNCTION__ "" HAVE_PRETTY_FUNCTION_MACRO )
check_symbol_exists(__func__ "" HAVE_FUNC_SYMBOL )
check_c_source_compiles("#include <stdlib.h> \n int main() { int x = 1; int y = __sync_add_and_fetch (&x, 1); return y;}"
HAVE___SYNC_ADD_AND_FETCH )
check_c_source_compiles("#include <stdlib.h> \n int main() { int x = 1; int y = __sync_sub_and_fetch (&x, 1); return y;}"
HAVE___SYNC_SUB_AND_FETCH )
check_c_source_compiles("#include <stdio.h>\n #define MACRO(buf, args...) (sprintf (buf, \"%d\", args))\n int main() {char a[10]; MACRO(a, 1); return 0; }"
HAVE_GNU_VARIADIC_MACROS )
check_c_source_compiles("#include <stdio.h>\n #define MACRO(buf, ...) (sprintf (buf, \"%d\", __VA_ARGS__))\n int main() {char a[10]; MACRO(a, 1); return 0; }"
HAVE_C99_VARIADIC_MACROS )
# clock_gettime() needs -lrt here
# TODO AC says this exists
if (LIBRT)
check_library_exists("${LIBRT}" clock_gettime ""
HAVE_CLOCK_GETTIME )
check_library_exists("${LIBRT}" clock_nanosleep ""
HAVE_CLOCK_NANOSLEEP )
check_library_exists("${LIBRT}" nanosleep ""
HAVE_NANOSLEEP )
else ()
check_function_exists(clock_gettime HAVE_CLOCK_GETTIME )
check_function_exists(clock_nanosleep HAVE_CLOCK_NANOSLEEP )
check_function_exists(nanosleep HAVE_NANOSLEEP )
endif ()
# iconv functions may require iconv library (on OS X for example)
if(WITH_ICONV)
if(LIBICONV)
check_library_exists("${LIBICONV}" iconv_open "" HAVE_ICONV_OPEN )
check_library_exists("${LIBICONV}" iconv_close "" HAVE_ICONV_CLOSE )
check_library_exists("${LIBICONV}" iconv "" HAVE_ICONV )
else()
check_function_exists(iconv_open HAVE_ICONV_OPEN )
check_function_exists(iconv_close HAVE_ICONV_CLOSE )
check_function_exists(iconv HAVE_ICONV )
endif()
endif()
check_function_exists(gethostbyname_r HAVE_GETHOSTBYNAME_R) # TODO more complicated test in AC
check_function_exists(getaddrinfo HAVE_GETADDRINFO ) # TODO more complicated test in AC
# check for declspec stuff
if(NOT DEFINED LOG4CPLUS_DECLSPEC_EXPORT)
check_c_source_compiles(
"#if defined (__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ <= 1))
# error Please fail.
#endif
__attribute__((visibility(\"default\"))) int x = 0;
__attribute__((visibility(\"default\"))) int foo();
int foo() { return 0; }
__attribute__((visibility(\"default\"))) int bar() { return x; }
__attribute__((visibility(\"hidden\"))) int baz() { return 1; }
int main(void) { return 0; }"
HAVE_ATTRIBUTE_VISIBILITY
)
if(HAVE_ATTRIBUTE_VISIBILITY)
set(LOG4CPLUS_DECLSPEC_EXPORT "__attribute__ ((visibility(\"default\")))" )
set(LOG4CPLUS_DECLSPEC_IMPORT "__attribute__ ((visibility(\"default\")))" )
set(LOG4CPLUS_DECLSPEC_PRIVATE "__attribute__ ((visibility(\"hidden\")))" )
endif()
endif()
if(NOT DEFINED LOG4CPLUS_DECLSPEC_EXPORT)
check_c_source_compiles(
"#if defined (__clang__)
// Here the problem is that Clang only warns that it does not support
// __declspec(dllexport) but still compiles the executable.
# error Please fail.
#endif
__declspec(dllexport) int x = 0;
__declspec(dllexport) int foo ();
int foo () { return 0; }
__declspec(dllexport) int bar () { return x; }
int main(void) { return 0; }"
HAVE_DECLSPEC_DLLEXPORT
)
if(HAVE_DECLSPEC_DLLEXPORT)
set(LOG4CPLUS_DECLSPEC_EXPORT "__declspec(dllexport)" )
set(LOG4CPLUS_DECLSPEC_IMPORT "__declspec(dllimport)" )
set(LOG4CPLUS_DECLSPEC_PRIVATE "" )
endif()
endif()
if(NOT DEFINED LOG4CPLUS_DECLSPEC_EXPORT)
check_c_source_compiles(
"__global int x = 0;
__global int foo();
int foo() { return 0; }
__global int bar() { return x; }
__hidden int baz() { return 1; }
int main(void) { return 0; }"
HAVE_GLOBAL_AND_HIDDEN
)
if(HAVE_GLOBAL_AND_HIDDEN)
set(LOG4CPLUS_DECLSPEC_EXPORT "__global" )
set(LOG4CPLUS_DECLSPEC_IMPORT "__global" )
set(LOG4CPLUS_DECLSPEC_PRIVATE "__hidden" )
endif()
endif()
if(NOT DEFINED LOG4CPLUS_DECLSPEC_EXPORT OR NOT ENABLE_SYMBOLS_VISIBILITY)
set(LOG4CPLUS_DECLSPEC_EXPORT "")
set(LOG4CPLUS_DECLSPEC_IMPORT "")
set(LOG4CPLUS_DECLSPEC_PRIVATE "")
endif()
# check for thread-local stuff
if(NOT DEFINED LOG4CPLUS_HAVE_TLS_SUPPORT)
# TODO: requires special compiler switch on GCC and Clang
# Currently it is assumed that they are provided in
# CMAKE_CXX_FLAGS
set(CMAKE_REQUIRED_FLAGS "${CMAKE_CXX_FLAGS}")
check_cxx_source_compiles(
"extern thread_local int x;
thread_local int * ptr = 0;
int foo() { ptr = &x; return x; }
thread_local int x = 1;
int main()
{
x = 2;
foo();
return 0;
}"
HAVE_CXX11_THREAD_LOCAL
)
set(CMAKE_REQUIRED_FLAGS "")
if(HAVE_CXX11_THREAD_LOCAL)
set(LOG4CPLUS_HAVE_TLS_SUPPORT 1)
set(LOG4CPLUS_THREAD_LOCAL_VAR "thread_local")
endif()
endif()
if(NOT DEFINED LOG4CPLUS_HAVE_TLS_SUPPORT)
check_cxx_source_compiles(
"#if defined (__NetBSD__)
#include <sys/param.h>
#if ! __NetBSD_Prereq__(5,1,0)
#error NetBSD __thread support does not work before 5.1.0. It is missing __tls_get_addr.
#endif
#endif
extern __thread int x;
__thread int * ptr = 0;
int foo() { ptr = &x; return x; }
__thread int x = 1;
int main()
{
x = 2;
foo();
return 0;
}"
HAVE_GCC_THREAD_EXTENSION
)
if(HAVE_GCC_THREAD_EXTENSION)
set(LOG4CPLUS_HAVE_TLS_SUPPORT 1)
set(LOG4CPLUS_THREAD_LOCAL_VAR "__thread")
endif()
endif()
if(NOT DEFINED LOG4CPLUS_HAVE_TLS_SUPPORT)
check_cxx_source_compiles(
"#if defined (__GNUC__)
#error Please fail.
#endif
extern __declspec(thread) int x;
__declspec(thread) int * ptr = 0;
int foo() { ptr = &x; return x; }
__declspec(thread) int x = 1;
int main()
{
x = 2;
foo();
return 0;
}"
HAVE_DECLSPEC_THREAD
)
if(HAVE_DECLSPEC_THREAD)
set(LOG4CPLUS_HAVE_TLS_SUPPORT 1)
set(LOG4CPLUS_THREAD_LOCAL_VAR "__declspec(thread)")
endif()
endif()
# check for c++11 atomic stuff
# TODO: requires special compiler switch on GCC and Clang
# Currently it is assumed that they are provided in
# CMAKE_CXX_FLAGS
set(CMAKE_REQUIRED_FLAGS "${CMAKE_CXX_FLAGS}")
check_cxx_source_compiles(
"#include <atomic>
template<typename T>
void test_atomic()
{
std::atomic<T> x(0);
std::atomic_fetch_add_explicit(&x, static_cast<T>(1), std::memory_order_acquire);
std::atomic_fetch_sub_explicit(&x, static_cast<T>(1), std::memory_order_release);
}
int main()
{
test_atomic<int>();
test_atomic<unsigned int>();
test_atomic<long>();
test_atomic<unsigned long>();
std::atomic_thread_fence(std::memory_order_acquire);
return 0;
}"
LOG4CPLUS_HAVE_CXX11_ATOMICS
)
set(CMAKE_REQUIRED_FLAGS "")
set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
check_type_size(socklen_t _SOCKLEN_SIZE)
if (_SOCKLEN_SIZE)
set(socklen_t)
else()
set(socklen_t TRUE)
endif()
macro(PATH_TO_HAVE _pathVar )
if (${_pathVar})
set(HAVE_${_pathVar} TRUE)
else ()
set(HAVE_${_pathVar} FALSE)
endif ()
endmacro()
path_to_have(LIBADVAPI32)
path_to_have(LIBKERNEL32)
path_to_have(LIBPOSIX4)
path_to_have(LIBCPOSIX)
path_to_have(LIBSOCKET)
path_to_have(LIBWS2_32)