tmux/util/CMakeLists.txt

162 lines
5.3 KiB
CMake
Raw Normal View History

# $Id: CMakeLists.txt,v 1.1 2009-05-13 23:32:21 nicm Exp $
cmake_minimum_required(VERSION 2.4)
# Project name and version.
project(TMUX)
set(VERSION 0.9)
set(DEBUG 1)
# Compiler flags. Mostly disabled unless a debug build.
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD=\\\"${VERSION}\\\"")
if(DEFINED DEBUG)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -W -Wno-long-long")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wnested-externs -Wformat=2")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-prototypes -Wstrict-prototypes")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-declarations -Wwrite-strings")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow -Wpointer-arith -Wcast-qual")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wsign-compare -Wmissing-prototypes")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wstrict-prototypes -Wmissing-declarations")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wwrite-strings -Wundef -Winline")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wbad-function-cast -Wcast-align")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDEBUG -g -ggdb")
endif(DEFINED DEBUG)
# glibc follows the principle of most surprise, so feed it some extra flags.
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE -D_POSIX_SOURCE")
endif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
# Add source directory as include path.
include_directories(${TMUX_SOURCE_DIR})
# Initialise libraries with ncurses.
set(NEEDED_LIBRARIES ncurses)
# Platform in lowercase. Used later on for some filenames.
string(TOLOWER ${CMAKE_SYSTEM_NAME} LOWER_NAME)
# Build list of source files and sort out the osdep-* file choice. This is
# a bit if a hack and needs to be changed...
file(GLOB SOURCE_FILES "*.c")
string(REGEX REPLACE
"${TMUX_SOURCE_DIR}/osdep-[a-z]*.c;" "" SOURCE_FILES "${SOURCE_FILES}")
if(EXISTS "osdep-${LOWER_NAME}.c")
set(SOURCE_FILES "${SOURCE_FILES};osdep-${LOWER_NAME}.c")
else(EXISTS "osdep-${LOWER_NAME}.c")
set(SOURCE_FILES "${SOURCE_FILES};osdep-unknown.c")
endif(EXISTS "osdep-${LOWER_NAME}.c")
# This crap is needed for checks done later...
include(CheckFunctionExists)
include(CheckVariableExists)
include(CheckIncludeFiles)
include(CheckSymbolExists)
include(CheckLibraryExists)
# Deal with some further glibc stupidity and figure out if -lcrypt is needed.
check_function_exists(crypt HAVE_CRYPT)
if(NOT HAVE_CRYPT)
set(NEEDED_LIBRARIES "${NEEDED_LIBRARIES};crypt")
endif(NOT HAVE_CRYPT)
# See if forkpty exists and which header it is in.
check_library_exists(util forkpty "" HAVE_FORKPTY)
if(HAVE_FORKPTY)
set(NEEDED_LIBRARIES "${NEEDED_LIBRARIES};util")
check_include_files(util.h HAVE_UTIL_H)
if(NOT HAVE_UTIL_H)
check_include_files(libutil.h HAVE_LIBUTIL_H)
if(NOT HAVE_LIBUTIL_H)
check_include_files(pty.h HAVE_PTY_H)
endif(NOT HAVE_LIBUTIL_H)
endif(NOT HAVE_UTIL_H)
else(HAVE_FORKPTY)
# No forkpty. Try and get a compat/forkpty-* file.
set(SOURCE_FILES "${SOURCE_FILES};compat/forkpty-${LOWER_NAME}.c")
endif(HAVE_FORKPTY)
# Look for __progname.
check_variable_exists(__progname HAVE_PROGNAME)
# Check for paths.h.
check_include_files(paths.h HAVE_PATHS_H)
# Check for sys/{tree,queue}.h.
check_include_files(sys/tree.h HAVE_TREE_H)
check_include_files(sys/queue.h HAVE_QUEUE_H)
# queue.h without TAILQ_REPLACE is no use at all.
check_symbol_exists(TAILQ_REPLACE sys/queue.h HAVE_TAILQ_REPLACE)
if(NOT HAVE_TAILQ_REPLACE)
set(HAVE_QUEUE_H 0)
endif(NOT HAVE_TAILQ_REPLACE)
# Check for setproctitle.
check_function_exists(setproctitle HAVE_SETPROCTITLE)
# Check for vsyslog.
check_function_exists(vsyslog HAVE_VSYSLOG)
# Check for asprintf.
check_function_exists(asprintf HAVE_ASPRINTF)
if(NOT HAVE_ASPRINTF)
set(SOURCE_FILES "${SOURCE_FILES};compat/asprintf.c")
endif(NOT HAVE_ASPRINTF)
# Check for daemon.
check_function_exists(daemon HAVE_DAEMON)
if(NOT HAVE_DAEMON)
set(SOURCE_FILES "${SOURCE_FILES};compat/daemon.c")
endif(NOT HAVE_DAEMON)
# Check for a getopt with optreset.
check_symbol_exists(getopt getopt.h HAVE_GETOPT)
if(HAVE_GETOPT)
check_symbol_exists(optreset getopt.h HAVE_OPTRESET)
if(NOT HAVE_OPTRESET)
# This does double duty on Linux - glibc getopt is broken (not
# POSIX-compliant, and no sane way to make it so at build time),
# but happily it also lacks BSD optreset, so this check will
# catch it.
set(HAVE_GETOPT 0)
endif(NOT HAVE_OPTRESET)
endif(HAVE_GETOPT)
if(NOT HAVE_GETOPT)
set(SOURCE_FILES "${SOURCE_FILES};compat/getopt.c")
endif(NOT HAVE_GETOPT)
# Check for fgetln.
check_function_exists(fgetln HAVE_FGETLN)
if(NOT HAVE_FGETLN)
set(SOURCE_FILES "${SOURCE_FILES};compat/fgetln.c")
endif(NOT HAVE_FGETLN)
# Check for strlcat.
check_function_exists(strlcat HAVE_STRLCAT)
if(NOT HAVE_STRLCAT)
set(SOURCE_FILES "${SOURCE_FILES};compat/strlcat.c")
endif(NOT HAVE_STRLCAT)
# Check for strlcpy.
check_function_exists(strlcpy HAVE_STRLCPY)
if(NOT HAVE_STRLCPY)
set(SOURCE_FILES "${SOURCE_FILES};compat/strlcpy.c")
endif(NOT HAVE_STRLCPY)
# Check for strtonum.
check_function_exists(strtonum HAVE_STRTONUM)
if(NOT HAVE_STRTONUM)
set(SOURCE_FILES "${SOURCE_FILES};compat/strtonum.c")
endif(NOT HAVE_STRTONUM)
# Point install locations.
INSTALL(PROGRAMS tmux DESTINATION bin)
INSTALL(FILES tmux.1 DESTINATION man/man1)
# Sort out the config.h file and finish everything off.
configure_file(config.h.in config.h)
add_executable(tmux ${SOURCE_FILES})
target_link_libraries(tmux ${NEEDED_LIBRARIES})