diff --git a/CMakeLists.txt b/CMakeLists.txt index ad0532e..64df248 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,169 +1,273 @@ # -*- mode: cmake -*- - -# Minimal version of CMake -cmake_minimum_required(VERSION 2.6.0) -cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR) +#Cmakelists.txt +# Minimum version of CMake +cmake_minimum_required(VERSION 2.6) if(COMMAND cmake_policy) - cmake_policy(SET CMP0003 NEW) -endif(COMMAND cmake_policy) + cmake_policy(VERSION 2.6) +endif() -# 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}) +CONFIGURE_FILE( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + IMMEDIATE @ONLY) -# include macros -include(MacroConfigureFile) +ADD_CUSTOM_TARGET(uninstall + "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") -# 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" ) +# Source and build dirs +set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}) # Project name - wmfs set(PROJECT_NAME wmfs) -set(VERSION "WMFS-201008") project(${PROJECT_NAME} 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) +# 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) +# 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( - ${FREETYPE_INCLUDE_DIRS} - ${X11_INCLUDE_DIRS} - ${XFT_INCLUDE_DIRS} -) + ${BUILD_DIR}/src + ) -set(CMAKE_LINK_LIBRARIES - ${FREETYPE_LIBRARIES} - ${X11_LIBRARIES} - ${XFT_LIBRARIES} - -lpthread -) +# 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) -# 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) +find_package(X11) +if(X11_FOUND) + include_directories(${X11_INCLUDE_DIR}) +else (X11_FOUND) + message(FATAL_ERROR "Could not find X11") +endif (X11_FOUND) -# 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) +# Link Libraries +set(LIBRARIES_TO_LINK + ${FREETYPE_LIBRARIES} + ${X11_LIBRARIES} + Xft) -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) +# Includes +include(FindDoxygen) +include(FindPkgConfig) -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) +# Use pkgconfig to get required libraries +pkg_check_modules(WMFS_REQUIRED REQUIRED + x11 + freetype2 + xft) -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") +# Optional dependencies check -# set default terminal for user -set(WMFS_TERM xterm) +# 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() -# configure files -set(CONFIGURE_FILES +# 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 src/config.h.in wmfs.doxygen.in wmfsrc.in) -foreach(file ${CONFIGURE_FILES}) - ConfigureFile(${file}) -endforeach(file) -# add the source directory -add_subdirectory(src) +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() -# 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) +foreach(file ${wmfs_configure_files}) + a_configure_file(${file}) +endforeach() -# 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) +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) -# manpage (compression handled by system not by us) -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/wmfs.1 DESTINATION ${CMAKE_DATADIR}/man/man1) +# installs +install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin) -# 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(WMFS_MAN1_FILES) + install(FILES ${WMFS_MAN1_FILES} DESTINATION ${WMFS_MAN_PATH}/man1) +endif() -# config file -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/wmfsrc DESTINATION ${CMAKE_SYSCONFDIR}/${PROJECT_NAME}) +if(PROJECT_CHANGELOG) + install(FILES ${PROJECT_CHANGELOG} DESTINATION ${PROJECT_DATA_PATH}) +endif() -# 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") +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}) diff --git a/src/config.h.in b/src/config.h.in index 25a9a69..e409351 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -35,11 +35,16 @@ #include "wmfs.h" -#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@" +#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@ #endif /* CONFIG_H */ diff --git a/src/wmfs.h b/src/wmfs.h index 0054a3b..f0a1a98 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 583a59b..602c1fc 100644 --- a/wmfs.doxygen.in +++ b/wmfs.doxygen.in @@ -73,7 +73,7 @@ WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- -INPUT = @CMAKE_CURRENT_SOURCE_DIR@/src +INPUT = @SOURCE_DIR@/src INPUT_ENCODING = UTF-8 FILE_PATTERNS = *.c \ *.h \ diff --git a/wmfsrc.in b/wmfsrc.in index 0511bb2..a1170c3 100644 --- a/wmfsrc.in +++ b/wmfsrc.in @@ -8,8 +8,7 @@ [misc] font = "dejavu-10" - raisefocus = true - + raisefocus = false focus_follow_mouse = true # focus_pointer_click: click on unfocused client area: # true -- default, set focus