Skip to content
Snippets Groups Projects
CMakeLists.txt 7.76 KiB
Newer Older
  • Learn to ignore specific revisions
  • project(copyq)
    
    
    hluk's avatar
    hluk committed
    if (APPLE)
        cmake_minimum_required(VERSION 3.1)
    
        set(COPYQ_EXECUTABLE_NAME "CopyQ")
    
    hluk's avatar
    hluk committed
    else()
        cmake_minimum_required(VERSION 2.8.12)
        set(COPYQ_EXECUTABLE_NAME ${PROJECT_NAME})
    
    hluk's avatar
    hluk committed
    # C++11
    if (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 3.1)
        set(CMAKE_CXX_STANDARD 11)
    else()
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    endif()
    
    
    if(CMAKE_BUILD_TYPE MATCHES Debug)
        set(COPYQ_DEBUG ON)
    
        add_definitions( -DCOPYQ_DEBUG  )
    
    hluk's avatar
    hluk committed
    OPTION(PEDANTIC "Enable all compiler warnings" OFF)
    
    
    # Options (cmake -LH)
    
    OPTION(WITH_TESTS "Run test cases from command line" ${COPYQ_DEBUG})
    
    hluk's avatar
    hluk committed
    OPTION(WITH_PLUGINS "Compile plugins" ON)
    
    # Unix-specific options
    if (UNIX AND NOT APPLE)
    
        include(GNUInstallDirs)
    
    hluk's avatar
    hluk committed
        set(DATA_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}" CACHE PATH "Install path for data")
    
        set(PLUGIN_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/${CMAKE_SHARED_MODULE_PREFIX}/copyq/plugins" CACHE PATH "Install path for plugins")
    
    hluk's avatar
    hluk committed
        set(ICON_INSTALL_PREFIX "${DATA_INSTALL_PREFIX}/icons/hicolor/scalable/apps" CACHE PATH "Install path for icons")
        set(ICON_INSTALL_PREFIX_TEMPLATE "${DATA_INSTALL_PREFIX}/icons/hicolor/%SIZE%/apps" CACHE PATH "Install path for icons (%SIZE% is icon size)")
        set(THEME_INSTALL_PREFIX "${DATA_INSTALL_PREFIX}/copyq/themes" CACHE PATH "Install path for themes")
        set(DESKTOP_INSTALL_PREFIX "${DATA_INSTALL_PREFIX}/applications" CACHE PATH "Install path for desktop file")
        set(APPDATA_INSTALL_PREFIX "${DATA_INSTALL_PREFIX}/metainfo" CACHE PATH "Install path for AppData file")
    
        set(MANPAGE_INSTALL_PREFIX "${CMAKE_INSTALL_MANDIR}/man1" CACHE PATH "Install path for manual pages")
    
    hluk's avatar
    hluk committed
        set(TRANSLATION_INSTALL_PREFIX "${DATA_INSTALL_PREFIX}/copyq/translations" CACHE PATH "Install path for translations")
    
    hluk's avatar
    hluk committed
        set(ICON_NAME "copyq" CACHE STRING "Name for icon files")
    
        set(COPYQ_AUTOSTART_COMMAND "" CACHE STRING "Autostart command")
    
    endif()
    
    hluk's avatar
    hluk committed
    set(CMAKE_AUTOMOC ON)
    
    
    hluk's avatar
    hluk committed
    find_package(Qt5Widgets 5.5.0 REQUIRED)
    
    hluk's avatar
    hluk committed
    list(APPEND copyq_LIBRARIES Qt5::Widgets)
    
    hluk's avatar
    hluk committed
    
    
    set(copyq_APP_ID      com.github.hluk.copyq)
    
    hluk's avatar
    hluk committed
    set(copyq_ICON_PREFIX src/images/icon)
    
    set(copyq_ICON_NORMAL src/images/icon.svg)
    
    hluk's avatar
    hluk committed
    set(copyq_ICON_BUSY   src/images/icon-busy.svg)
    
    hluk's avatar
    hluk committed
    set(copyq_ICON_MASK   src/images/icon_mask.svg)
    set(copyq_ICON_BUSY_MASK src/images/icon_mask-busy.svg)
    
    set(copyq_DESKTOP     shared/${copyq_APP_ID}.desktop)
    set(copyq_APPDATA     shared/${copyq_APP_ID}.appdata.xml)
    
    set(copyq_MANPAGE     debian/copyq.1)
    
    hluk's avatar
    hluk committed
    
    
    # Be more strict while compiling debugging version
    if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-long-long")
    
        set(CMAKE_CXX_FLAGS_DEBUG
    
            "${CMAKE_CXX_FLAGS_DEBUG} -Wextra -Wall -pedantic -Wfloat-equal -Woverloaded-virtual -Wundef -Wno-inconsistent-missing-destructor-override")
    
    hluk's avatar
    hluk committed
    if (PEDANTIC)
    
    hluk's avatar
    hluk committed
        if (CMAKE_COMPILER_IS_GNUCXX)
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra -Wall \
                -Wsuggest-override \
    
                -Wlogical-op \
                -Wnoexcept \
                -Wstrict-null-sentinel \
    
    hluk's avatar
    hluk committed
                ")
    
    hluk's avatar
    hluk committed
        else()
    
    hluk's avatar
    hluk committed
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything \
                -Winconsistent-missing-override \
                ")
    
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
                -Wno-c++98-compat \
                -Wno-c++98-compat-pedantic \
                -Wno-shadow-field-in-constructor \
                -Wno-weak-vtables \
                -Wno-disabled-macro-expansion \
                -fcomment-block-commands=retval \
                ")
    
            # Disable errors from moc-generated files.
    
    hluk's avatar
    hluk committed
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
    
    hluk's avatar
    hluk committed
                -Wno-undefined-reinterpret-cast \
                -Wno-missing-prototypes \
                ")
    
    hluk's avatar
    hluk committed
    
            # Disable errors from qrc-generated files.
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
                -Wno-exit-time-destructors \
                -Wno-global-constructors \
                ")
    
    hluk's avatar
    hluk committed
        endif()
    
    
        set(CMAKE_CXX_FLAGS
            "${CMAKE_CXX_FLAGS} -pedantic -Werror \
            -Wcast-align \
            -Wcast-qual \
            -Wctor-dtor-privacy \
            -Wdisabled-optimization \
            -Wformat=2 \
            -Winit-self \
            -Wmissing-declarations \
            -Wmissing-include-dirs \
            -Wold-style-cast \
            -Woverloaded-virtual \
            -Wredundant-decls \
    
    hluk's avatar
    hluk committed
            -Wstrict-overflow=4 \
    
    hluk's avatar
    hluk committed
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
    
    hluk's avatar
    hluk committed
            -Wno-padded \
            -Wno-switch-enum \
            ")
    
    
        # Disable Q_OBJECT macro warnings.
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
            -Wno-unused-member-function \
            ")
    
    hluk's avatar
    hluk committed
    endif()
    
    
    if(WITH_TESTS)
    
    hluk's avatar
    hluk committed
        message(STATUS "Building with tests.")
    
    
        add_definitions( -DHAS_TESTS )
    
    hluk's avatar
    hluk committed
        find_package(Qt5Test REQUIRED)
        list(APPEND copyq_LIBRARIES Qt5::Test)
    
    hluk's avatar
    hluk committed
    # Generate version.h from current git commit if available.
    add_custom_target(
        generate_version_header
        ALL
        COMMAND ${CMAKE_COMMAND}
            -D INPUT_FILE=${CMAKE_CURRENT_SOURCE_DIR}/src/common/version.h.in
            -D OUTPUT_FILE=${CMAKE_CURRENT_BINARY_DIR}/src/common/version.h
            -P ${CMAKE_CURRENT_SOURCE_DIR}/version.cmake
        BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/src/common/version.h
        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    )
    set_source_files_properties(
        ${CMAKE_CURRENT_BINARY_DIR}/src/common/version.h
        PROPERTIES GENERATED TRUE
    )
    
    if (UNIX AND NOT APPLE)
    
    hluk's avatar
    hluk committed
        install(FILES ${copyq_ICON_NORMAL} DESTINATION ${ICON_INSTALL_PREFIX} RENAME ${ICON_NAME}.svg)
    
    hluk's avatar
    hluk committed
        install(FILES ${copyq_ICON_BUSY}   DESTINATION ${ICON_INSTALL_PREFIX} RENAME ${ICON_NAME}-busy.svg)
    
    hluk's avatar
    hluk committed
        install(FILES ${copyq_ICON_MASK}   DESTINATION ${ICON_INSTALL_PREFIX} RENAME ${ICON_NAME}_mask.svg)
        install(FILES ${copyq_ICON_BUSY_MASK} DESTINATION ${ICON_INSTALL_PREFIX} RENAME ${ICON_NAME}_mask-busy.svg)
    
        install(FILES ${copyq_APPDATA}     DESTINATION ${APPDATA_INSTALL_PREFIX})
    
        install(FILES ${copyq_MANPAGE}     DESTINATION ${MANPAGE_INSTALL_PREFIX})
    
    hluk's avatar
    hluk committed
        configure_file(${copyq_DESKTOP}.in ${copyq_DESKTOP})
    
        install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${copyq_DESKTOP} DESTINATION ${DESKTOP_INSTALL_PREFIX})
    
        foreach (copyq_ICON_EXTENT 16 22 24 32 48 64 128)
            set(copyq_ICON_SIZE "${copyq_ICON_EXTENT}x${copyq_ICON_EXTENT}")
            string(REPLACE "%SIZE%" "${copyq_ICON_SIZE}" copyq_ICON_TARGET_PREFIX "${ICON_INSTALL_PREFIX_TEMPLATE}")
    
    hluk's avatar
    hluk committed
            foreach (copyq_ICON_TYPE "" "-busy")
    
    hluk's avatar
    hluk committed
                install(FILES "${copyq_ICON_PREFIX}${copyq_ICON_TYPE}_${copyq_ICON_SIZE}.png" DESTINATION "${copyq_ICON_TARGET_PREFIX}" RENAME "${ICON_NAME}${copyq_ICON_TYPE}.png")
    
    hluk's avatar
    hluk committed
            endforeach()
    
        set(copyq_THEME_INSTALL_PREFIX ${THEME_INSTALL_PREFIX})
    
        file(GLOB copyq_THEMES shared/themes/*.ini)
    
        install(FILES ${copyq_THEMES} DESTINATION ${THEME_INSTALL_PREFIX})
    
    
    hluk's avatar
    hluk committed
        add_definitions( -DCOPYQ_ICON_PREFIX="${ICON_INSTALL_PREFIX}/${ICON_NAME}" )
    
        add_definitions( -DCOPYQ_THEME_PREFIX="${THEME_INSTALL_PREFIX}" )
        add_definitions( -DCOPYQ_PLUGIN_PREFIX="${PLUGIN_INSTALL_PREFIX}" )
    
        add_definitions( -DCOPYQ_DESKTOP_FILE="${DESKTOP_INSTALL_PREFIX}/${copyq_APP_ID}.desktop" )
    
        add_definitions( -DCOPYQ_TRANSLATION_PREFIX="${TRANSLATION_INSTALL_PREFIX}" )
    
    hluk's avatar
    hluk committed
        add_definitions( -DCOPYQ_ICON_NAME="${ICON_NAME}" )
    
        add_definitions( -DCOPYQ_ICON_NAME="${ICON_NAME}" )
    
        if (COPYQ_AUTOSTART_COMMAND)
            add_definitions( -DCOPYQ_AUTOSTART_COMMAND="${COPYQ_AUTOSTART_COMMAND}" )
        endif()
    
    elseif (APPLE)
        set(copyq_themes_dest_dir "${COPYQ_EXECUTABLE_NAME}.app/Contents/Resources/themes")
        file(GLOB copyq_THEMES shared/themes/*.ini)
        install(FILES ${copyq_THEMES} DESTINATION "${copyq_themes_dest_dir}" COMPONENT Runtime)
    
    hluk's avatar
    hluk committed
    endif()
    
    
    add_definitions( -DQT_NO_CAST_TO_ASCII )
    
    
    set_property(GLOBAL PROPERTY COPYQ_INSTALLED_PLUGINS)
    
    hluk's avatar
    hluk committed
    
    if (WITH_PLUGINS)
        add_subdirectory(plugins)
    endif()