# $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})