Compare commits
No commits in common. "a4d00ed80b939acdc41ba4818edb85cec2bb925f" and "44cd25464f2c565fb7e16bf04961da9278e57f31" have entirely different histories.
a4d00ed80b
...
44cd25464f
@ -23,7 +23,11 @@ endif()
|
|||||||
|
|
||||||
include(CMLibCommon)
|
include(CMLibCommon)
|
||||||
|
|
||||||
|
option(MYXLIB_BUILD_LIBRARIES "Build libraries" OFF)
|
||||||
|
if(MYXLIB_BUILD_LIBRARIES)
|
||||||
option(MYXLIB_BUILD_EXAMPLES "Build examples" OFF)
|
option(MYXLIB_BUILD_EXAMPLES "Build examples" OFF)
|
||||||
|
endif()
|
||||||
|
option(MYXLIB_BUILD_EXAMPLES_HO "Build examples using header only version" OFF)
|
||||||
|
|
||||||
# Поиск библиотек с помощью pkgconfig
|
# Поиск библиотек с помощью pkgconfig
|
||||||
find_package(PkgConfig REQUIRED)
|
find_package(PkgConfig REQUIRED)
|
||||||
@ -41,12 +45,10 @@ add_subdirectory(src/myx/filesystem)
|
|||||||
add_subdirectory(src/myx/qt)
|
add_subdirectory(src/myx/qt)
|
||||||
|
|
||||||
# Примеры
|
# Примеры
|
||||||
if(MYXLIB_BUILD_EXAMPLES)
|
if(MYXLIB_BUILD_EXAMPLES OR MYXLIB_BUILD_EXAMPLES_HO)
|
||||||
add_subdirectory(examples/base)
|
add_subdirectory(examples/base)
|
||||||
add_subdirectory(examples/filesystem)
|
add_subdirectory(examples/filesystem)
|
||||||
add_subdirectory(examples/qt)
|
add_subdirectory(examples/qt)
|
||||||
add_custom_target(examples example-base-endian example-filesystem-paths example-qt-tranlators
|
|
||||||
example-qt-posix-signal-watcher)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Документация
|
# Документация
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# Название основной цели в текущем каталоге
|
# Название основной цели в текущем каталоге
|
||||||
set(TRGT example-base-endian)
|
set(TRGT example-endian-minimal)
|
||||||
|
|
||||||
# Список файлов исходных текстов
|
# Список файлов исходных текстов
|
||||||
set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/endian.cpp)
|
set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/endian.cpp)
|
||||||
@ -50,3 +50,28 @@ if(MYXLIB_BUILD_EXAMPLES)
|
|||||||
# Правила для установки
|
# Правила для установки
|
||||||
install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_EXAMPLES_HO)
|
||||||
|
# Цель для создания исполняемого файла
|
||||||
|
add_executable(${TRGT}-ho ${TRGT_cpp} ${TRGT_qrc})
|
||||||
|
common_target_properties(${TRGT}-ho)
|
||||||
|
|
||||||
|
target_include_directories(${TRGT}-ho PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
|
target_include_directories(${TRGT}-ho SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
add_dependencies(${TRGT}-ho base-header-only)
|
||||||
|
|
||||||
|
target_link_libraries(${TRGT}-ho Qt5::Core)
|
||||||
|
target_link_libraries(${TRGT}-ho Threads::Threads)
|
||||||
|
|
||||||
|
# Имя выходного файла для цели
|
||||||
|
set_target_properties(${TRGT}-ho PROPERTIES OUTPUT_NAME endian-minimal-ho)
|
||||||
|
|
||||||
|
add_sanitizers(${TRGT}-ho)
|
||||||
|
cotire(${TRGT}-ho)
|
||||||
|
|
||||||
|
add_dependencies(${TRGT}-ho create_auxilary_symlinks)
|
||||||
|
|
||||||
|
# Правила для установки
|
||||||
|
install(TARGETS ${TRGT}-ho COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
|
endif()
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
#define CMLIB_PROJECT_NAME "myxlib"
|
#define CMLIB_PROJECT_NAME "myxlib"
|
||||||
|
|
||||||
|
namespace MB = myx::base;
|
||||||
|
|
||||||
|
|
||||||
int main( int argc, char** argv )
|
int main( int argc, char** argv )
|
||||||
{
|
{
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
# Название основной цели в текущем каталоге
|
# Название основной цели в текущем каталоге
|
||||||
set(TRGT example-filesystem-paths)
|
set(TRGT example-filesystem-minimal)
|
||||||
|
|
||||||
# Список файлов исходных текстов
|
# Список файлов исходных текстов
|
||||||
set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/paths.cpp)
|
set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/minimal.cpp)
|
||||||
|
|
||||||
if(MYXLIB_BUILD_EXAMPLES)
|
if(MYXLIB_BUILD_EXAMPLES)
|
||||||
# Путь поиска библиотек внутри проекта
|
# Путь поиска библиотек внутри проекта
|
||||||
@ -50,3 +50,28 @@ if(MYXLIB_BUILD_EXAMPLES)
|
|||||||
# Правила для установки
|
# Правила для установки
|
||||||
install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_EXAMPLES_HO)
|
||||||
|
# Цель для создания исполняемого файла
|
||||||
|
add_executable(${TRGT}-ho ${TRGT_cpp} ${TRGT_qrc})
|
||||||
|
common_target_properties(${TRGT}-ho)
|
||||||
|
|
||||||
|
target_include_directories(${TRGT}-ho PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
|
target_include_directories(${TRGT}-ho SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
add_dependencies(${TRGT}-ho base-header-only filesystem-header-only)
|
||||||
|
|
||||||
|
target_link_libraries(${TRGT}-ho Qt5::Core)
|
||||||
|
target_link_libraries(${TRGT}-ho Threads::Threads)
|
||||||
|
|
||||||
|
# Имя выходного файла для цели
|
||||||
|
set_target_properties(${TRGT}-ho PROPERTIES OUTPUT_NAME filesystem-minimal-ho)
|
||||||
|
|
||||||
|
add_sanitizers(${TRGT}-ho)
|
||||||
|
cotire(${TRGT}-ho)
|
||||||
|
|
||||||
|
add_dependencies(${TRGT}-ho create_auxilary_symlinks)
|
||||||
|
|
||||||
|
# Правила для установки
|
||||||
|
install(TARGETS ${TRGT}-ho COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
|
endif()
|
@ -1 +1 @@
|
|||||||
add_subdirectory(01_paths)
|
add_subdirectory(01_minimal)
|
||||||
|
@ -11,6 +11,7 @@ qt5_translation(
|
|||||||
LANGUAGES ru_RU)
|
LANGUAGES ru_RU)
|
||||||
|
|
||||||
if(MYXLIB_BUILD_EXAMPLES)
|
if(MYXLIB_BUILD_EXAMPLES)
|
||||||
|
|
||||||
# Путь поиска библиотек внутри проекта
|
# Путь поиска библиотек внутри проекта
|
||||||
link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
|
link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
|
||||||
|
|
||||||
@ -57,3 +58,28 @@ if(MYXLIB_BUILD_EXAMPLES)
|
|||||||
# Правила для установки
|
# Правила для установки
|
||||||
install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_EXAMPLES_HO)
|
||||||
|
# Цель для создания исполняемого файла
|
||||||
|
add_executable(${TRGT}-ho ${TRGT_cpp} ${TRGT_qrc})
|
||||||
|
common_target_properties(${TRGT}-ho)
|
||||||
|
|
||||||
|
target_include_directories(${TRGT}-ho PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
|
target_include_directories(${TRGT}-ho SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
add_dependencies(${TRGT}-ho base-header-only qt-header-only)
|
||||||
|
|
||||||
|
target_link_libraries(${TRGT}-ho Qt5::Core)
|
||||||
|
target_link_libraries(${TRGT}-ho Threads::Threads)
|
||||||
|
|
||||||
|
# Имя выходного файла для цели
|
||||||
|
set_target_properties(${TRGT}-ho PROPERTIES OUTPUT_NAME qt-translators-ho)
|
||||||
|
|
||||||
|
add_sanitizers(${TRGT}-ho)
|
||||||
|
cotire(${TRGT}-ho)
|
||||||
|
|
||||||
|
add_dependencies(${TRGT}-ho create_auxilary_symlinks)
|
||||||
|
|
||||||
|
# Правила для установки
|
||||||
|
install(TARGETS ${TRGT}-ho COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
|
endif()
|
||||||
|
@ -1,53 +0,0 @@
|
|||||||
# Название основной цели в текущем каталоге
|
|
||||||
set(TRGT example-qt-posix-signal-watcher)
|
|
||||||
|
|
||||||
# Список файлов исходных текстов
|
|
||||||
set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/posix_signal_watcher.cpp)
|
|
||||||
|
|
||||||
if(MYXLIB_BUILD_EXAMPLES)
|
|
||||||
# Путь поиска библиотек внутри проекта
|
|
||||||
link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
|
|
||||||
|
|
||||||
# Цель для создания исполняемого файла
|
|
||||||
add_executable(${TRGT} ${TRGT_cpp})
|
|
||||||
common_target_properties(${TRGT})
|
|
||||||
|
|
||||||
# Создание цели для проверки утилитой clang-tidy
|
|
||||||
add_clang_tidy_check(${TRGT} ${TRGT_cpp})
|
|
||||||
|
|
||||||
# Создание цели для проверки утилитой clang-analyze
|
|
||||||
add_clang_analyze_check(${TRGT} ${TRGT_cpp})
|
|
||||||
|
|
||||||
# Создание цели для проверки утилитой clazy
|
|
||||||
add_clazy_check(${TRGT} ${TRGT_cpp})
|
|
||||||
|
|
||||||
# Создание цели для проверки утилитой pvs-studio
|
|
||||||
add_pvs_check(${TRGT})
|
|
||||||
|
|
||||||
# Создание цели для автоматического форматирования кода
|
|
||||||
add_format_sources(${TRGT} ${TRGT_cpp})
|
|
||||||
|
|
||||||
# Qt5
|
|
||||||
target_include_directories(${TRGT} PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
|
||||||
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
|
||||||
add_dependencies(${TRGT} base qt)
|
|
||||||
|
|
||||||
target_link_libraries(${TRGT} base_static qt_static)
|
|
||||||
|
|
||||||
target_link_libraries(${TRGT} Qt5::Core)
|
|
||||||
target_link_libraries(${TRGT} Threads::Threads)
|
|
||||||
|
|
||||||
# Имя выходного файла для цели
|
|
||||||
set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME qt-posix-signal-watcher)
|
|
||||||
|
|
||||||
add_sanitizers(${TRGT})
|
|
||||||
|
|
||||||
cotire(${TRGT})
|
|
||||||
|
|
||||||
add_dependencies(${TRGT} create_auxilary_symlinks)
|
|
||||||
|
|
||||||
# Правила для установки
|
|
||||||
install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
|
||||||
endif()
|
|
@ -1,21 +0,0 @@
|
|||||||
#include <myx/qt/posix_signal_watcher.hpp>
|
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
namespace MQ = myx::qt;
|
|
||||||
|
|
||||||
int main( int argc, char* argv[] )
|
|
||||||
{
|
|
||||||
QCoreApplication app( argc, argv );
|
|
||||||
qDebug() << "Hello from process" << QCoreApplication::applicationPid();
|
|
||||||
|
|
||||||
MQ::PosixSignalWatcher sigwatch;
|
|
||||||
sigwatch.watchForSignal( SIGINT );
|
|
||||||
sigwatch.watchForSignal( SIGTERM );
|
|
||||||
QObject::connect( &sigwatch, &MQ::PosixSignalWatcher::posixSignal, &app, &QCoreApplication::quit );
|
|
||||||
|
|
||||||
int exitcode = app.exec();
|
|
||||||
qDebug() << "Goodbye";
|
|
||||||
return( exitcode );
|
|
||||||
}
|
|
@ -1,2 +1 @@
|
|||||||
add_subdirectory(01_translators)
|
add_subdirectory(01_translators)
|
||||||
add_subdirectory(02_posix-signal-watcher)
|
|
||||||
|
@ -17,6 +17,12 @@ set(TRGT_hpp
|
|||||||
set(TRGT_headers ${TRGT_hpp})
|
set(TRGT_headers ${TRGT_hpp})
|
||||||
# cmake-format: on
|
# cmake-format: on
|
||||||
|
|
||||||
|
add_library(${TRGT}-header-only INTERFACE)
|
||||||
|
target_include_directories(
|
||||||
|
${TRGT}-header-only SYSTEM INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
|
||||||
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_LIBRARIES)
|
||||||
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
||||||
common_target_properties(${TRGT})
|
common_target_properties(${TRGT})
|
||||||
|
|
||||||
@ -35,12 +41,16 @@ add_pvs_check(${TRGT})
|
|||||||
# Создание цели для автоматического форматирования кода
|
# Создание цели для автоматического форматирования кода
|
||||||
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
||||||
|
|
||||||
|
target_compile_definitions(${TRGT} PUBLIC MYXLIB_BUILD_LIBRARIES)
|
||||||
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
|
|
||||||
install(TARGETS ${TRGT}_static COMPONENT libs-dev ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
install(TARGETS ${TRGT}_static COMPONENT libs-dev ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
if(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
install(TARGETS ${TRGT}_shared COMPONENT main LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
install(TARGETS ${TRGT}_shared COMPONENT main LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
endif()
|
endif()
|
||||||
|
else()
|
||||||
|
install(FILES ${TRGT_cpp} COMPONENT base-dev DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
||||||
|
endif()
|
||||||
|
|
||||||
generate_pkgconfig(myx-${TRGT} COMPONENT base-dev INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES})
|
generate_pkgconfig(myx-${TRGT} COMPONENT base-dev INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES})
|
||||||
install(FILES ${TRGT_headers} ${CMAKE_BINARY_DIR}/include/myx/base/compiler_features.hpp COMPONENT base-dev
|
install(FILES ${TRGT_headers} ${CMAKE_BINARY_DIR}/include/myx/base/compiler_features.hpp COMPONENT base-dev
|
||||||
|
@ -1 +1,10 @@
|
|||||||
|
#ifndef MYX_BASE_CONFIG_CPP_
|
||||||
|
#define MYX_BASE_CONFIG_CPP_
|
||||||
|
|
||||||
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
#include <myx/base/config.hpp>
|
#include <myx/base/config.hpp>
|
||||||
|
#else
|
||||||
|
#pragma once
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // MYX_BASE_CONFIG_CPP_
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef MYXLIB_BUILD_LIBRARIES
|
||||||
|
#undef MYXLIB_HEADER_ONLY
|
||||||
|
|
||||||
#if defined( _WIN32 ) && defined( MYXLIB_SHARED_LIB )
|
#if defined( _WIN32 ) && defined( MYXLIB_SHARED_LIB )
|
||||||
#ifdef myxlib_EXPORTS
|
#ifdef myxlib_EXPORTS
|
||||||
#define MYXLIB_API __declspec( dllexport )
|
#define MYXLIB_API __declspec( dllexport )
|
||||||
@ -13,5 +16,14 @@
|
|||||||
#define MYXLIB_API
|
#define MYXLIB_API
|
||||||
#endif
|
#endif
|
||||||
#define MYXLIB_INLINE
|
#define MYXLIB_INLINE
|
||||||
|
#else
|
||||||
|
#define MYXLIB_HEADER_ONLY
|
||||||
|
#define MYXLIB_API
|
||||||
|
#define MYXLIB_INLINE inline
|
||||||
|
#endif // ifdef MYXLIB_BUILD_LIBRARIES
|
||||||
|
|
||||||
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "config.cpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // MYX_BASE_CONFIG_HPP_
|
#endif // MYX_BASE_CONFIG_HPP_
|
||||||
|
@ -49,8 +49,8 @@ protected:
|
|||||||
|
|
||||||
static T transform( const T& b )
|
static T transform( const T& b )
|
||||||
{
|
{
|
||||||
const uint16_t k_i = 1;
|
const uint16_t i = 1;
|
||||||
return( ( reinterpret_cast< const char& >( k_i ) == 1 ) ? b : EndianTypesBase< T >::swapBytes( b ) );
|
return( ( reinterpret_cast< const char& >( i ) == 1 ) ? b : EndianTypesBase< T >::swapBytes( b ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -110,8 +110,8 @@ protected:
|
|||||||
|
|
||||||
static T transform( const T& b )
|
static T transform( const T& b )
|
||||||
{
|
{
|
||||||
const uint16_t k_i = 1;
|
const uint16_t i = 1;
|
||||||
return( ( reinterpret_cast< const char& >( k_i ) == 1 ) ? EndianTypesBase< T >::swapBytes( b ) : b );
|
return( ( reinterpret_cast< const char& >( i ) == 1 ) ? EndianTypesBase< T >::swapBytes( b ) : b );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,6 +11,13 @@ set(TRGT_hpp ${CMAKE_CURRENT_SOURCE_DIR}/paths.hpp)
|
|||||||
set(TRGT_headers ${TRGT_hpp})
|
set(TRGT_headers ${TRGT_hpp})
|
||||||
# cmake-format: on
|
# cmake-format: on
|
||||||
|
|
||||||
|
add_library(${TRGT}-header-only INTERFACE)
|
||||||
|
target_include_directories(
|
||||||
|
${TRGT}-header-only SYSTEM INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
|
||||||
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_LIBRARIES)
|
||||||
|
|
||||||
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
||||||
common_target_properties(${TRGT})
|
common_target_properties(${TRGT})
|
||||||
|
|
||||||
@ -29,6 +36,7 @@ add_pvs_check(${TRGT})
|
|||||||
# Создание цели для автоматического форматирования кода
|
# Создание цели для автоматического форматирования кода
|
||||||
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
||||||
|
|
||||||
|
target_compile_definitions(${TRGT} PUBLIC MYXLIB_BUILD_LIBRARIES)
|
||||||
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||||
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
cotire(${TRGT})
|
cotire(${TRGT})
|
||||||
@ -37,10 +45,12 @@ install(TARGETS ${TRGT}_static COMPONENT libs-dev ARCHIVE DESTINATION ${CMAKE_IN
|
|||||||
if(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
install(TARGETS ${TRGT}_shared COMPONENT main LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
install(TARGETS ${TRGT}_shared COMPONENT main LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
endif()
|
endif()
|
||||||
|
else()
|
||||||
|
install(FILES ${TRGT_cpp} COMPONENT base-dev DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
||||||
|
endif()
|
||||||
|
|
||||||
generate_pkgconfig(myx-${TRGT} COMPONENT base-dev INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES})
|
generate_pkgconfig(myx-${TRGT} COMPONENT base-dev INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES})
|
||||||
install(FILES ${TRGT_headers} COMPONENT base-dev
|
install(FILES ${TRGT_headers} COMPONENT base-dev DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
||||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
|
||||||
|
|
||||||
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
||||||
add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=base-dev -P
|
add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=base-dev -P
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
#ifndef MYX_BASE_PATHS_CPP_
|
#ifndef MYX_BASE_PATHS_CPP_
|
||||||
#define MYX_BASE_PATHS_CPP_
|
#define MYX_BASE_PATHS_CPP_
|
||||||
|
|
||||||
#include <myx/base/config.hpp>
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
#include <myx/filesystem/paths.hpp>
|
#include <myx/filesystem/paths.hpp>
|
||||||
|
#else
|
||||||
|
#pragma once
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
|
||||||
#include <paths.h>
|
#include <paths.h>
|
||||||
|
|
||||||
|
@ -232,4 +232,8 @@ public:
|
|||||||
|
|
||||||
} // namespace myx
|
} // namespace myx
|
||||||
|
|
||||||
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "paths.cpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // MYX_FILESYSTEM_PATHS_HPP_
|
#endif // MYX_FILESYSTEM_PATHS_HPP_
|
||||||
|
@ -4,30 +4,23 @@ set(TRGT qt)
|
|||||||
# cmake-format: off
|
# cmake-format: off
|
||||||
# Список файлов исходных текстов
|
# Список файлов исходных текстов
|
||||||
set(TRGT_cpp
|
set(TRGT_cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/posix_signal_watcher.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/translators.cpp)
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/translators.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
set(TRGT_moc_hpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/posix_signal_watcher.hpp
|
|
||||||
)
|
|
||||||
|
|
||||||
set(TRGT_moc_private_hpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/posix_signal_watcher_p.hpp
|
|
||||||
)
|
|
||||||
|
|
||||||
|
# Список заголовочных файлов (используется для установки)
|
||||||
set(TRGT_hpp
|
set(TRGT_hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/backports.hpp
|
${CMAKE_CURRENT_SOURCE_DIR}/backports.hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/translators.hpp
|
${CMAKE_CURRENT_SOURCE_DIR}/translators.hpp)
|
||||||
)
|
|
||||||
|
|
||||||
set(TRGT_headers ${TRGT_moc_hpp} ${TRGT_hpp})
|
set(TRGT_headers ${TRGT_hpp})
|
||||||
# cmake-format: on
|
# cmake-format: on
|
||||||
|
|
||||||
qt5_wrap_cpp(TRGT_moc_cpp ${TRGT_moc_private_hpp} ${TRGT_moc_hpp})
|
add_library(${TRGT}-header-only INTERFACE)
|
||||||
|
target_include_directories(
|
||||||
|
${TRGT}-header-only SYSTEM INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
|
||||||
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||||
|
|
||||||
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_moc_cpp}
|
if(MYXLIB_BUILD_LIBRARIES)
|
||||||
${TRGT_moc_private_hpp} ${TRGT_headers})
|
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
||||||
common_target_properties(${TRGT})
|
common_target_properties(${TRGT})
|
||||||
|
|
||||||
# Создание цели для проверки утилитой clang-tidy
|
# Создание цели для проверки утилитой clang-tidy
|
||||||
@ -43,21 +36,23 @@ add_clazy_check(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
|||||||
add_pvs_check(${TRGT})
|
add_pvs_check(${TRGT})
|
||||||
|
|
||||||
# Создание цели для автоматического форматирования кода
|
# Создание цели для автоматического форматирования кода
|
||||||
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers} ${TRGT_moc_private_hpp})
|
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
||||||
|
|
||||||
|
target_compile_definitions(${TRGT} PUBLIC MYXLIB_BUILD_LIBRARIES)
|
||||||
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||||
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
target_include_directories(${TRGT} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
|
||||||
cotire(${TRGT})
|
cotire(${TRGT})
|
||||||
|
|
||||||
install(TARGETS ${TRGT}_static COMPONENT libs-dev ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
install(TARGETS ${TRGT}_static COMPONENT libs-dev ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
if(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
install(TARGETS ${TRGT}_shared COMPONENT main LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
install(TARGETS ${TRGT}_shared COMPONENT main LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
endif()
|
endif()
|
||||||
|
else()
|
||||||
|
install(FILES ${TRGT_cpp} COMPONENT base-dev DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
||||||
|
endif()
|
||||||
|
|
||||||
generate_pkgconfig(myx-${TRGT} COMPONENT base-dev INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES})
|
generate_pkgconfig(myx-${TRGT} COMPONENT base-dev INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES})
|
||||||
install(FILES ${TRGT_headers} COMPONENT base-dev
|
install(FILES ${TRGT_headers} COMPONENT base-dev DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
||||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
|
||||||
|
|
||||||
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
||||||
add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=base-dev -P
|
add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=base-dev -P
|
||||||
|
@ -1,131 +0,0 @@
|
|||||||
#ifndef MYX_QT_POSIX_SIGNAL_WATCHER_CPP_
|
|
||||||
#define MYX_QT_POSIX_SIGNAL_WATCHER_CPP_
|
|
||||||
|
|
||||||
#include <myx/base/config.hpp>
|
|
||||||
|
|
||||||
#include <myx/qt/posix_signal_watcher.hpp>
|
|
||||||
#include <myx/qt/posix_signal_watcher_p.hpp>
|
|
||||||
|
|
||||||
namespace myx {
|
|
||||||
|
|
||||||
namespace qt {
|
|
||||||
|
|
||||||
std::array< int, 2 > PosixSignalWatcherPrivate::mSockpair = { 0, 0 };
|
|
||||||
|
|
||||||
PosixSignalWatcherPrivate::~PosixSignalWatcherPrivate() = default;
|
|
||||||
|
|
||||||
PosixSignalWatcherPrivate::PosixSignalWatcherPrivate( PosixSignalWatcher* q ) :
|
|
||||||
q_ptr( q )
|
|
||||||
{
|
|
||||||
#if MYX_QT_HAS_POSIX_SIGNALS
|
|
||||||
// Create socket pair
|
|
||||||
if ( ::socketpair( AF_UNIX, SOCK_STREAM, 0, mSockpair.data() ) != 0 )
|
|
||||||
{
|
|
||||||
qDebug() << "PosixSignalWatcher: socketpair: " << ::strerror( errno );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Create a notifier for the read end of the pair
|
|
||||||
m_notifier.reset( new QSocketNotifier( mSockpair[1], QSocketNotifier::Read ) );
|
|
||||||
|
|
||||||
|
|
||||||
// Called when the signal handler has written to the socket pair.
|
|
||||||
// Emits the Posix signal as a Qt signal.
|
|
||||||
connect( m_notifier.get(), &QSocketNotifier::activated, q, [this]( int sockfd ) {
|
|
||||||
Q_Q( PosixSignalWatcher );
|
|
||||||
|
|
||||||
int signal = 0;
|
|
||||||
(void)::read( sockfd, &signal, sizeof( signal ) );
|
|
||||||
qDebug() << "Caught signal: " << ::strsignal( signal );
|
|
||||||
Q_EMIT q->posixSignal( signal );
|
|
||||||
} );
|
|
||||||
|
|
||||||
|
|
||||||
m_notifier->setEnabled( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Registers a handler for the given Posix \a signal. The handler will write to
|
|
||||||
* a socket pair, the other end of which is connected to a QSocketNotifier.
|
|
||||||
* This provides a way to break out of the asynchronous context from which the
|
|
||||||
* signal handler is called and back into the Qt event loop.
|
|
||||||
*/
|
|
||||||
MYXLIB_INLINE void PosixSignalWatcherPrivate::watchForSignal( int signal )
|
|
||||||
{
|
|
||||||
if ( m_watchedSignals.contains( signal ) )
|
|
||||||
{
|
|
||||||
qDebug() << "Already watching for signal " << signal;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if MYX_QT_HAS_POSIX_SIGNALS
|
|
||||||
// Register a sigaction which will write to the socket pair
|
|
||||||
struct sigaction sigact {};
|
|
||||||
sigact.sa_handler = PosixSignalWatcherPrivate::signalHandler;
|
|
||||||
sigact.sa_flags = 0;
|
|
||||||
sigemptyset( &sigact.sa_mask );
|
|
||||||
sigact.sa_flags |= SA_RESTART;
|
|
||||||
if ( ::sigaction( signal, &sigact, nullptr ) != 0 )
|
|
||||||
{
|
|
||||||
qDebug() << "PosixSignalWatcher: sigaction: " << ::strerror( errno );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
m_watchedSignals.append( signal );
|
|
||||||
} // PosixSignalWatcherPrivate::watchForSignal
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Called when a Posix \a signal is received. Write to the socket to wake up the
|
|
||||||
* QSocketNotifier.
|
|
||||||
*/
|
|
||||||
MYXLIB_INLINE void PosixSignalWatcherPrivate::signalHandler( int signal )
|
|
||||||
{
|
|
||||||
(void)::write( mSockpair[0], &signal, sizeof( signal ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Create a new PosixSignalWatcher as a child of the given \a parent.
|
|
||||||
*/
|
|
||||||
MYXLIB_INLINE PosixSignalWatcher::PosixSignalWatcher( QObject* parent ) :
|
|
||||||
QObject( parent ),
|
|
||||||
d_ptr ( new PosixSignalWatcherPrivate( this ) )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MYXLIB_INLINE PosixSignalWatcher::~PosixSignalWatcher() = default;
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Register a signal handler for the given \a signal.
|
|
||||||
*
|
|
||||||
* After calling this method you can \c connect() to the POSIXSignal() Qt signal
|
|
||||||
* to be notified when the Posix signal is received.
|
|
||||||
*/
|
|
||||||
MYXLIB_INLINE void PosixSignalWatcher::watchForSignal( int signal )
|
|
||||||
{
|
|
||||||
Q_D( PosixSignalWatcher );
|
|
||||||
d->watchForSignal( signal );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \fn void PosixSignalWatcher::posixSignal(int signal)
|
|
||||||
* Emitted when the given Posix \a signal is received.
|
|
||||||
*
|
|
||||||
* watchForSignal() must be called for each Posix signal that you want to receive
|
|
||||||
* via the POSIXSignal() Qt signal. If a watcher is watching multiple signals,
|
|
||||||
* POSIXSignal() will be emitted whenever *any* of the watched Posix signals are
|
|
||||||
* received, and the \a signal argument can be inspected to find out which one
|
|
||||||
* was actually received.
|
|
||||||
*/
|
|
||||||
|
|
||||||
} // namespace qt
|
|
||||||
|
|
||||||
} // namespace myx
|
|
||||||
|
|
||||||
#endif // ifndef MYX_QT_POSIX_SIGNAL_WATCHER_CPP_
|
|
@ -1,50 +0,0 @@
|
|||||||
#ifndef MYX_QT_POSIX_SIGNAL_WATCHER_HPP_
|
|
||||||
#define MYX_QT_POSIX_SIGNAL_WATCHER_HPP_
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <myx/base/config.hpp>
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
|
|
||||||
#include <csignal>
|
|
||||||
|
|
||||||
namespace myx {
|
|
||||||
|
|
||||||
namespace qt {
|
|
||||||
|
|
||||||
class PosixSignalWatcherPrivate;
|
|
||||||
|
|
||||||
#if defined( Q_OS_WIN )
|
|
||||||
const int SIGINT = 2;
|
|
||||||
const int SIGTERM = 15;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief The PosixSignalWatcher class converts Posix signals to Qt signals.
|
|
||||||
*
|
|
||||||
* To watch for a given signal, e.g. \c SIGINT, call \c watchForSignal(SIGINT)
|
|
||||||
* and \c connect() your handler to posixSignal().
|
|
||||||
*/
|
|
||||||
class PosixSignalWatcher : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit PosixSignalWatcher( QObject* parent = nullptr );
|
|
||||||
~PosixSignalWatcher() override;
|
|
||||||
|
|
||||||
void watchForSignal( int signal );
|
|
||||||
Q_SIGNAL void posixSignal( int signal );
|
|
||||||
|
|
||||||
private:
|
|
||||||
PosixSignalWatcherPrivate* const d_ptr = nullptr;
|
|
||||||
Q_DECLARE_PRIVATE( PosixSignalWatcher )
|
|
||||||
}; // class PosixSignalWatcher
|
|
||||||
|
|
||||||
} // namespace qt
|
|
||||||
|
|
||||||
} // namespace myx
|
|
||||||
|
|
||||||
#endif // ifndef MYX_QT_POSIX_SIGNAL_WATCHER_HPP_
|
|
@ -1,63 +0,0 @@
|
|||||||
#ifndef MYX_QT_POSIX_SIGNAL_WATCHER_P_HPP_
|
|
||||||
#define MYX_QT_POSIX_SIGNAL_WATCHER_P_HPP_
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <myx/base/config.hpp>
|
|
||||||
#include <myx/qt/posix_signal_watcher.hpp>
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QMap>
|
|
||||||
#include <QSocketNotifier>
|
|
||||||
#include <QtDebug>
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
#define MYX_QT_HAS_POSIX_SIGNALS 0
|
|
||||||
#else
|
|
||||||
#define MYX_QT_HAS_POSIX_SIGNALS 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if MYX_QT_HAS_POSIX_SIGNALS
|
|
||||||
#include <csignal>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <cerrno>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace myx {
|
|
||||||
|
|
||||||
namespace qt {
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief The PosixSignalWatcherPrivate class implements the back-end signal
|
|
||||||
* handling for the PosixSignalWatcher.
|
|
||||||
*
|
|
||||||
* \see http://qt-project.org/doc/qt-5.0/qtdoc/POSIX-signals.html
|
|
||||||
*/
|
|
||||||
class PosixSignalWatcherPrivate : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
PosixSignalWatcherPrivate( PosixSignalWatcher* q );
|
|
||||||
~PosixSignalWatcherPrivate();
|
|
||||||
|
|
||||||
void watchForSignal( int signal );
|
|
||||||
static void signalHandler( int signal );
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DECLARE_PUBLIC( PosixSignalWatcher )
|
|
||||||
|
|
||||||
PosixSignalWatcher* const q_ptr = nullptr;
|
|
||||||
static std::array< int, 2 > mSockpair;
|
|
||||||
std::unique_ptr< QSocketNotifier > m_notifier;
|
|
||||||
QList< int > m_watchedSignals;
|
|
||||||
}; // class PosixSignalWatcherPrivate
|
|
||||||
|
|
||||||
} // namespace qt
|
|
||||||
|
|
||||||
} // namespace myx
|
|
||||||
|
|
||||||
#endif // ifndef MYX_QT_POSIX_SIGNAL_WATCHER_P_HPP_
|
|
@ -2,7 +2,12 @@
|
|||||||
#define MYX_QT_TRANSLATORS_CPP_
|
#define MYX_QT_TRANSLATORS_CPP_
|
||||||
|
|
||||||
#include <myx/base/config.hpp>
|
#include <myx/base/config.hpp>
|
||||||
|
|
||||||
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
#include <myx/qt/translators.hpp>
|
#include <myx/qt/translators.hpp>
|
||||||
|
#else
|
||||||
|
#pragma once
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QLibraryInfo>
|
#include <QLibraryInfo>
|
||||||
|
@ -20,4 +20,8 @@ void append_translators( QTranslatorsList& translators, const QString& appName )
|
|||||||
|
|
||||||
} // namespace myx
|
} // namespace myx
|
||||||
|
|
||||||
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "translators.cpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // ifndef MYX_QT_TRANSLATORS_HPP_
|
#endif // ifndef MYX_QT_TRANSLATORS_HPP_
|
||||||
|
Loading…
Reference in New Issue
Block a user