mirror of
https://github.com/KingDuckZ/dindexer.git
synced 2024-12-02 02:05:41 +00:00
King_DuckZ
a48742c0b0
Attempt to clean up the path mess in cmake and improve scalability. Previously, paths such as action search path and config file path had to be given manually and were likely to be wrong if running make install or if running the program from the build directory directly. This commit introduces set_switchable(), along with the DINDEXER_INST_MODE. Whenever relevant, paths come with a regular and an INST variant (eg: DINDEXER_QML_PATH and DINDEXER_INST_QML_PATH), which are CACHE variables so users can customize them and expect their setting to be persistent. set_switchable() then sets a CURR variant of the same variable (eg: DINDEXER_CURR_QML_PATH), which is set to either of the above two values depending on if DINDEXER_INST_MODE is on or off. This way the rest of the cmake code can just use the CURR variable and expect it to be set to the right value.
217 lines
7.6 KiB
CMake
217 lines
7.6 KiB
CMake
cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
|
|
set(bare_name "dindexer")
|
|
project("${bare_name}-if" VERSION 0.1.5 LANGUAGES CXX C)
|
|
list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules)
|
|
|
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A file indexing program to help you keep track of your backed up files")
|
|
set(CPACK_PACKAGE_VENDOR "King_DuckZ")
|
|
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
|
|
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING")
|
|
set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
|
|
set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
|
|
set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
|
|
set(CPACK_GENERATOR "DEB;RPM;TGZ")
|
|
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "King_DuckZ")
|
|
set(CPACK_PACKAGE_NAME "${bare_name}")
|
|
set(CPACK_STRIP_FILES ON)
|
|
|
|
#Make sure this is either Debug or Release
|
|
set(DINDEXER_SUPPORTED_BUILD_TYPES "Debug;Release")
|
|
list(FIND DINDEXER_SUPPORTED_BUILD_TYPES "${CMAKE_BUILD_TYPE}" build_type_index)
|
|
if (${build_type_index} LESS 0)
|
|
message(STATUS "Forcing build type to Release")
|
|
set(CMAKE_BUILD_TYPE "Release")
|
|
endif()
|
|
unset(build_type_index)
|
|
|
|
include(GetGitRevisionDescription)
|
|
include(Buildlibpqtypes)
|
|
include(gccversion)
|
|
include(CPack)
|
|
include(CTest)
|
|
include(timestamp)
|
|
include(shared_git_project)
|
|
include(TargetArch)
|
|
include(CMakeDependentOption)
|
|
include(set_switchable)
|
|
|
|
find_package(Boost 1.53.0 REQUIRED COMPONENTS program_options filesystem system)
|
|
find_package(PostgreSQL 8.3 REQUIRED)
|
|
find_package(YamlCpp 0.5.1 REQUIRED)
|
|
find_package(Qt5Qml 5.1 REQUIRED)
|
|
|
|
target_architecture(DINDEXER_ARCH)
|
|
if (DINDEXER_ARCH MATCHES "arm.*")
|
|
set(is_arm ON)
|
|
endif()
|
|
|
|
if (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION_MAJOR EQUAL "5")
|
|
set(compiler_is_gnuxx_5plus ON)
|
|
endif()
|
|
|
|
cmake_dependent_option(DINDEXER_NATIVE_RELEASE "Pass the -march=native flag to the compiler for release builds" OFF "NOT is_arm" OFF)
|
|
option(DINDEXER_WITH_MEDIA_AUTODETECT "Enable code that tries to autodetect the media type and sets --type automatically" ON)
|
|
cmake_dependent_option(DINDEXER_WITH_DESKTOP_QT5_GUI "Enable the Qt5 GUI for desktop" ON "Qt5Qml_FOUND" OFF)
|
|
cmake_dependent_option(DINDEXER_CXX11_ABI "Controls if _GLIBCXX_USE_CXX11_ABI gets set to 0 or not" ON "compiler_is_gnuxx_5plus" OFF)
|
|
option(DINDEXER_INST_MODE "Set some paths to the value that is expected for the layout of the installed version of ${bare_name} (make install)" OFF)
|
|
|
|
if(DINDEXER_NATIVE_RELEASE)
|
|
set(march_flag "-march=native")
|
|
else()
|
|
set(march_flag "")
|
|
endif()
|
|
|
|
set(DINDEXER_COPYRIGHT_YEARS "2015,2016")
|
|
set_switchable(PREFIX DINDEXER INFIX INST NAME CONFIG_FILE
|
|
ONVALUE "$HOME/.config/${bare_name}.yml" CACHE STRING "Path to the config file"
|
|
OFFVALUE "${PROJECT_BINARY_DIR}/${bare_name}.yml" CACHE STRING "Path to the config file for debug runs (non-install mode)"
|
|
)
|
|
set_switchable(PREFIX DINDEXER INFIX INST NAME ACTIONS_PATH
|
|
ONVALUE "share/${bare_name}/actions" CACHE STRING "Actions search path"
|
|
OFFVALUE "${CMAKE_CURRENT_BINARY_DIR}/src" CACHE STRING "Actions search path for debug runs (non-install mode)"
|
|
)
|
|
string(REGEX MATCH "[^/].*" ACTIONS_INST_PATH_INSTALL "${DINDEXER_INST_ACTIONS_PATH}")
|
|
string(REGEX MATCH "[^/].*" ACTIONS_PATH_INSTALL "${DINDEXER_ACTIONS_PATH}")
|
|
if (DINDEXER_INST_MODE)
|
|
message(STATUS "Install mode enabled")
|
|
else()
|
|
message(STATUS "Install mode disabled")
|
|
endif()
|
|
set(DINDEXER_DB_OWNER_NAME "$ENV{USER}" CACHE STRING "Name that will be used as the DB owner name")
|
|
set(PROJECT_VERSION_BETA "1")
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra -Wno-missing-field-initializers -fno-omit-frame-pointer -O0")
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -Wextra -fomit-frame-pointer -Wno-missing-field-initializers ${march_flag}")
|
|
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -Wextra -fno-omit-frame-pointer -O0")
|
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wall -Wextra -fomit-frame-pointer ${march_flag}")
|
|
|
|
set(DINDEXER_PUB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include")
|
|
set(PBL_WITH_TESTS OFF)
|
|
get_git_head_revision(GIT_REFSPEC PROJECT_VERSION_GIT)
|
|
|
|
message(STATUS "Config file set to \"${DINDEXER_CURR_CONFIG_FILE}\"")
|
|
message(STATUS "Actions search path set to: \"${DINDEXER_CURR_ACTIONS_PATH}\"")
|
|
|
|
add_library(${PROJECT_NAME} INTERFACE)
|
|
add_library(${bare_name}-inc INTERFACE)
|
|
|
|
configure_file(
|
|
"${PROJECT_SOURCE_DIR}/src/${bare_name}Config.h.in"
|
|
"${PROJECT_BINARY_DIR}/${bare_name}Config.h"
|
|
)
|
|
configure_file(
|
|
"${PROJECT_SOURCE_DIR}/src/gitinfo.h.in"
|
|
"${PROJECT_BINARY_DIR}/gitinfo.h"
|
|
)
|
|
configure_file(
|
|
"${PROJECT_SOURCE_DIR}/dindexer.sql.in"
|
|
"${PROJECT_BINARY_DIR}/dindexer.sql"
|
|
)
|
|
configure_file(
|
|
"${PROJECT_SOURCE_DIR}/dindexer_cmd_complete.sh.in"
|
|
"${PROJECT_BINARY_DIR}/dindexer_cmd_complete.sh"
|
|
@ONLY
|
|
)
|
|
|
|
target_include_directories(${PROJECT_NAME} SYSTEM
|
|
INTERFACE ${Boost_INCLUDE_DIRS}
|
|
)
|
|
|
|
target_compile_features(${PROJECT_NAME}
|
|
INTERFACE cxx_nullptr
|
|
INTERFACE cxx_range_for
|
|
INTERFACE cxx_lambdas
|
|
INTERFACE cxx_decltype_auto
|
|
INTERFACE cxx_defaulted_functions
|
|
INTERFACE cxx_deleted_functions
|
|
INTERFACE cxx_auto_type
|
|
INTERFACE cxx_decltype_incomplete_return_types
|
|
INTERFACE cxx_defaulted_move_initializers
|
|
INTERFACE cxx_noexcept
|
|
INTERFACE cxx_rvalue_references
|
|
)
|
|
|
|
target_include_directories(${bare_name}-inc
|
|
INTERFACE ${PROJECT_BINARY_DIR}
|
|
INTERFACE ${CMAKE_SOURCE_DIR}/include
|
|
)
|
|
|
|
if (NOT DINDEXER_CXX11_ABI)
|
|
message(STATUS "CXX11 ABI disabled (_GLIBCXX_USE_CXX11_ABI=0)")
|
|
add_definitions(
|
|
#workaround for a bug in gcc 5.3 that is causing exceptions to slip
|
|
#through try/catch blocks.
|
|
#WARNING: this will likely cause linking erros with boost and
|
|
#yaml-cpp unless they are also built with this option or with an
|
|
#older version of gcc.
|
|
-D_GLIBCXX_USE_CXX11_ABI=0
|
|
)
|
|
endif()
|
|
|
|
string(REPLACE "," ";" backend_list "${DINDEXER_ENABLED_BACKENDS}")
|
|
list(FIND backend_list "redis" redis_found_index)
|
|
if (${redis_found_index} GREATER -1)
|
|
set(DINDEXER_WITH_REDIS ON)
|
|
endif()
|
|
unset(redis_found_index)
|
|
unset(backend_list)
|
|
|
|
#Libraries
|
|
import_libpqtypes_project("${PostgreSQL_INCLUDE_DIRS}" "-O3 ${march_flag}")
|
|
add_subdirectory(src/pq)
|
|
add_subdirectory(src/common)
|
|
add_subdirectory(src/machinery)
|
|
add_subdirectory(lib/pbl)
|
|
add_subdirectory(lib/glob2regex)
|
|
add_subdirectory(src/backends)
|
|
add_subdirectory(src/core)
|
|
add_shared_git_project(lib/duckhandy)
|
|
if (DINDEXER_WITH_REDIS)
|
|
add_shared_git_project(lib/incredis EXCLUDE_FROM_ALL)
|
|
endif()
|
|
|
|
#Actions
|
|
add_subdirectory(src/main)
|
|
add_subdirectory(src/scan)
|
|
add_subdirectory(src/delete)
|
|
#add_subdirectory(src/query)
|
|
add_subdirectory(src/locate)
|
|
add_subdirectory(src/navigate)
|
|
add_subdirectory(src/tag)
|
|
if (DINDEXER_WITH_DESKTOP_QT5_GUI)
|
|
message(STATUS "Building Qt5 desktop GUI for ${bare_name}")
|
|
add_subdirectory(src/gui)
|
|
endif()
|
|
|
|
#Tests
|
|
if (BUILD_TESTING)
|
|
set(TMP_PROJECT_VERSION "${PROJECT_VERSION}")
|
|
set(TMP_PROJECT_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}")
|
|
set(TMP_PROJECT_VERSION_MINOR "${PROJECT_VERSION_MINOR}")
|
|
set(TMP_PROJECT_VERSION_PATCH "${PROJECT_VERSION_PATCH}")
|
|
unset(PROJECT_VERSION)
|
|
unset(PROJECT_VERSION_MAJOR)
|
|
unset(PROJECT_VERSION_MINOR)
|
|
unset(PROJECT_VERSION_PATCH)
|
|
add_shared_git_project(test/gtest)
|
|
set(PROJECT_VERSION "${TMP_PROJECT_VERSION}")
|
|
set(PROJECT_VERSION_MAJOR "${TMP_PROJECT_VERSION_MAJOR}")
|
|
set(PROJECT_VERSION_MINOR "${TMP_PROJECT_VERSION_MINOR}")
|
|
set(PROJECT_VERSION_PATCH "${TMP_PROJECT_VERSION_PATCH}")
|
|
add_subdirectory(test/unit)
|
|
add_subdirectory(test/unit_cli)
|
|
endif()
|
|
|
|
target_link_libraries(${PROJECT_NAME}
|
|
INTERFACE ${Boost_LIBRARIES}
|
|
INTERFACE ${bare_name}-pq
|
|
INTERFACE ${bare_name}-inc
|
|
)
|
|
target_link_libraries(${bare_name}-inc
|
|
INTERFACE duckhandy
|
|
)
|
|
|
|
target_compile_definitions(${PROJECT_NAME}
|
|
INTERFACE WITH_PROGRESS_FEEDBACK
|
|
INTERFACE BOOST_SPIRIT_USE_PHOENIX_V3=1
|
|
)
|