diff --git a/CMakeLists.txt b/CMakeLists.txt index 64df248..ad0532e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,273 +1,169 @@ # -*- mode: cmake -*- -#Cmakelists.txt -# Minimum version of CMake -cmake_minimum_required(VERSION 2.6) + +# Minimal version of CMake +cmake_minimum_required(VERSION 2.6.0) +cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR) if(COMMAND cmake_policy) - cmake_policy(VERSION 2.6) -endif() + cmake_policy(SET CMP0003 NEW) +endif(COMMAND cmake_policy) -CONFIGURE_FILE( - "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" - IMMEDIATE @ONLY) +# set some default options +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH} ) +set(CMAKE_COLOR_MAKEFILE ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_BUILD_TYPE_SHARED_LIBS ON) +set(CMAKE_C_FLAGS $ENV{CFLAGS}) +set(CMAKE_CXX_FLAGS $ENV{CXXFLAGS}) +set(CMAKE_LINK_FLAGS $ENV{LDFLAGS}) -ADD_CUSTOM_TARGET(uninstall - "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") +# include macros +include(MacroConfigureFile) -# Source and build dirs -set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) -set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}) +# uninstall +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + IMMEDIATE @ONLY ) +add_custom_target( uninstall + "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" ) # Project name - wmfs set(PROJECT_NAME wmfs) +set(VERSION "WMFS-201008") project(${PROJECT_NAME} C) -# Definition of the wmfs source -set(wmfs_src - src/parse/parse.c - src/barwin.c - src/client.c - src/config.c - src/ - src/draw.c - src/event.c - src/ewmh.c - src/frame.c - src/getinfo.c - src/infobar.c - src/init.c - src/launcher.c - src/layout.c - src/menu.c - src/mouse.c - src/screen.c - src/status.c - src/systray.c - src/tag.c - src/util.c - src/viwmfs.c - src/wmfs.c) +find_package(PkgConfig REQUIRED) +# required packages +pkg_check_modules(FREETYPE REQUIRED freetype2) +pkg_check_modules(X11 REQUIRED x11) +pkg_check_modules(XFT REQUIRED xft) -# Set the executable from the wmfs_src -add_executable(wmfs ${wmfs_src}) - -# Set the version -set(VERSION "WMFS-201008") - -# FLAGS -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -ansi") - -# Linker FLAGS - -set(DEFAULT_LDFLAGS "-L /usr/local/lib -lpthread") - -if(CMAKE_SYSTEM_NAME MATCHES NetBSD) - message("-- NetBSD system found - Using /usr/pkg/lib for linker") - set(LDFLAGS "${DEFAULT_LDFLAGS} -L /usr/pkg/lib") -else(CMAKE_SYSTEM_NAME MATCHES NetBSD) - set(LDFLAGS ${DEFAULT_LDFLAGS}) -endif(CMAKE_SYSTEM_NAME MATCHES NetBSD) - -set_target_properties(wmfs PROPERTIES LINK_FLAGS ${LDFLAGS}) -# Includes dir for libs in build_dir include_directories( - ${BUILD_DIR}/src - ) + ${FREETYPE_INCLUDE_DIRS} + ${X11_INCLUDE_DIRS} + ${XFT_INCLUDE_DIRS} +) -# Package find -find_package(Freetype) -if(FREETYPE_FOUND) - include_directories(${FREETYPE_INCLUDE_DIRS}) -else (FREETYPE_FOUND) - message(FATAL_ERROR "Could not find Freetype") -endif (FREETYPE_FOUND) +set(CMAKE_LINK_LIBRARIES + ${FREETYPE_LIBRARIES} + ${X11_LIBRARIES} + ${XFT_LIBRARIES} + -lpthread +) -find_package(X11) -if(X11_FOUND) - include_directories(${X11_INCLUDE_DIR}) -else (X11_FOUND) - message(FATAL_ERROR "Could not find X11") -endif (X11_FOUND) +# options +option(BUILD_DOC "Generate documentation using doxygen" OFF) +option(WITH_XINERAMA "Build with Xinerama support" ON) +option(WITH_XRANDR "Build with Xrandr support" ON) +option(WITH_IMLIB2 "Build with Imlib2 support" ON) -# Link Libraries -set(LIBRARIES_TO_LINK - ${FREETYPE_LIBRARIES} - ${X11_LIBRARIES} - Xft) +# optional finders +if(WITH_XINERAMA) + add_definitions(-DHAVE_XINIERAMA) + pkg_check_modules(XINERAMA REQUIRED xinerama) + include_directories(${XINERAMA_INCLUDE_DIRS}) + set(CMAKE_LINK_LIBRARIES ${XINERAMA_LIBRARIES} ${CMAKE_LINK_LIBRARIES}) +else(WITH_XINERAMA) + message(STATUS "Not building with Xinerama support") +endif(WITH_XINERAMA) -# Includes -include(FindDoxygen) -include(FindPkgConfig) +if(WITH_XRANDR) + add_definitions(-DHAVE_XRANDR) + pkg_check_modules(XRANDR REQUIRED xrandr) + include_directories(${XRANDR_INCLUDE_DIRS}) + set(CMAKE_LINK_LIBRARIES ${XRANDR_LIBRARIES} ${CMAKE_LINK_LIBRARIES}) +else(WITH_XRANDR) + message(STATUS "Not building with Xrandr support") +endif(WITH_XRANDR) -# Use pkgconfig to get required libraries -pkg_check_modules(WMFS_REQUIRED REQUIRED - x11 - freetype2 - xft) +if(WITH_IMLIB2) + add_definitions(-DHAVE_IMLIB) + pkg_check_modules(IMLIB2 REQUIRED imlib2) + include_directories(${IMLIB2_INCLUDE_DIRS}) + set(CMAKE_LINK_LIBRARIES ${IMLIB2_LIBRARIES} ${CMAKE_LINK_LIBRARIES}) +else(WITH_IMLIB2) + message(STATUS "Not building with Imlib2 support") +endif(WITH_IMLIB2) -# Optional dependencies check +set(CMAKE_SYSCONFDIR ${CMAKE_INSTALL_PREFIX}/etc/ CACHE PATH "Config directory") +set(CMAKE_XDGCONFDIR ${CMAKE_SYSCONFDIR}/xdg/ CACHE PATH "XDG config directory") +set(CMAKE_DATADIR ${CMAKE_INSTALL_PREFIX}/share/ CACHE PATH "Data directory") +set(CMAKE_DOCDIR ${CMAKE_INSTALL_PREFIX}/share/doc/${PROJECT_NAME}-${VERSION} CACHE PATH "Data directory") -# Check for xinerama -pkg_check_modules(HAVE_XINERAMA xinerama) -if(HAVE_XINERAMA_FOUND) - set(WMFS_HAVE_XINERAMA "#define HAVE_XINERAMA") - set(LIBRARIES_TO_LINK ${LIBRARIES_TO_LINK} Xinerama) -else() - set(WMFS_HAVE_XINERAMA "") -endif() +# set default terminal for user +set(WMFS_TERM xterm) -# Check for xrandr -pkg_check_modules(HAVE_XRANDR xrandr) -if(HAVE_XRANDR_FOUND) - set(WMFS_HAVE_XRANDR "#define HAVE_XRANDR") - set(LIBRARIES_TO_LINK ${LIBRARIES_TO_LINK} Xrandr) -else() - set(WMFS_HAVE_XRANDR "") -endif() - -# Check for Imlib -pkg_check_modules(HAVE_IMLIB imlib2) -if(HAVE_IMLIB_FOUND) - set(WMFS_HAVE_IMLIB "#define HAVE_IMLIB") - set(LIBRARIES_TO_LINK ${LIBRARIES_TO_LINK} Imlib2) -else() - set(WMFS_HAVE_IMLIB "") -endif() - -target_link_libraries(wmfs ${LIBRARIES_TO_LINK}) - -# Messages -message("Project version: ${VERSION}") -message("Using these CFLAGS: ${CMAKE_C_FLAGS}") -message("Using these LDFLAGS: ${LDFLAGS}") -message("Linking with theses libraries : ${LIBRARIES_TO_LINK}") - -# Generating man page -find_program(GZIP_EXECUTABLE gzip) -if(NOT GZIP_EXECUTABLE) - message(STATUS "Looking for gzip -- not found") - message(STATUS "Could not generating man page") -else() - message(STATUS "Looking for gzip -- ${GZIP_EXECUTABLE}") - message(STATUS "Generating man page") - set(WMFS_MAN1_FILES ${BUILD_DIR}/wmfs.1.gz) - execute_process( - COMMAND ${GZIP_EXECUTABLE} -c wmfs.1 - WORKING_DIRECTORY ${SOURCE_DIR} - OUTPUT_FILE ${WMFS_MAN1_FILES}) -endif() - -# Generating CHANGELOG -find_program(GIT_EXECUTABLE git) -if(EXISTS ${SOURCE_DIR}/.git/HEAD AND GIT_EXECUTABLE) - message(STATUS "Looking for git -- ${GIT_EXECUTABLE}") - message(STATUS "Git dir -- Generating changelog...") - set(PROJECT_CHANGELOG ${SOURCE_DIR}/changelog) - execute_process( - COMMAND ${GIT_EXECUTABLE} log - WORKING_DIRECTORY ${SOURCE_DIR} - OUTPUT_FILE ${PROJECT_CHANGELOG}) -else() - message(STATUS "Looking for git -- not found") - message(STATUS "Could not generating changelog") -endif() - -# sets -# {{{ Install path and configuration variables -if(DEFINED PREFIX) - set(PREFIX ${PREFIX} CACHE PATH "install prefix") - set(CMAKE_INSTALL_PREFIX ${PREFIX}) -else() - set(PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "install prefix") -endif() - -#If a sysconfdir is specified, use it instead -#of the default configuration dir. -if(DEFINED SYSCONFDIR) - set(SYSCONFDIR ${SYSCONFDIR} CACHE PATH "config directory") -else() - set(SYSCONFDIR /etc CACHE PATH "config directory") -endif() - -#If an XDG Config Dir is specificed, use it instead -#of the default XDG configuration dir. -if(DEFINED XDG_CONFIG_DIR) - set(XDG_CONFIG_DIR ${XDG_CONFIG_SYS} CACHE PATH "xdg config directory") -else() - set(XDG_CONFIG_DIR ${SYSCONFDIR}/xdg CACHE PATH "xdg config directory") -endif() - -# setting WMFS_XSESSION_PATH -if(DEFINED WMFS_XSESSION_PATH) - set(WMFS_XSESSION_PATH ${WMFS_XSESSION_PATH} CACHE PATH "wmfs xsessions directory") -else() - set(WMFS_XSESSION_PATH ${PREFIX}/share/xsessions CACHE PATH "wmfs xsessions directory") -endif() - -if(DEFINED WMFS_MAN_PATH) - set(WMFS_MAN_PATH ${WMFS_MAN_PATH} CACHE PATH "wmfs manpage directory") -else() - set(WMFS_MAN_PATH ${PREFIX}/share/man CACHE PATH "wmfs manpage directory") -endif() - -if(DOXYGEN_EXECUTABLE) - add_custom_target(doc - COMMAND ${DOXYGEN_EXECUTABLE} ${SOURCE_DIR}/wmfs.doxygen - WORKING_DIRECTORY ${BUILD_DIR}) -endif() - -find_program(URXVT_EXECUTABLE urxvt) -if(URXVT_EXECUTABLE) - set(WMFS_TERM urxvt) -else() - set(WMFS_TERM xterm) -endif() - -# Remplace strings in configs -set(WMFS_VERSION ${VERSION}) -set(WMFS_COMPILE_MACHINE ${CMAKE_SYSTEM_PROCESSOR}) -set(WMFS_COMPILE_BY $ENV{USER}) -set(WMFS_COMPILE_FLAGS ${CMAKE_C_FLAGS}) -set(WMFS_LINKED_LIBS ${LIBRARIES_TO_LINK}) -set(WMFS_SYSCONFDIR ${XDG_CONFIG_DIR}/${PROJECT_NAME}) -set(WMFS_SOURCE_DIR ${SOURCE_DIR}) - -# Configure files -set(wmfs_configure_files +# configure files +set(CONFIGURE_FILES src/config.h.in wmfs.doxygen.in wmfsrc.in) +foreach(file ${CONFIGURE_FILES}) + ConfigureFile(${file}) +endforeach(file) -macro(a_configure_file file) - string(REGEX REPLACE ".in\$" "" outfile ${file}) - message(STATUS "Configuring ${outfile}") - configure_file(${SOURCE_DIR}/${file} - ${SOURCE_DIR}/${outfile} - ESCAPE_QUOTE - @ONLY) -endmacro() +# add the source directory +add_subdirectory(src) -foreach(file ${wmfs_configure_files}) - a_configure_file(${file}) -endforeach() +# documentation +if(BUILD_DOC) + find_package(Doxygen REQUIRED) + if(DOXYGEN_FOUND) + add_custom_target(doc + COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/wmfs.doxygen + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + else(DOXYGEN_FOUND) + MESSAGE(FATAL_ERROR "Doxygen executable not found") + endif(DOXYGEN_FOUND) +endif(BUILD_DOC) -set(PROJECT_DATA_PATH share/${PROJECT_NAME}) -set(PROJECT_TODO ${SOURCE_DIR}/TODO) -set(PROJECT_README ${SOURCE_DIR}/README) -set(PROJECT_DEFAULT_CONF ${SOURCE_DIR}/wmfsrc) +# Generating ChangeLog only for live version, for release we generate it to tarball +if(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/ChangeLog) + find_program(GIT_EXECUTABLE git) + if(EXISTS ${CMAKE_SOURCE_DIR}/.git/HEAD AND GIT_EXECUTABLE) + message(STATUS "<<< Generating ChangeLog... >>>") + execute_process( + COMMAND ${GIT_EXECUTABLE} log + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/ChangeLog) + else(EXISTS ${CMAKE_SOURCE_DIR}/.git/HEAD AND GIT_EXECUTABLE) + message(STATUS "No ChangeLog present and git not found") + message(STATUS "<<< Will not generate ChangeLog >>>") + endif(EXISTS ${CMAKE_SOURCE_DIR}/.git/HEAD AND GIT_EXECUTABLE) +endif(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/ChangeLog) -# installs -install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin) +# manpage (compression handled by system not by us) +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/wmfs.1 DESTINATION ${CMAKE_DATADIR}/man/man1) -if(WMFS_MAN1_FILES) - install(FILES ${WMFS_MAN1_FILES} DESTINATION ${WMFS_MAN_PATH}/man1) -endif() +# install docs +# changelog || can have 2 locations based on whether we generate it or not +if(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/ChangeLog) + set(WMFS_DOCS ${CMAKE_CURRENT_BINARY_DIR}/ChangeLog ${WMFS_DOCS}) +endif(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/ChangeLog) +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/ChangeLog) + set(WMFS_DOCS ${CMAKE_CURRENT_SOURCE_DIR}/ChangeLog ${WMFS_DOCS}) +endif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/ChangeLog) +set(WMFS_DOCS + ${CMAKE_CURRENT_SOURCE_DIR}/TODO + ${CMAKE_CURRENT_SOURCE_DIR}/README + ${WMFS_DOCS} +) +install(FILES ${WMFS_DOCS} DESTINATION ${CMAKE_DOCDIR}) -if(PROJECT_CHANGELOG) - install(FILES ${PROJECT_CHANGELOG} DESTINATION ${PROJECT_DATA_PATH}) -endif() +# config file +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/wmfsrc DESTINATION ${CMAKE_SYSCONFDIR}/${PROJECT_NAME}) -install(FILES ${PROJECT_TODO} ${PROJECT_README} - ${PROJECT_DEFAULT_CONF} DESTINATION ${PROJECT_DATA_PATH}) -install(FILES ${PROJECT_DEFAULT_CONF} DESTINATION ${WMFS_SYSCONFDIR}) -install(FILES "wmfs.desktop" DESTINATION ${WMFS_XSESSION_PATH}) +# xsession +install(FILES "wmfs.desktop" DESTINATION ${CMAKE_DATADIR}/xsessions) + +# Status messages +message(STATUS "<<< ${PROJECT_NAME} ${VERSION} configuration >>> + Build type ${CMAKE_BUILD_TYPE} + Install path ${CMAKE_INSTALL_PREFIX} + Compiler flags: + C ${CMAKE_C_FLAGS} + C++ ${CMAKE_CXX_FLAGS} + Linker flags: + Executable ${CMAKE_EXE_LINKER_FLAGS} + Module ${CMAKE_MODULE_LINKER_FLAGS} + Shared ${CMAKE_SHARED_LINKER_FLAGS}\n") diff --git a/src/config.h.in b/src/config.h.in index e409351..25a9a69 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -35,16 +35,11 @@ #include "wmfs.h" -#define WMFS_VERSION "@WMFS_VERSION@" -#define WMFS_COMPILE_MACHINE "@WMFS_COMPILE_MACHINE@" -#define WMFS_COMPILE_BY "@WMFS_COMPILE_BY@" -#define WMFS_COMPILE_FLAGS "@WMFS_COMPILE_FLAGS@" -#define WMFS_LINKED_LIBS "@WMFS_LINKED_LIBS@" -#define XDG_CONFIG_DIR "@XDG_CONFIG_DIR@" - -/* Optional dependencies */ -@WMFS_HAVE_XINERAMA@ -@WMFS_HAVE_XRANDR@ -@WMFS_HAVE_IMLIB@ +#define WMFS_VERSION "@VERSION@" +#define WMFS_COMPILE_MACHINE "@CMAKE_SYSTEM_PROCESSOR@" +#define WMFS_COMPILE_BY "@ENV{USER}@" +#define WMFS_COMPILE_FLAGS "@CMAKE_C_FLAGS@" +#define WMFS_LINKED_LIBS "@CMAKE_LINK_LIBRARIES@" +#define XDG_CONFIG_DIR "@CMAKE_XDGCONFDIR@" #endif /* CONFIG_H */ diff --git a/src/wmfs.h b/src/wmfs.h index f0a1a98..0054a3b 100644 --- a/src/wmfs.h +++ b/src/wmfs.h @@ -34,7 +34,7 @@ #define WMFS_H #define _BSD_SOURCE /* vsnprintf */ -#define _POSIX_SOURCE /* kill */ + /* Lib headers */ #include #include diff --git a/wmfs.doxygen.in b/wmfs.doxygen.in index 602c1fc..583a59b 100644 --- a/wmfs.doxygen.in +++ b/wmfs.doxygen.in @@ -73,7 +73,7 @@ WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- -INPUT = @SOURCE_DIR@/src +INPUT = @CMAKE_CURRENT_SOURCE_DIR@/src INPUT_ENCODING = UTF-8 FILE_PATTERNS = *.c \ *.h \ diff --git a/wmfsrc.in b/wmfsrc.in index a1170c3..0511bb2 100644 --- a/wmfsrc.in +++ b/wmfsrc.in @@ -8,7 +8,8 @@ [misc] font = "dejavu-10" - raisefocus = false + raisefocus = true + focus_follow_mouse = true # focus_pointer_click: click on unfocused client area: # true -- default, set focus