cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR) # add project files set(HEADER_FILES application/argumentparser.h application/commandlineutils.h application/failure.h application/fakeqtconfigarguments.h application/global.h chrono/datetime.h chrono/period.h chrono/timespan.h conversion/binaryconversion.h conversion/binaryconversionprivate.h conversion/conversionexception.h conversion/stringconversion.h conversion/types.h conversion/widen.h io/ansiescapecodes.h io/binaryreader.h io/binarywriter.h io/bitreader.h io/copy.h io/inifile.h io/path.h math/math.h misc/memory.h misc/random.h ) set(SRC_FILES application/argumentparser.cpp application/commandlineutils.cpp application/failure.cpp application/fakeqtconfigarguments.cpp chrono/datetime.cpp chrono/period.cpp chrono/timespan.cpp conversion/binaryconversion.cpp conversion/conversionexception.cpp conversion/stringconversion.cpp io/ansiescapecodes.cpp io/binaryreader.cpp io/binarywriter.cpp io/bitreader.cpp io/inifile.cpp io/path.cpp math/math.cpp misc/random.cpp ) # meta data set(META_PROJECT_NAME c++utilities) set(META_APP_NAME "C++ Utilities") set(META_APP_AUTHOR "Martchus") set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}") set(META_APP_DESCRIPTION "Common C++ classes and routines used by my applications such as argument parser, IO and conversion utilities.") set(META_VERSION_MAJOR 3) set(META_VERSION_MINOR 0) set(META_VERSION_PATCH 0) set(META_APP_VERSION ${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH}) # 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}") # add windows resource file if(MINGW) # creation windows icon from png with ffmpeg if available find_program(FFMPEG_BIN ffmpeg avconv) if(FFMPEG_BIN) set(PNG_ICON_PATH "${PROJECT_SOURCE_DIR}/resources/icons/hicolor/128x128/apps/${META_PROJECT_NAME}.png") if(EXISTS ${PNG_ICON_PATH}) set(WINDOWS_ICON_PATH "${PROJECT_BINARY_DIR}/${META_PROJECT_NAME}.ico") set(WINDOWS_ICON_RC_ENTRY "IDI_ICON1 ICON DISCARDABLE \"${WINDOWS_ICON_PATH}\"") add_custom_command( OUTPUT "${WINDOWS_ICON_PATH}" COMMAND ${FFMPEG_BIN} -y -i "${PNG_ICON_PATH}" -vf crop=iw-20:ih-20:10:10,scale=64:64 "${WINDOWS_ICON_PATH}" ) endif() endif(FFMPEG_BIN) # create windows rc file from template set(WINDOWS_EXT "dll") 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) # remove library prefix when building with mingw-w64 (just for consistancy with qmake) if(MINGW) set(CMAKE_SHARED_LIBRARY_PREFIX "") endif(MINGW) # disable new ABI (can't catch ios_base::failure with new ABI) add_definitions( -D_GLIBCXX_USE_CXX11_ABI=0 ) # executable and linking add_library(${META_PROJECT_NAME} SHARED ${HEADER_FILES} ${SRC_FILES} ${RES_FILES} ${WINDOWS_ICON_PATH}) set_target_properties(${META_PROJECT_NAME} PROPERTIES VERSION ${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH} SOVERSION ${META_VERSION_MAJOR} CXX_STANDARD 11 ) # add install target install(TARGETS ${META_PROJECT_NAME} RUNTIME DESTINATION bin COMPONENT binary LIBRARY DESTINATION lib COMPONENT binary ARCHIVE DESTINATION lib COMPONENT binary ) foreach(HEADER_FILE ${HEADER_FILES}) get_filename_component(HEADER_DIR ${HEADER_FILE} DIRECTORY) install( FILES ${HEADER_FILE} DESTINATION include/${META_PROJECT_NAME}/${HEADER_DIR} COMPONENT header ) endforeach() add_custom_target(install-binary DEPENDS ${META_PROJECT_NAME} COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=binary -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" ) add_custom_target(install-header DEPENDS ${META_PROJECT_NAME} COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=header -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" ) add_custom_target(install-mingw-w64 DEPENDS install-binary install-header ) 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" ) add_custom_target(install-mingw-w64-strip DEPENDS install-binary-strip install-header )