singe/thirdparty/SDL2_mixer/external/libxmp/cmake/libxmp-checks.cmake
2023-10-23 19:38:18 -05:00

199 lines
6.2 KiB
CMake

# ======== Policies ========
if(POLICY CMP0075) # Include file check macros honor CMAKE_REQUIRED_LIBRARIES, CMake >= 3.12
cmake_policy(SET CMP0075 NEW)
endif()
if(POLICY CMP0077) # Cache variables override since 3.12
cmake_policy(SET CMP0077 NEW)
endif()
# ======== Compiler ========
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
set(HAVE_CLANG TRUE)
elseif(CMAKE_COMPILER_IS_GNUCC)
set(HAVE_GCC TRUE)
endif()
message("-- Check for working linker: ${CMAKE_LINKER}")
execute_process(COMMAND ${CMAKE_LINKER} -v
OUTPUT_VARIABLE LINKER_OUTPUT
ERROR_VARIABLE LINKER_OUTPUT)
string(REGEX REPLACE "[\r\n].*" "" LINKER_OUTPUT_LINE "${LINKER_OUTPUT}")
message(STATUS "Linker identification: ${LINKER_OUTPUT_LINE}")
if("${LINKER_OUTPUT}" MATCHES ".*GNU.*" OR "${LINKER_OUTPUT}" MATCHES ".*with BFD.*")
set(HAVE_GNU_LD TRUE)
endif()
# ======== Includes ========
include(CheckSymbolExists)
include(CheckFunctionExists)
include(CheckIncludeFile)
include(CMakePushCheckState)
include(CheckCSourceCompiles)
include(CheckCCompilerFlag)
include(TestBigEndian)
# If platform is Emscripten
if(${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten")
set(EMSCRIPTEN 1)
endif()
# ======== Macros ========
macro(xmp_add_warning_flag WARNINGFLAG WARNING_VAR)
check_c_compiler_flag("${WARNINGFLAG}" HAVE_W_${WARNING_VAR})
if(HAVE_W_${WARNING_VAR})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNINGFLAG}")
endif()
endmacro()
macro(xmp_disable_warning_flag WARNINGFLAG WARNING_VAR)
check_c_compiler_flag("-W${WARNINGFLAG}" HAVE_W_${WARNING_VAR})
if(HAVE_W_${WARNING_VAR})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-${WARNINGFLAG}")
endif()
endmacro()
macro(xmp_check_function SYMBOL HEADER VARNAME)
check_function_exists(${SYMBOL} ${VARNAME}_F)
check_symbol_exists(${SYMBOL} "${HEADER}" ${VARNAME})
if(${VARNAME} AND ${VARNAME}_F)
add_definitions(-D${VARNAME}=1)
endif()
endmacro()
macro(xmp_check_include HEADER VARNAME)
check_include_file(${HEADER} ${VARNAME})
if(${VARNAME})
add_definitions(-D${VARNAME}=1)
endif()
endmacro()
# ======== Flags and warning ========
string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DDEBUG -D_DEBUG")
if(MSVC)
# Force to always compile with W4
if(CMAKE_C_FLAGS MATCHES "/W[0-4]")
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
else()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
endif()
# Disable bogus MSVC warnings
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
# Tune warnings
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4244 /wd4018 /wd4996 /wd4048 /wd4267 /wd4127")
else()
xmp_add_warning_flag("-Wall" ALL)
xmp_add_warning_flag("-Wwrite-strings" WRITE_STRINGS)
xmp_add_warning_flag("-Wextra" EXTRA)
if(NOT HAVE_W_EXTRA)
xmp_add_warning_flag("-W" W)
endif()
xmp_disable_warning_flag("unknown-warning-option" NO_UNKNOWN_WARNING)
xmp_disable_warning_flag("unused-parameter" NO_UNUSED_PARAMETER)
xmp_disable_warning_flag("sign-compare" NO_SIGN_COMPARE)
endif()
# ======== Checks ========
if(UNIX AND NOT (WIN32 OR APPLE OR HAIKU OR EMSCRIPTEN OR BEOS))
find_library(LIBM_LIBRARY m)
if(LIBM_LIBRARY) # No need to link it by an absolute path
set(LIBM_REQUIRED 1)
set(LIBM_LIBRARY m)
set(LIBM "-lm") # for pkgconfig file.
list(APPEND CMAKE_REQUIRED_LIBRARIES m)
endif()
mark_as_advanced(LIBM_LIBRARY)
endif()
TEST_BIG_ENDIAN(WORDS_BIGENDIAN)
if(WORDS_BIGENDIAN)
add_definitions(-DWORDS_BIGENDIAN=1)
endif()
cmake_push_check_state()
if(LIBM_REQUIRED)
set(CMAKE_REQUIRED_LIBRARIES ${LIBM_LIBRARY})
endif()
xmp_check_function(powf "math.h" HAVE_POWF)
cmake_pop_check_state()
xmp_check_function(popen "stdio.h" HAVE_POPEN)
xmp_check_function(fnmatch "fnmatch.h" HAVE_FNMATCH)
xmp_check_function(umask "sys/stat.h" HAVE_UMASK)
xmp_check_function(wait "sys/wait.h" HAVE_WAIT)
xmp_check_function(mkstemp "stdlib.h" HAVE_MKSTEMP)
check_include_file(unistd.h HAVE_UNISTD_H)
if(HAVE_UNISTD_H)
xmp_check_function(pipe "unistd.h" HAVE_PIPE)
xmp_check_function(fork "unistd.h" HAVE_FORK)
xmp_check_function(execvp "unistd.h" HAVE_EXECVP)
xmp_check_function(dup2 "unistd.h" HAVE_DUP2)
endif()
if(AMIGA)
xmp_check_include(proto/xfdmaster.h HAVE_PROTO_XFDMASTER_H)
endif()
check_symbol_exists(opendir "dirent.h" HAVE_DIRENT)
check_function_exists(opendir HAVE_OPENDIR)
check_function_exists(readdir HAVE_READDIR)
if(HAVE_DIRENT AND HAVE_OPENDIR AND HAVE_READDIR)
add_definitions(-DHAVE_DIRENT=1)
endif()
# Symbol visibility attributes check
if(NOT (WIN32 OR CYGWIN OR AMIGA OR OS2))
cmake_push_check_state()
set(CMAKE_REQUIRED_FLAGS "-fvisibility=hidden -Werror")
check_c_source_compiles("__attribute__((visibility(\"default\"))) int foo(void);
__attribute__((visibility(\"hidden\"))) int bar(void);
int foo (void) { return 0; }
int bar (void) { return 1; }
int main(void) { return 0; }" HAVE_VISIBILITY)
check_c_source_compiles("__attribute__((visibility(\"default\"),externally_visible)) int foo(void);
int foo (void) { return 0; }
int main(void) { return 0; }" HAVE_EXTERNAL_VISIBILITY)
set(CMAKE_REQUIRED_FLAGS "-Werror=attributes")
check_c_source_compiles("void foo(void) __attribute__((__symver__(\"foo@bar\")));
int main(void) { return 0; }" HAVE_ATTRIBUTE_SYMVER)
cmake_pop_check_state()
if(HAVE_VISIBILITY)
# Note: LIBXMP_DEFINES and LIBXMP_DEFINES should be defined externally before to include the "build_pros.cmake"
list(APPEND LIBXMP_CFLAGS -fvisibility=hidden)
list(APPEND LIBXMP_DEFINES -DXMP_SYM_VISIBILITY)
if(HAVE_EXTERNAL_VISIBILITY)
list(APPEND LIBXMP_DEFINES -DHAVE_EXTERNAL_VISIBILITY)
endif()
endif()
if(HAVE_ATTRIBUTE_SYMVER)
list(APPEND LIBXMP_DEFINES -DHAVE_ATTRIBUTE_SYMVER)
endif()
endif()