cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR) # add project files set(HEADER_FILES alpm/manager.h alpm/package.h alpm/utilities.h network/server.h network/connection.h network/networkaccessmanager.h alpm/config.h alpm/resolvebuildorder.h alpm/mingwbundle.h network/userrepository.h alpm/alpmpackage.h alpm/aurpackage.h alpm/alpmdatabase.h alpm/repository.h alpm/upgradelookup.h alpm/suggestionslookup.h alpm/packageinfolookup.h alpm/packagelookup.h alpm/packagefinder.h ) set(SRC_FILES alpm/manager.cpp alpm/package.cpp alpm/utilities.cpp alpm/config.cpp alpm/resolvebuildorder.cpp alpm/mingwbundle.cpp alpm/alpmpackage.cpp alpm/aurpackage.cpp alpm/alpmdatabase.cpp alpm/repository.cpp alpm/upgradelookup.cpp alpm/suggestionslookup.cpp alpm/packageinfolookup.cpp alpm/packagelookup.cpp alpm/packagefinder.cpp network/server.cpp network/connection.cpp network/userrepository.cpp network/networkaccessmanager.cpp ) set(CLI_HEADER_FILES ) set(CLI_SRC_FILES cli/main.cpp ) set(GUI_HEADER_FILES gui/mainwindow.h gui/webpage.h gui/webviewprovider.h ) set(GUI_SRC_FILES gui/main.cpp gui/mainwindow.cpp gui/webpage.cpp ) set(WEB_FILES web/3rdparty/bootstrap/css/bootstrap-theme.min.css web/3rdparty/bootstrap/css/bootstrap.min.css web/3rdparty/bootstrap/fonts/glyphicons-halflings-regular.eot web/3rdparty/bootstrap/fonts/glyphicons-halflings-regular.svg web/3rdparty/bootstrap/fonts/glyphicons-halflings-regular.ttf web/3rdparty/bootstrap/fonts/glyphicons-halflings-regular.woff web/3rdparty/bootstrap/fonts/glyphicons-halflings-regular.woff2 web/3rdparty/bootstrap/js/bootstrap.min.js web/3rdparty/bootstrap_dropdowns_enhancement/css/dropdowns-enhancement.min.css web/css/core.css web/css/dashboard.css web/js/client.js web/js/entrymanagement.js web/js/expandcollapse.js web/js/groupmanagement.js web/js/packagemanagement.js web/js/pagemanagement.js web/js/pagination.js web/js/proto.js web/js/repomanagement.js web/js/tabbing.js web/js/utils.js ) # meta data set(META_PROJECT_NAME repoindex) set(META_APP_NAME "Repository Browser") set(META_APP_AUTHOR "Martchus") set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}") set(META_APP_DESCRIPTION "Repository browser for Arch Linux") set(META_VERSION_MAJOR 0) set(META_VERSION_MINOR 2) set(META_VERSION_PATCH 2) # stringification of meta data set(META_PROJECT_NAME_STR "\"${META_PROJECT_NAME}\"") set(META_APP_NAME_STR "\"${META_APP_NAME}\"") set(META_APP_AUTHOR_STR "\"${META_APP_AUTHOR}\"") set(META_APP_URL_STR "\"${META_APP_URL}\"") set(META_APP_DESCRIPTION_STR "\"${META_APP_DESCRIPTION}\"") set(META_APP_VERSION ${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH}) set(META_APP_VERSION_STR "\"${META_APP_VERSION}\"") # define project project(${META_PROJECT_NAME}) # add configuration header configure_file( "${PROJECT_SOURCE_DIR}/resources/config.h.in" "${PROJECT_BINARY_DIR}/resources/config.h" ) include_directories("${PROJECT_BINARY_DIR}") # insert meta data in index.html configure_file( "${PROJECT_SOURCE_DIR}/web/index.html" "${PROJECT_BINARY_DIR}/web/index.html" ) # add windows resource file if(MINGW) # create windows rc file from template set(WINDOWS_EXT "exe") configure_file( "${PROJECT_SOURCE_DIR}/resources/windows.rc.in" "${PROJECT_BINARY_DIR}/resources/windows.rc" ) # set windres as resource compiler set(RES_FILES "${PROJECT_BINARY_DIR}/resources/windows.rc") set(CMAKE_RC_COMPILER_INIT windres) set(CMAKE_RC_COMPILE_OBJECT " -O coff -i -o ") enable_language(RC) endif(MINGW) # read cached variables set(WEBVIEW_PROVIDER "auto" CACHE STRING "specifies the webview provider: auto, webkit or webengine") # check required Qt 5 modules find_package(Qt5Core REQUIRED) find_package(Qt5Concurrent REQUIRED) find_package(Qt5Network REQUIRED) find_package(Qt5WebSockets REQUIRED) find_package(KF5Archive REQUIRED) # select Qt module providing webview (either Qt WebKit or Qt WebEngine) if(${WEBVIEW_PROVIDER} STREQUAL "none") set(WEBVIEW_PROVIDER OFF) message(STATUS "Webview disabled, not building GUI.") elseif(${WEBVIEW_PROVIDER} STREQUAL "auto") find_package(Qt5WebEngineWidgets) if(Qt5WebEngineWidgets_FOUND) set(WEBVIEW_PROVIDER Qt5::WebEngineWidgets) set(WEBVIEW_DEFINITION -DREPOINDEX_USE_WEBENGINE) message(STATUS "No webview provider explicitely specified, defaulting to Qt WebEngine.") else() find_package(Qt5WebKitWidgets REQUIRED) set(WEBVIEW_PROVIDER Qt5::WebKitWidgets) message(STATUS "No webview provider explicitely specified, defaulting to Qt WebKit.") endif() else() if(${WEBVIEW_PROVIDER} STREQUAL "webkit") find_package(Qt5WebKitWidgets REQUIRED) set(WEBVIEW_PROVIDER Qt5::WebKitWidgets) message(STATUS "Using Qt WebKit as webview provider.") elseif(${WEBVIEW_PROVIDER} STREQUAL "webengine") find_package(Qt5WebEngineWidgets REQUIRED) set(WEBVIEW_PROVIDER Qt5::WebEngineWidgets) set(WEBVIEW_DEFINITION -DREPOINDEX_USE_WEBENGINE) message(STATUS "Using Qt WebEngine as webview provider.") else() message(FATAL_ERROR "The specified webview provider '${WEBVIEW_PROVIDER}' is unknown.") endif() endif() # enable moc set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) # disable new ABI (can't catch ios_base::failure with new ABI) add_definitions( -D_GLIBCXX_USE_CXX11_ABI=0 -DCMAKE_BUILD ${WEBVIEW_DEFINITION} ) if(CMAKE_BUILD_TYPE STREQUAL "Debug") add_definitions(-DDEBUG_BUILD) message(STATUS "Debug build enabled.") endif() # executable and linking add_library(${META_PROJECT_NAME}-lib SHARED ${HEADER_FILES} ${SRC_FILES} ${WEB_FILES}) target_link_libraries(${META_PROJECT_NAME}-lib c++utilities Qt5::Core Qt5::Concurrent Qt5::Network Qt5::WebSockets KF5::Archive) set_target_properties(${META_PROJECT_NAME}-lib PROPERTIES VERSION ${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH} SOVERSION ${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH} CXX_STANDARD 11 OUTPUT_NAME ${META_PROJECT_NAME} ) add_executable(${META_PROJECT_NAME} ${CLI_HEADER_FILES} ${CLI_SRC_FILES}) target_link_libraries(${META_PROJECT_NAME} c++utilities ${META_PROJECT_NAME}-lib Qt5::Core Qt5::Network Qt5::WebSockets) set_target_properties(${META_PROJECT_NAME} PROPERTIES CXX_STANDARD 11 ) if(NOT ${WEBVIEW_PROVIDER} STREQUAL "none") add_executable(${META_PROJECT_NAME}-gui ${GUI_HEADER_FILES} ${GUI_SRC_FILES}) target_link_libraries(${META_PROJECT_NAME}-gui c++utilities qtutilities ${META_PROJECT_NAME}-lib Qt5::Core Qt5::Network Qt5::WebSockets ${WEBVIEW_PROVIDER}) set_target_properties(${META_PROJECT_NAME}-gui PROPERTIES CXX_STANDARD 11 ) endif() # add install target for web files / minimizing # -> don't minimize debug builds if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug") # find JavaScript/CSS minimizer find_program(YUI_EXECUTABLE yuicompressor) if(YUI_EXECUTABLE) set(JS_MIN_EXECUTABLE "${CMAKE_CURRENT_SOURCE_DIR}/jsmin.sh") endif() if(NOT JS_MIN_EXECUTABLE) message(STATUS "YUI compressor not found -> installing JavaScript/CSS files unminimized") endif() # find html minimizer find_program(HTML_MIN_EXECUTABLE htmlmin) endif() if(NOT HTML_MIN_EXECUTABLE) message(STATUS "htmlmin not found -> installing HTML files unminimized") # install unminimized index.html install( FILES "${PROJECT_BINARY_DIR}/web/index.html" DESTINATION share/${META_PROJECT_NAME}/web COMPONENT web ) else() # minimize index.html set(MIN_FILE "${PROJECT_BINARY_DIR}/web/index.min/index.html") add_custom_command( OUTPUT ${MIN_FILE} COMMAND "${HTML_MIN_EXECUTABLE}" ARGS "${HTML_MIN_EXECUTABLE}" "${PROJECT_BINARY_DIR}/web/index.html" "${MIN_FILE}" ) install( FILES ${MIN_FILE} DESTINATION share/${META_PROJECT_NAME}/web COMPONENT web ) list(APPEND HTML_MIN_FILES "${MIN_FILE}") endif() foreach(WEB_FILE ${WEB_FILES}) # check whether file can be minimized get_filename_component(WEB_DIR ${WEB_FILE} DIRECTORY) get_filename_component(WEB_EXT ${WEB_FILE} EXT) if(JS_MIN_EXECUTABLE AND (${WEB_EXT} STREQUAL ".js" OR ${WEB_EXT} STREQUAL ".css")) # minimize web file set(MIN_FILE "${CMAKE_CURRENT_BINARY_DIR}/min/${WEB_FILE}") add_custom_command( OUTPUT ${MIN_FILE} COMMAND "${JS_MIN_EXECUTABLE}" ARGS "${YUI_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/${WEB_FILE}" "${MIN_FILE}" ) install( FILES ${MIN_FILE} DESTINATION share/${META_PROJECT_NAME}/${WEB_DIR} COMPONENT web ) list(APPEND JS_MIN_FILES "${MIN_FILE}") else() # install unminimized version of web file install( FILES ${WEB_FILE} DESTINATION share/${META_PROJECT_NAME}/${WEB_DIR} COMPONENT web ) endif() endforeach() install( FILES resources/icons/hicolor/scalable/apps/${META_PROJECT_NAME}.svg DESTINATION share/${META_PROJECT_NAME}/web/img COMPONENT web ) # add target for minimizing if(HTML_MIN_FILES) add_custom_target(htmlmin ALL DEPENDS ${HTML_MIN_FILES}) endif() if(JS_MIN_FILES) add_custom_target(jsmin ALL DEPENDS ${JS_MIN_FILES}) endif() # add install target foreach(HEADER_FILE ${HEADER_FILES}) get_filename_component(HEADER_DIR ${HEADER_FILE} DIRECTORY) install( FILES ${HEADER_FILE} DESTINATION include/${META_PROJECT_NAME}/${HEADER_DIR} COMPONENT header ) endforeach() install(TARGETS ${META_PROJECT_NAME} RUNTIME DESTINATION bin COMPONENT binary ) if(NOT ${WEBVIEW_PROVIDER} STREQUAL "none") install(TARGETS ${META_PROJECT_NAME}-gui RUNTIME DESTINATION bin COMPONENT binary-gui ) endif() install(TARGETS ${META_PROJECT_NAME}-lib RUNTIME DESTINATION bin COMPONENT binary LIBRARY DESTINATION lib COMPONENT binary ARCHIVE DESTINATION lib COMPONENT binary ) install(FILES resources/systemd/${META_PROJECT_NAME}.service DESTINATION lib/systemd/system COMPONENT service ) install(FILES resources/settings/${META_PROJECT_NAME}.conf.js DESTINATION share/${META_PROJECT_NAME}/skel COMPONENT config ) install(FILES resources/icons/hicolor/scalable/apps/${META_PROJECT_NAME}.svg DESTINATION share/icons/hicolor/scalable/apps COMPONENT desktop ) install(FILES resources/desktop/applications/${META_PROJECT_NAME}.desktop DESTINATION share/applications COMPONENT desktop ) if(NOT TARGET install-binary) add_custom_target(install-binary DEPENDS ${META_PROJECT_NAME} COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=binary -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" ) endif() if((NOT ${WEBVIEW_PROVIDER} STREQUAL "none") AND (NOT TARGET install-binary-gui)) set(GUI_INSTALL_TARGET "install-binary-gui") add_custom_target(install-binary-gui DEPENDS ${META_PROJECT_NAME} COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=binary-gui -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" ) endif() if(NOT TARGET install-header) add_custom_target(install-header DEPENDS ${META_PROJECT_NAME} COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=header -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" ) endif() if(NOT TARGET install-service) add_custom_target(install-service DEPENDS ${META_PROJECT_NAME} COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=service -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" ) endif() if(NOT TARGET install-desktop) add_custom_target(install-desktop DEPENDS ${META_PROJECT_NAME} COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=desktop -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" ) endif() if(NOT TARGET install-config) add_custom_target(install-config DEPENDS ${META_PROJECT_NAME} COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=config -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" ) endif() if(NOT TARGET install-web) add_custom_target(install-web DEPENDS ${META_PROJECT_NAME} COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=web -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" ) endif() if(NOT TARGET install-mingw-w64) add_custom_target(install-mingw-w64 DEPENDS install-binary ${GUI_INSTALL_TARGET} install-header ) endif() if(NOT TARGET install-binary-strip) add_custom_target(install-binary-strip DEPENDS ${META_PROJECT_NAME} COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_DO_STRIP=1 -DCMAKE_INSTALL_COMPONENT=binary -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" ) endif() if(NOT TARGET install-mingw-w64-strip) add_custom_target(install-mingw-w64-strip DEPENDS install-binary-strip ) endif()