re/mk/CMakeLists.txt

152 lines
5.4 KiB
Text
Raw Normal View History

cmake_minimum_required(VERSION 2.8.2)
project(re)
set(CMAKE_VERBOSE_MAKEFILE ON)
SET(RE_ROOT ${PROJECT_SOURCE_DIR}/..)
SET(RE_SRC_PREFIX ../src)
# include header files for the IDEs
file(GLOB_RECURSE HEADER_FILES src/*.h include/*.h)
if(UNIX)
# get make db and extract information via regex's
execute_process(COMMAND make --no-print-directory --just-print --print-data-base info OUTPUT_VARIABLE RE_MAKEDB OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${RE_ROOT})
# get list of source files in SRCS = ...
STRING(REGEX MATCH "[\n\r]SRCS = ([^\n\r]+)" RE_SRCS "${RE_MAKEDB}")
STRING(REGEX REPLACE "[\n\r]SRCS = " "" RE_SRCS "${RE_SRCS}")
# convert into list and prefix every element with 'src/'
SET(RE_SRCS "${RE_SRC_PREFIX}/${RE_SRCS}")
STRING(REPLACE " " ";${RE_SRC_PREFIX}/" RE_SRCS ${RE_SRCS})
# get CFLAGS
STRING(REGEX MATCH "[\n\r]CFLAGS = ([^\n\r]+)" RE_CFLAGS "${RE_MAKEDB}")
STRING(REGEX REPLACE "[\n\r]CFLAGS = " "" RE_CFLAGS "${RE_CFLAGS}")
# remove anything that is not a macro define
STRING(REGEX REPLACE "-[^D][^ ]*" "" RE_CFLAGS "${RE_CFLAGS}" )
# get EXTRA_CFLAGS
STRING(REGEX MATCH "[\n\r]EXTRA_CFLAGS := ([^\n\r]+)" RE_EXTRA_CFLAGS "${RE_MAKEDB}")
STRING(REGEX REPLACE "[\n\r]EXTRA_CFLAGS := " "" RE_EXTRA_CFLAGS "${RE_EXTRA_CFLAGS}")
if (RE_EXTRA_CFLAGS)
# not tested
STRING(REGEX REPLACE "\\$\\(EXTRA_CFLAGS\\)" ${RE_EXTRA_CFLAGS} RE_CFLAGS "${RE_CFLAGS}")
else()
STRING(REGEX REPLACE "\\$\\(EXTRA_CFLAGS\\)" "" RE_CFLAGS "${RE_CFLAGS}")
endif()
# get OS
STRING(REGEX MATCH "[\n\r]OS := ([^\n\r]+)" RE_OS "${RE_MAKEDB}")
STRING(REGEX REPLACE "[\n\r]OS := " "" RE_OS "${RE_OS}")
STRING(REGEX REPLACE "\\$\\(OS\\)" ${RE_OS} RE_CFLAGS "${RE_CFLAGS}")
# get VERSION
STRING(REGEX MATCH "[\n\r]VERSION := ([^\n\r]+)" RE_VERSION "${RE_MAKEDB}")
STRING(REGEX REPLACE "[\n\r]VERSION := " "" RE_VERSION "${RE_VERSION}")
STRING(REGEX REPLACE "\\$\\(VERSION\\)" ${RE_VERSION} RE_CFLAGS "${RE_CFLAGS}")
# get ARCH
STRING(REGEX MATCH "[\n\r]ARCH := ([^\n\r]+)" RE_ARCH "${RE_MAKEDB}")
STRING(REGEX REPLACE "[\n\r]ARCH := " "" RE_ARCH "${RE_ARCH}")
STRING(REGEX REPLACE "\\$\\(ARCH\\)" ${RE_ARCH} RE_CFLAGS "${RE_CFLAGS}")
# escaping '\': makefiles do need it, but it breaks xcode - not sure who's "right"
if (CMAKE_GENERATOR MATCHES Xcode)
STRING(REGEX REPLACE "\\\\" "" RE_CFLAGS "${RE_CFLAGS}" )
endif()
2014-01-29 08:13:12 +00:00
if (APPLE)
LIST(APPEND RE_SRCS "${RE_SRC_PREFIX}/lock/rwlock.c")
# get MacOSX version
execute_process(COMMAND /usr/bin/sw_vers -productVersion
OUTPUT_VARIABLE MACOSX_VERSION
ERROR_VARIABLE MACOSX_VERSION_errors
RESULT_VARIABLE MACOSX_VERSION_result
OUTPUT_STRIP_TRAILING_WHITESPACE)
# build universal binaries
set(CMAKE_OSX_ARCHITECTURES "x86_64;i386")
if (${MACOSX_VERSION} VERSION_LESS 10.9)
foreach(FLAGS CMAKE_C_FLAGS CMAKE_CXX_FLAGS CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS)
set(${FLAGS} "${${FLAGS}} -mmacosx-version-min=10.6 -stdlib=libstdc++")
endforeach()
else()
foreach(FLAGS CMAKE_C_FLAGS CMAKE_CXX_FLAGS CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS)
set(${FLAGS} "${${FLAGS}} -mmacosx-version-min=10.7 -stdlib=libc++")
endforeach()
endif()
endif()
message("libre sources: ${RE_SRCS}")
message("libre cflags: ${RE_CFLAGS}")
message("libre extra_cflags: ${RE_EXTRA_CFLAGS}")
message("libre OS: ${RE_OS}")
message("libre arch: ${RE_ARCH}")
message("libre version: ${RE_VERSION}")
elseif(WIN32)
# hard-coded on Win32
if(MSVC)
SET(RE_CFLAGS
"-DWIN32 -D_CONSOLE -D_CRT_SECURE_NO_DEPRECATE -DHAVE_SELECT -DHAVE_IO_H"
)
elseif(MINGW)
SET(RE_CFLAGS
"-DHAVE_STDBOOL_H -DHAVE_INET6 -DHAVE_SELECT -DHAVE_IO_H"
)
add_definitions(-Wall -D_WIN32_WINNT=0x0501)
endif()
# quotes get eaten in generator
add_definitions(-DOS=\"win32\" -DWIN32 -DARCH=\"i386\" -DVERSION=\"0.3.0\")
# on windows we cannot rely on make and have to do this by hand
file(GLOB_RECURSE RE_SRCS RELATIVE ${PROJECT_SOURCE_DIR} ${RE_ROOT}/src/*.c)
# remove files to compile depending on the compiler flags
if (RE_CFLAGS MATCHES USE_ZLIB)
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/crc32/crc32.c")
endif()
if (NOT RE_CFLAGS MATCHES HAVE_PTHREAD_RWLOCK)
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/lock/rwlock.c")
endif()
if (NOT RE_CFLAGS MATCHES HAVE_GETIFADDRS)
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/net/ifaddrs.c")
endif()
if (NOT RE_CFLAGS MATCHES HAVE_EPOLL)
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/main/epoll.c")
endif()
if (NOT RE_CFLAGS MATCHES USE_OPENSSL)
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/tls/openssl/tls.c")
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/tls/openssl/tls_tcp.c")
endif()
if (NOT RE_CFLAGS MATCHES HAVE_PTHREAD)
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/lock/lock.c")
endif()
# remove files not to be comiled for win32 in any case
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/httpauth/basic.c")
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/mod/dl.c")
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/net/posix/pif.c")
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/net/linux/rt.c")
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/dns/res.c")
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/dns/darwin/srv.c")
LIST(REMOVE_ITEM RE_SRCS "${RE_SRC_PREFIX}/net/bsd/brt.c")
endif()
include_directories(${RE_ROOT}/include)
add_library(re ${RE_SRCS} ${HEADER_FILES})
SET_TARGET_PROPERTIES(re PROPERTIES
COMPILE_FLAGS ${RE_CFLAGS}
)