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 main.cpp 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(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 "Arch Linux repository browser") set(META_VERSION_MAJOR 0) set(META_VERSION_MINOR 2) set(META_VERSION_PATCH 1) # 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) # 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) # 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 ) if(CMAKE_BUILD_TYPE STREQUAL "Debug") add_definitions(-DDEBUG_BUILD) message(STATUS "Debug build enabled.") endif() # executable and linking add_executable(${META_PROJECT_NAME} ${HEADER_FILES} ${SRC_FILES} ${WEB_FILES} ${RES_FILES}) target_link_libraries(${META_PROJECT_NAME} c++utilities Qt5::Core Qt5::Concurrent Qt5::Network Qt5::WebSockets KF5::Archive) set_target_properties(${META_PROJECT_NAME} PROPERTIES CXX_STANDARD 11 ) # 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() # 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 install(TARGETS ${META_PROJECT_NAME} RUNTIME DESTINATION bin 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 ) 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 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-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 ) 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()