2023-07-23 20:57:35 +02:00
cmake_minimum_required ( VERSION 3.17.0 FATAL_ERROR )
2015-12-05 22:47:49 +01:00
2019-07-20 16:06:37 +02:00
project ( c++utilities )
2015-12-08 08:32:57 +01:00
# add project files
set ( HEADER_FILES
a p p l i c a t i o n / a r g u m e n t p a r s e r . h
a p p l i c a t i o n / c o m m a n d l i n e u t i l s . h
a p p l i c a t i o n / f a k e q t c o n f i g a r g u m e n t s . h
a p p l i c a t i o n / g l o b a l . h
c h r o n o / d a t e t i m e . h
c h r o n o / p e r i o d . h
c h r o n o / t i m e s p a n . h
2016-08-30 19:59:04 +02:00
c h r o n o / f o r m a t . h
2015-12-08 08:32:57 +01:00
c o n v e r s i o n / b i n a r y c o n v e r s i o n . h
c o n v e r s i o n / b i n a r y c o n v e r s i o n p r i v a t e . h
c o n v e r s i o n / c o n v e r s i o n e x c e p t i o n . h
c o n v e r s i o n / s t r i n g c o n v e r s i o n . h
2017-01-26 22:15:27 +01:00
c o n v e r s i o n / s t r i n g b u i l d e r . h
2015-12-08 08:32:57 +01:00
i o / a n s i e s c a p e c o d e s . h
i o / b i n a r y r e a d e r . h
i o / b i n a r y w r i t e r . h
i o / b i t r e a d e r . h
2021-07-15 02:24:28 +02:00
i o / b u f f e r s e a r c h . h
2015-12-08 08:32:57 +01:00
i o / c o p y . h
i o / i n i f i l e . h
i o / p a t h . h
2016-12-19 23:29:54 +01:00
i o / n a t i v e f i l e s t r e a m . h
2017-02-03 00:55:15 +01:00
i o / m i s c . h
2019-08-12 20:20:55 +02:00
m i s c / f l a g e n u m c l a s s . h
2019-05-13 22:42:17 +02:00
m i s c / m a t h . h
2018-05-03 00:45:50 +02:00
m i s c / m u l t i a r r a y . h
2019-06-10 16:03:27 +02:00
m i s c / p a r s e e r r o r . h
2016-11-13 22:51:09 +01:00
m i s c / t r a i t s . h
2018-05-05 23:26:53 +02:00
m i s c / l e v e n s h t e i n . h
2016-02-06 02:52:06 +01:00
t e s t s / t e s t u t i l s . h
t e s t s / c p p u n i t . h
2019-02-06 17:30:52 +01:00
t e s t s / o u t p u t c h e c k . h )
2015-12-08 08:32:57 +01:00
set ( SRC_FILES
2018-04-28 12:15:34 +02:00
a p p l i c a t i o n / a r g u m e n t p a r s e r p r i v a t e . h
2015-12-08 08:32:57 +01:00
a p p l i c a t i o n / a r g u m e n t p a r s e r . c p p
a p p l i c a t i o n / c o m m a n d l i n e u t i l s . c p p
a p p l i c a t i o n / f a k e q t c o n f i g a r g u m e n t s . c p p
c h r o n o / d a t e t i m e . c p p
c h r o n o / p e r i o d . c p p
c h r o n o / t i m e s p a n . c p p
c o n v e r s i o n / c o n v e r s i o n e x c e p t i o n . c p p
c o n v e r s i o n / s t r i n g c o n v e r s i o n . c p p
i o / a n s i e s c a p e c o d e s . c p p
i o / b i n a r y r e a d e r . c p p
i o / b i n a r y w r i t e r . c p p
i o / b i t r e a d e r . c p p
2021-07-15 02:24:28 +02:00
i o / b u f f e r s e a r c h . c p p
2015-12-08 08:32:57 +01:00
i o / i n i f i l e . c p p
i o / p a t h . c p p
2016-12-19 23:29:54 +01:00
i o / n a t i v e f i l e s t r e a m . c p p
2017-02-03 00:55:15 +01:00
i o / m i s c . c p p
2019-05-13 22:42:17 +02:00
m i s c / m a t h . c p p
2019-06-10 16:03:27 +02:00
m i s c / p a r s e e r r o r . c p p
2018-05-05 23:26:53 +02:00
m i s c / l e v e n s h t e i n . c p p
2019-02-06 17:30:52 +01:00
t e s t s / t e s t u t i l s . c p p )
2016-04-16 00:50:16 +02:00
2019-02-06 17:30:52 +01:00
set ( TEST_HEADER_FILES )
2016-01-25 23:59:52 +01:00
set ( TEST_SRC_FILES
t e s t s / c p p u n i t . c p p
t e s t s / c o n v e r s i o n t e s t s . c p p
t e s t s / i o t e s t s . c p p
2016-01-27 01:01:43 +01:00
t e s t s / c h r o n o t e s t s . c p p
2016-06-12 01:56:57 +02:00
t e s t s / a r g u m e n t p a r s e r t e s t s . c p p
2017-05-08 19:59:29 +02:00
t e s t s / t r a i t s t e s t s . c p p
2017-08-02 13:29:22 +02:00
t e s t s / m a t h t e s t s . c p p
2019-02-06 17:30:52 +01:00
t e s t s / m i s c t e s t s . c p p )
2015-12-08 08:32:57 +01:00
2016-04-16 00:50:16 +02:00
set ( CMAKE_MODULE_FILES
c m a k e / m o d u l e s / B a s i c C o n f i g . c m a k e
2016-08-03 17:33:26 +02:00
c m a k e / m o d u l e s / C o n f i g H e a d e r . c m a k e
2016-04-16 00:50:16 +02:00
c m a k e / m o d u l e s / L i b r a r y T a r g e t . c m a k e
2020-06-15 22:28:19 +02:00
c m a k e / m o d u l e s / T e s t U t i l i t i e s . c m a k e
2016-04-16 00:50:16 +02:00
c m a k e / m o d u l e s / T e s t T a r g e t . c m a k e
2022-10-08 21:55:24 +02:00
c m a k e / m o d u l e s / A p p U t i l i t i e s . c m a k e
2016-04-16 00:50:16 +02:00
c m a k e / m o d u l e s / A p p T a r g e t . c m a k e
c m a k e / m o d u l e s / W i n d o w s R e s o u r c e s . c m a k e
2016-06-09 22:57:51 +02:00
c m a k e / m o d u l e s / T e m p l a t e F i n d e r . c m a k e
c m a k e / m o d u l e s / D o x y g e n . c m a k e
c m a k e / m o d u l e s / L i s t T o S t r i n g . c m a k e
2016-07-03 22:36:48 +02:00
c m a k e / m o d u l e s / S h e l l C o m p l e t i o n . c m a k e
2022-12-24 23:15:24 +01:00
c m a k e / m o d u l e s / D e v e l U t i l i t i e s . c m a k e
2019-02-06 17:30:52 +01:00
c m a k e / m o d u l e s / 3 r d P a r t y . c m a k e )
2016-04-16 00:50:16 +02:00
set ( CMAKE_TEMPLATE_FILES
2016-09-11 21:02:20 +02:00
c m a k e / t e m p l a t e s / b a s h - c o m p l e t i o n . s h . i n
2016-04-16 00:50:16 +02:00
c m a k e / t e m p l a t e s / C o n f i g . c m a k e . i n
c m a k e / t e m p l a t e s / c o n f i g . h . i n
c m a k e / t e m p l a t e s / d e s k t o p . i n
2018-02-19 19:50:07 +01:00
c m a k e / t e m p l a t e s / a p p d a t a . x m l . i n
2016-06-09 22:57:51 +02:00
c m a k e / t e m p l a t e s / d o x y g e n . i n
2016-09-11 21:02:20 +02:00
c m a k e / t e m p l a t e s / g l o b a l . h . i n
2019-06-16 18:23:42 +02:00
c m a k e / t e m p l a t e s / v e r s i o n . h . i n
2019-02-06 17:30:52 +01:00
c m a k e / t e m p l a t e s / t e m p l a t e . p c . i n )
set ( SCRIPT_FILES )
if ( MINGW )
2023-05-07 21:34:46 +02:00
list ( APPEND SCRIPT_FILES scripts/wine.sh )
endif ( )
if ( WIN32 )
2023-05-16 21:39:10 +02:00
list ( APPEND CMAKE_TEMPLATE_FILES cmake/templates/windows.rc.in cmake/templates/windows-cli-wrapper.rc.in
c m a k e / t e m p l a t e s / c l i - w r a p p e r . c p p )
2023-05-06 22:48:27 +02:00
endif ( )
set ( EXCLUDED_FILES cmake/templates/cli-wrapper.cpp )
2016-04-16 00:50:16 +02:00
2019-02-06 17:30:52 +01:00
set ( DOC_FILES README.md doc/buildvariables.md doc/testapplication.md )
set ( EXTRA_FILES tests/calculateoverallcoverage.awk coding-style.clang-format )
2016-06-10 22:59:22 +02:00
2016-04-16 00:50:16 +02:00
# required to include CMake modules from own project directory
set ( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" "${CMAKE_MODULE_PATH}" )
2015-12-05 22:47:49 +01:00
# meta data
set ( META_PROJECT_NAME c++utilities )
2016-04-16 00:50:16 +02:00
set ( META_PROJECT_VARNAME CPP_UTILITIES )
2015-12-05 22:47:49 +01:00
set ( META_APP_NAME "C++ Utilities" )
set ( META_APP_AUTHOR "Martchus" )
set ( META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}" )
2017-11-04 15:48:47 +01:00
set ( META_APP_DESCRIPTION "Useful C++ classes and routines such as argument parser, IO and conversion utilities" )
2017-07-28 19:31:06 +02:00
set ( META_VERSION_MAJOR 5 )
2023-06-17 22:46:55 +02:00
set ( META_VERSION_MINOR 24 )
2024-02-15 18:40:11 +01:00
set ( META_VERSION_PATCH 7 )
2015-12-05 22:47:49 +01:00
2016-07-27 18:16:51 +02:00
# find required 3rd party libraries
include ( 3rdParty )
2016-08-19 16:13:41 +02:00
use_iconv ( AUTO_LINKAGE REQUIRED )
2016-07-27 18:16:51 +02:00
2018-09-29 18:05:02 +02:00
# configure use of native file buffer and its backend implementation if enabled
2023-08-18 22:57:54 +02:00
set ( REQUIRED_BOOST_COMPONENTS "" )
2019-06-16 18:11:30 +02:00
set ( USE_NATIVE_FILE_BUFFER_BY_DEFAULT OFF )
2019-11-30 17:58:01 +01:00
if ( WIN32
O R A N D R O I D
OR ( UNIX AND NOT APPLE ) )
2019-06-16 18:11:30 +02:00
set ( USE_NATIVE_FILE_BUFFER_BY_DEFAULT ON )
endif ( )
option ( USE_NATIVE_FILE_BUFFER "enables use of native file buffer, affects ABI" ${ USE_NATIVE_FILE_BUFFER_BY_DEFAULT } )
2018-09-29 18:05:02 +02:00
option ( FORCE_BOOST_IOSTREAMS_FOR_NATIVE_FILE_BUFFER "forces use of Boost.Iostreams for native file buffer" OFF )
2019-02-06 17:30:52 +01:00
if ( USE_NATIVE_FILE_BUFFER )
2016-12-19 23:29:54 +01:00
list ( APPEND META_PUBLIC_COMPILE_DEFINITIONS ${ META_PROJECT_VARNAME } _USE_NATIVE_FILE_BUFFER )
2019-05-04 15:49:41 +02:00
set ( NATIVE_FILE_STREAM_IMPL_FILES io/nativefilestream.cpp tests/iotests.cpp )
2018-09-29 18:05:02 +02:00
# check whether __gnu_cxx::stdio_filebuf is available
2019-11-30 17:58:01 +01:00
try_compile (
2020-08-11 23:13:09 +02:00
G N U _ C X X _ S T D I O _ F I L E B U F _ A V A I L A B L E $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R }
S O U R C E S $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / f e a t u r e _ d e t e c t i o n / s t d i o _ f i l e b u f . c p p
O U T P U T _ V A R I A B L E G N U _ C X X _ S T D I O _ F I L E B U F _ C H E C K _ L O G )
2018-09-29 18:05:02 +02:00
# use __gnu_cxx::stdio_filebuf if available or fallback to boost::iostreams::stream_buffer
2019-02-06 17:30:52 +01:00
if ( GNU_CXX_STDIO_FILEBUF_AVAILABLE AND NOT FORCE_BOOST_IOSTREAMS_FOR_NATIVE_FILE_BUFFER )
2018-09-29 18:05:02 +02:00
message ( STATUS "Using __gnu_cxx::stdio_filebuf for NativeFileStream" )
2019-05-04 15:49:41 +02:00
foreach ( NATIVE_FILE_STREAM_IMPL_FILE ${ NATIVE_FILE_STREAM_IMPL_FILES } )
2019-11-30 17:58:01 +01:00
set_property (
S O U R C E $ { N A T I V E _ F I L E _ S T R E A M _ I M P L _ F I L E }
A P P E N D
P R O P E R T Y C O M P I L E _ D E F I N I T I O N S $ { M E T A _ P R O J E C T _ V A R N A M E } _ U S E _ G N U _ C X X _ S T D I O _ F I L E B U F )
2019-05-04 15:49:41 +02:00
endforeach ( )
2019-02-06 17:30:52 +01:00
else ( )
2018-09-29 18:05:02 +02:00
message ( STATUS "Using boost::iostreams::stream_buffer<boost::iostreams::file_descriptor_sink> for NativeFileStream" )
2023-08-18 22:57:54 +02:00
list ( APPEND REQUIRED_BOOST_COMPONENTS iostreams )
2019-05-04 15:49:41 +02:00
foreach ( NATIVE_FILE_STREAM_IMPL_FILE ${ NATIVE_FILE_STREAM_IMPL_FILES } )
2020-08-11 23:13:09 +02:00
set_property (
S O U R C E $ { N A T I V E _ F I L E _ S T R E A M _ I M P L _ F I L E }
A P P E N D
P R O P E R T Y C O M P I L E _ D E F I N I T I O N S $ { M E T A _ P R O J E C T _ V A R N A M E } _ U S E _ B O O S T _ I O S T R E A M S )
2019-05-04 15:49:41 +02:00
endforeach ( )
2019-02-06 17:30:52 +01:00
endif ( )
else ( )
2018-09-29 18:05:02 +02:00
message ( STATUS "Using std::fstream for NativeFileStream" )
2019-02-06 17:30:52 +01:00
endif ( )
2016-12-19 23:29:54 +01:00
2023-08-18 22:57:54 +02:00
# configure use of Boost.Process for launching test applications on Windows
if ( WIN32 )
option ( USE_BOOST_PROCESS "enables use of Boost.Process to launch test applications" ON )
if ( USE_BOOST_PROCESS )
list ( APPEND REQUIRED_BOOST_COMPONENTS filesystem )
list ( APPEND META_PUBLIC_COMPILE_DEFINITIONS ${ META_PROJECT_VARNAME } _BOOST_PROCESS )
list ( APPEND PRIVATE_LIBRARIES ws2_32 ) # needed by Boost.Asio
use_package ( TARGET_NAME Threads::Threads PACKAGE_NAME Threads PACKAGE_ARGS REQUIRED )
endif ( )
endif ( )
# configure usage of Boost
if ( REQUIRED_BOOST_COMPONENTS )
set ( BOOST_ARGS REQUIRED COMPONENTS ${ REQUIRED_BOOST_COMPONENTS } )
use_package ( TARGET_NAME Boost::boost PACKAGE_NAME Boost PACKAGE_ARGS "${BOOST_ARGS}" )
foreach ( COMPONENT ${ REQUIRED_BOOST_COMPONENTS } )
use_package ( TARGET_NAME Boost:: ${ COMPONENT } PACKAGE_NAME Boost PACKAGE_ARGS "${BOOST_ARGS}" )
endforeach ( )
endif ( )
2019-07-02 18:40:25 +02:00
# configure required libraries for std::filesystem
2024-03-01 21:48:30 +01:00
option ( USE_STANDARD_FILESYSTEM "uses std::filesystem; if disabled Bash completion for files and directories and archiving utilities are disabled"
2019-08-06 00:02:38 +02:00
O N )
2019-07-02 18:40:25 +02:00
if ( USE_STANDARD_FILESYSTEM )
list ( APPEND META_PRIVATE_COMPILE_DEFINITIONS ${ META_PROJECT_VARNAME } _USE_STANDARD_FILESYSTEM )
use_standard_filesystem ( )
else ( )
2024-03-01 21:48:30 +01:00
message ( WARNING "The use of std::filesystem has been disabled. Bash completion for files and directories will not work and archiving utilities are disabled." )
endif ( )
# configure usage of libarchive
option ( USE_LIBARCHIVE "uses libarchive; if disabled archiving utilities will not be available" OFF )
if ( USE_LIBARCHIVE )
if ( NOT USE_STANDARD_FILESYSTEM )
message ( FATAL_ERROR "Unable to use USE_LIBARCHIVE without USE_STANDARD_FILESYSTEM." )
endif ( )
use_package ( TARGET_NAME LibArchive::LibArchive PACKAGE_NAME LibArchive )
list ( APPEND HEADER_FILES io/archive.h )
list ( APPEND SRC_FILES io/archive.cpp )
list ( APPEND META_PUBLIC_COMPILE_DEFINITIONS ${ META_PROJECT_VARNAME } _USE_LIBARCHIVE )
else ( )
set ( EXCLUDED_FILES io/archive.h io/archive.cpp )
2019-07-02 18:40:25 +02:00
endif ( )
2019-06-05 23:49:35 +02:00
2017-10-17 00:00:46 +02:00
# configure whether escape codes should be enabled by default
option ( ENABLE_ESCAPE_CODES_BY_DEAULT "enables usage of escape codes by default" ON )
2019-02-06 17:30:52 +01:00
if ( ENABLE_ESCAPE_CODES_BY_DEAULT )
2020-08-11 23:13:09 +02:00
set_property (
S O U R C E a p p l i c a t i o n / a r g u m e n t p a r s e r . c p p i o / a n s i e s c a p e c o d e s . c p p t e s t s / a r g u m e n t p a r s e r t e s t s . c p p
A P P E N D
P R O P E R T Y C O M P I L E _ D E F I N I T I O N S $ { M E T A _ P R O J E C T _ V A R N A M E } _ E S C A P E _ C O D E S _ E N A B L E D _ B Y _ D E F A U L T )
2019-02-06 17:30:52 +01:00
else ( )
2017-10-17 00:00:46 +02:00
message ( STATUS "Disabling use of escape codes by default." )
2019-02-06 17:30:52 +01:00
endif ( )
2017-10-17 00:00:46 +02:00
2018-06-03 22:14:22 +02:00
# configure use of thread_local
option ( ENABLE_THREAD_LOCAL "enables use of Thread-Local Storage" ON )
2019-02-06 17:30:52 +01:00
if ( NOT ENABLE_THREAD_LOCAL )
2020-08-11 23:13:09 +02:00
set_property (
S O U R C E c o n v e r s i o n / s t r i n g c o n v e r s i o n . c p p
A P P E N D
P R O P E R T Y C O M P I L E _ D E F I N I T I O N S $ { M E T A _ P R O J E C T _ V A R N A M E } _ N O _ T H R E A D _ L O C A L )
2019-02-06 17:30:52 +01:00
endif ( )
2018-06-03 22:14:22 +02:00
2023-04-23 19:23:47 +02:00
# configure use of platform-specific APIs for optimizing CopyHelper
2023-04-29 12:53:46 +02:00
option ( USE_PLATFORM_SPECIFIC_API_FOR_OPTIMIZING_COPY_HELPER
" e n a b l e s u s e o f p l a t f o r m - s p e c i f i c A P I s f o r o p t i m i z i n g C o p y H e l p e r " O F F )
2023-04-23 19:23:47 +02:00
if ( USE_PLATFORM_SPECIFIC_API_FOR_OPTIMIZING_COPY_HELPER )
list ( APPEND META_PUBLIC_COMPILE_DEFINITIONS ${ META_PROJECT_VARNAME } _USE_PLATFORM_SPECIFIC_API_FOR_OPTIMIZING_COPY_HELPER )
endif ( )
2016-04-16 00:50:16 +02:00
# include modules to apply configuration
include ( BasicConfig )
include ( WindowsResources )
include ( LibraryTarget )
include ( TestTarget )
2016-06-09 22:57:51 +02:00
include ( Doxygen )
2016-07-27 21:38:40 +02:00
include ( ConfigHeader )