diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d509b2..7351264 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,7 @@ 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) @@ -49,10 +50,10 @@ if (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION_MAJOR EQUAL "5") 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_DEBUG_CFG_FILE "Enable to set the config file path to the build path" 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") @@ -61,8 +62,21 @@ else() endif() set(DINDEXER_COPYRIGHT_YEARS "2015,2016") -set(DINDEXER_ACTIONS_PATH "${CMAKE_CURRENT_BINARY_DIR}/src" CACHE STRING "Actions search path") +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") @@ -75,20 +89,12 @@ set(DINDEXER_PUB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") set(PBL_WITH_TESTS OFF) get_git_head_revision(GIT_REFSPEC PROJECT_VERSION_GIT) -if ("${DINDEXER_CONFIG_FILE}" STREQUAL "") - if (DINDEXER_DEBUG_CFG_FILE) - set(DINDEXER_CONFIG_FILE ${CMAKE_CURRENT_BINARY_DIR}/${bare_name}.yml CACHE STRING "Path to the config file" FORCE) - else() - set(DINDEXER_CONFIG_FILE "$HOME/.config/${bare_name}.yml" CACHE STRING "Path to the config file" FORCE) - endif() -endif() -message(STATUS "Config file set to \"${DINDEXER_CONFIG_FILE}\"") +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) -message(STATUS "Actions search path set to: \"${DINDEXER_ACTIONS_PATH}\"") - configure_file( "${PROJECT_SOURCE_DIR}/src/${bare_name}Config.h.in" "${PROJECT_BINARY_DIR}/${bare_name}Config.h" diff --git a/README.md b/README.md index 2df6ecb..7ac8e6c 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ These are the options understood by cmake. At runtime you might be able to see w * **DINDEXER_ACTIONS_PATH** Search path for dindexer actions * **DINDEXER_CONFIG_FILE** Full path to the yaml configuration file * **DINDEXER_CXX11_ABI** Set this to off to force newer gcc (5+) to keep using the old ABI - useful on Gentoo if you built your system libraries with gcc 4 and you are trying to build dindexer with gcc 5 -* **DINDEXER_DEBUG_CFG_FILE** If set to on, DINDEXER_CONFIG_FILE will be set to a path that is more appropriate for development environments +* **DINDEXER_INST_MODE** If set to on, paths will be set to the value that is assumed to be valid for a system-wide installed version of dindexer * **DINDEXER_NATIVE_RELEASE** Set to on to pass `--march=native` to the compiler * **DINDEXER_WITH_BUILD_DATE** If set to on, the current date will be hardcoded into the final binary - warning: if set to on, some files will need to be rebuilt every day just because the date has changed * **DINDEXER_WITH_MEDIA_AUTODETECT** Enable code that detects the inserted media type, eg: CD-Rom or DVD - requires libblkid diff --git a/cmake/Modules/set_switchable.cmake b/cmake/Modules/set_switchable.cmake new file mode 100644 index 0000000..1603862 --- /dev/null +++ b/cmake/Modules/set_switchable.cmake @@ -0,0 +1,52 @@ +function(set_switchable) + set(options "") + set(one_value_args PREFIX INFIX OUT_INFIX NAME) + set(multi_value_args ONVALUE OFFVALUE) + + cmake_parse_arguments(SS "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) + + if (NOT SS_PREFIX) + message(FATAL_ERROR "No PREFIX given") + endif() + if (NOT SS_INFIX) + set(SS_INFIX "ENABLED") + endif() + if (NOT SS_OUT_INFIX) + set(SS_OUT_INFIX "CURR") + endif() + if (NOT SS_NAME) + message(FATAL_ERROR "No NAME given") + endif() + + list(FIND SS_ONVALUE CACHE on_is_cachevar) + list(FIND SS_ONVALUE PARENT_SCOPE on_is_parentscope) + list(FIND SS_OFFVALUE CACHE off_is_cachevar) + list(FIND SS_OFFVALUE PARENT_SCOPE off_is_parentscope) + + set(on_parentscope) + if (${on_is_cachevar} LESS 0 AND ${on_is_parentscope} LESS 1) + list(APPEND on_parentscope "PARENT_SCOPE") + endif() + set(off_parentscope) + if (${off_is_cachevar} LESS 0 AND ${off_is_parentscope} LESS 1) + list(APPEND off_parentscope "PARENT_SCOPE") + endif() + + #Set some alisases to make the following code less yelling-at-me + set(prefix "${SS_PREFIX}") + set(infix "${SS_INFIX}") + set(out_infix "${SS_OUT_INFIX}") + set(suffix "${SS_NAME}") + + set(${prefix}_${infix}_${suffix} ${SS_ONVALUE} ${on_parentscope}) + set(${prefix}_${suffix} ${SS_OFFVALUE} ${off_parentscope}) + + #message(STATUS "${prefix}_${suffix} set to \"${${prefix}_${suffix}}\"") + #message(STATUS "${prefix}_${infix}_${suffix} set to \"${${prefix}_${infix}_${suffix}}\"") + + if (${prefix}_${infix}_MODE) + set(${prefix}_${out_infix}_${suffix} "${${prefix}_${infix}_${suffix}}" PARENT_SCOPE) + else() + set(${prefix}_${out_infix}_${suffix} "${${prefix}_${suffix}}" PARENT_SCOPE) + endif() +endfunction() diff --git a/src/backends/redis/CMakeLists.txt b/src/backends/redis/CMakeLists.txt index 3604bda..350f559 100644 --- a/src/backends/redis/CMakeLists.txt +++ b/src/backends/redis/CMakeLists.txt @@ -1,6 +1,9 @@ project(${bare_name}-backend-redis CXX) -set(DINDEXER_REDIS_SCRIPTS_PATH "usr/share/${bare_name}/redis" CACHE STRING "Path where Lua scripts for Redis are stored") +set_switchable(PREFIX DINDEXER INFIX INST NAME REDIS_SCRIPTS_PATH + ONVALUE "share/${bare_name}/redis" CACHE STRING "Path where Lua scripts for Redis are stored" + OFFVALUE "resources/redis" CACHE STRING "Path where Lua scripts for Redis are stored" +) find_package(Boost 1.53.0 REQUIRED COMPONENTS regex) @@ -41,15 +44,17 @@ install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION lib/static ) -set(lua_script_list "") -foreach (lua_script ${LUA_SCRIPTS}) - get_filename_component(lua_script_basename "${lua_script}" NAME) - configure_file("${lua_script}" "${CMAKE_CURRENT_BINARY_DIR}/lua/${lua_script_basename}" COPYONLY) - list(APPEND lua_script_list "${CMAKE_CURRENT_BINARY_DIR}/lua/${lua_script_basename}") +get_directory_property(lua_script_list ADDITIONAL_MAKE_CLEAN_FILES) +foreach (current_lua ${LUA_SCRIPTS}) + get_filename_component(lua_script_basename "${current_lua}" NAME) + configure_file("${current_lua}" "${CMAKE_BINARY_DIR}/${DINDEXER_CURR_REDIS_SCRIPTS_PATH}/${lua_script_basename}" COPYONLY) + list(APPEND lua_script_list "${CMAKE_BINARY_DIR}/${DINDEXER_CURR_REDIS_SCRIPTS_PATH}/${lua_script_basename}") endforeach() -unset(lua_script) -unset(lua_script_basename) -install(FILES ${lua_script_list} DESTINATION "${DINDEXER_REDIS_SCRIPTS_PATH}") +set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${lua_script_list}") unset(lua_script_list) +unset(current_lua) +unset(lua_script_basename) + +install(FILES ${LUA_SCRIPTS} DESTINATION "${DINDEXER_CURR_REDIS_SCRIPTS_PATH}") ln_backend(${PROJECT_NAME}) diff --git a/src/backends/redis/redisConfig.h.in b/src/backends/redis/redisConfig.h.in index 6f1267d..4c70584 100644 --- a/src/backends/redis/redisConfig.h.in +++ b/src/backends/redis/redisConfig.h.in @@ -18,6 +18,12 @@ #ifndef idB3E2F339E3B64378B66342550C4D2089 #define idB3E2F339E3B64378B66342550C4D2089 -#define REDIS_SCRIPTS_PATH "@DINDEXER_REDIS_SCRIPTS_PATH@" +#cmakedefine DINDEXER_INST_MODE + +#if defined(DINDEXER_INST_MODE) +# define REDIS_SCRIPTS_PATH "@CMAKE_INSTALL_PREFIX@/@DINDEXER_CURR_REDIS_SCRIPTS_PATH@" +#else +# define REDIS_SCRIPTS_PATH "@DINDEXER_CURR_REDIS_SCRIPTS_PATH@" +#endif #endif diff --git a/src/dindexerConfig.h.in b/src/dindexerConfig.h.in index 67b6a91..75c3ffe 100644 --- a/src/dindexerConfig.h.in +++ b/src/dindexerConfig.h.in @@ -20,13 +20,19 @@ #include "duckhandy/cmake_on_off.h" +#cmakedefine DINDEXER_INST_MODE + #define PROGRAM_NAME "@bare_name@" #define VERSION_MAJOR @PROJECT_VERSION_MAJOR@ #define VERSION_MINOR @PROJECT_VERSION_MINOR@ #define VERSION_BETA @PROJECT_VERSION_BETA@ #define VERSION_PATCH @PROJECT_VERSION_PATCH@ -#define CONFIG_FILE_PATH "@DINDEXER_CONFIG_FILE@" -#define ACTIONS_SEARCH_PATH "@DINDEXER_ACTIONS_PATH@" +#define CONFIG_FILE_PATH "@DINDEXER_CURR_CONFIG_FILE@" +#if defined(DINDEXER_INST_MODE) +# define ACTIONS_SEARCH_PATH "@CMAKE_INSTALL_PREFIX@/@DINDEXER_CURR_ACTIONS_PATH@" +#else +# define ACTIONS_SEARCH_PATH "@DINDEXER_CURR_ACTIONS_PATH@" +#endif #define ACTION_PREFIX "@bare_name@-" #define DB_OWNER_NAME "@DINDEXER_DB_OWNER_NAME@" diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 0b445a6..7a6ed24 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -1,5 +1,10 @@ project(${bare_name}-gui CXX) +set_switchable(PREFIX DINDEXER INFIX INST NAME QML_PATH + ONVALUE "share/${bare_name}/qml" CACHE STRING "Path to the directory containing the qml files needed by ${bare_name} gui" + OFFVALUE "resources/qml" CACHE STRING "Path to the directory containing the qml files needed by ${bare_name} gui" +) + set(CMAKE_AUTOMOC ON) find_package(Qt5Qml 5.1 REQUIRED) find_package(Qt5Widgets 5.1 REQUIRED) @@ -9,9 +14,14 @@ add_executable(${PROJECT_NAME} searcher.cpp ) +set(qml_files + qml/mainwin.qml +) + target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/.. PRIVATE ${CMAKE_SOURCE_DIR}/lib/glob2regex/include + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ) target_link_libraries(${PROJECT_NAME} @@ -28,8 +38,25 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE ACTION_NAME="${ACTION_NAME}" ) +get_directory_property(clean_qml_list ADDITIONAL_MAKE_CLEAN_FILES) +foreach(current_qml ${qml_files}) + get_filename_component(qml_basename "${current_qml}" NAME) + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${current_qml}" "${CMAKE_BINARY_DIR}/${DINDEXER_CURR_QML_PATH}/${qml_basename}" COPYONLY) + list(APPEND clean_qml_list "${CMAKE_BINARY_DIR}/${DINDEXER_CURR_QML_PATH}/${qml_basename}") +endforeach() +set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${clean_qml_list}") +unset(clean_qml_list) +unset(current_qml) +unset(qml_basename) + +configure_file( + "${PROJECT_NAME}Config.h.in" + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.h" +) + install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION lib RUNTIME DESTINATION ${ACTIONS_PATH_INSTALL} ARCHIVE DESTINATION lib/static ) +install(FILES ${qml_files} DESTINATION "${DINDEXER_CURR_QML_PATH}") diff --git a/src/gui/dindexer-guiConfig.h.in b/src/gui/dindexer-guiConfig.h.in new file mode 100644 index 0000000..ed2fb6f --- /dev/null +++ b/src/gui/dindexer-guiConfig.h.in @@ -0,0 +1,29 @@ +/* Copyright 2015, 2016, Michele Santullo + * This file is part of "dindexer". + * + * "dindexer" is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * "dindexer" is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with "dindexer". If not, see . + */ + +#ifndef id9CF52D31E3D04CC99591E8BE3F83A4EF +#define id9CF52D31E3D04CC99591E8BE3F83A4EF + +#cmakedefine DINDEXER_INST_MODE + +#if defined(DINDEXER_INST_MODE) +# define QML_PATH "@CMAKE_INSTALL_PREFIX@/@DINDEXER_CURR_QML_PATH@" +#else +# define QML_PATH "@DINDEXER_CURR_QML_PATH@" +#endif + +#endif diff --git a/src/gui/main.cpp b/src/gui/main.cpp index e3a19d4..93d071d 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -17,6 +17,7 @@ #include "searcher.hpp" #include "dindexerConfig.h" +#include "dindexer-guiConfig.h" #include "dindexer-common/settings.hpp" #include #include @@ -24,10 +25,46 @@ #include #include +//namespace { +// std::string replace_dindexer_path (const char* parPath, const std::map& parDict) a_pure; +// +// std::string replace_dindexer_path (const char* parPath, const std::map& parDict) { +// assert(parPath); +// std::string retval(parPath); +// +// std::size_t from = 0; +// while ((from = retval.find('%', from)) != std::string::npos) { +// if (retval.size() - 1 == from) +// break; +// if ('%' == retval[from + 1]) { +// from += 2; +// continue; +// } +// +// const auto to = retval.find('%', from + 1); +// if (std::string::npos == to) +// break; +// +// assert(to - from + 1 > 2); +// const auto& val = parDict.at(retval.substr(from + 1, to - from - 1)); +// retval.replace(from, to - from + 1, val); +// } +// if (not retval.empty() and retval.back() != '/') +// retval += '/'; +// return retval; +// } +//} //unnamed namespace + int main (int parArgc, char* parArgv[]) { QApplication app(parArgc, parArgv); QQmlApplicationEngine engine; - engine.load(QUrl::fromLocalFile("/home/michele/dev/code/cpp/dindexer/src/gui/qml/mainwin.qml")); + //const auto qml_path = replace_dindexer_path( + // QML_PATH, + // { {"APP_PATH", QCoreApplication::applicationDirPath().toStdString()} } + //) + "mainwin.qml"; + + //engine.load(QUrl::fromLocalFile(QString::fromUtf8(qml_path.c_str(), qml_path.size()))); + engine.load(QUrl::fromLocalFile(QML_PATH "/mainwin.qml")); dinlib::Settings settings; try { diff --git a/src/main/builtin_feats.c b/src/main/builtin_feats.c index e65d9c3..aded5ce 100644 --- a/src/main/builtin_feats.c +++ b/src/main/builtin_feats.c @@ -36,6 +36,11 @@ void print_builtin_feats() { printf("NDEBUG = yes (Release build)\n"); #else printf("NDEBUG = no (Debug build)\n"); +#endif +#if defined(DINDEXER_INST_MODE) + printf("INSTALL_MODE = yes\n"); +#else + printf("INSTALL_MODE = no\n"); #endif printf("Built on %s (CMake %s)\n", CMAKE_SYSTEM, CMAKE_VERSION); printf("C compiler = %s %s\n", CMAKE_C_COMPILER_ID, CMAKE_C_COMPILER_VERSION);