From d887e948747b50bd70d08cf4ac88d33e1ada15fb Mon Sep 17 00:00:00 2001 From: "L. E. Segovia" Date: Sun, 18 Apr 2021 00:20:31 +0000 Subject: [PATCH] Add support for MSVC --- gmic-qt/CMakeLists.txt | 88 ++++++++++++++----- gmic-qt/cmake/modules/FindFFTW3.cmake | 2 +- .../src/FilterParameters/FloatParameter.cpp | 2 +- gmic-qt/src/FilterParameters/IntParameter.cpp | 2 +- .../src/FilterParameters/PointParameter.cpp | 2 +- .../src/FilterSelector/FiltersPresenter.cpp | 6 +- gmic-qt/src/HeadlessProcessor.cpp | 2 +- src/gmic.cpp | 4 + 8 files changed, 80 insertions(+), 28 deletions(-) diff --git a/gmic-qt/CMakeLists.txt b/gmic-qt/CMakeLists.txt index 21d1c15..9ef9ee8 100644 --- a/gmic-qt/CMakeLists.txt +++ b/gmic-qt/CMakeLists.txt @@ -29,10 +29,10 @@ else() message("Building for target host application: " ${GMIC_QT_HOST}) endif() -if(EXISTS "../src/gmic.cpp") - set (GMIC_PATH "../src" CACHE STRING "Define the path to the gmic headers") +if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../src/gmic.cpp") + set (GMIC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../src" CACHE STRING "Define the path to the gmic headers") else() - set (GMIC_PATH "../gmic/src" CACHE STRING "Define the path to the gmic headers") + set (GMIC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../gmic/src" CACHE STRING "Define the path to the gmic headers") endif() message("G'MIC path: " ${GMIC_PATH}) @@ -44,15 +44,20 @@ set (GMIC_LIB_PATH "${GMIC_PATH}" CACHE STRING "Define the path to the GMIC shar option(ENABLE_ASAN "Enable -fsanitize=address (if debug build)" ON) option(ENABLE_FFTW3 "Enable FFTW3 library support" ON) -option(ENABLE_LTO "Enable -flto (Link Time Optimizer) on gcc and clang" ON) +option(ENABLE_LTO "Enable Link Time Optimizer" ON) -if (WIN32) - message("LTO is disabled (windows platform)") +if (MSVC) + option(ENABLE_CFG "Enable Control Flow Guard (MSVC)" ON) + add_definitions(-D__PRETTY_FUNCTION__=__FUNCSIG__) +endif() + +if (WIN32 AND NOT MSVC) + message("LTO is disabled (windows platform, not MSVC)") set(ENABLE_LTO OFF) endif() if (CMAKE_BUILD_TYPE STREQUAL "Debug") - set(ENABLE_LTO OFF) + set(ENABLE_LTO OFF FORCE) endif() @@ -123,6 +128,11 @@ endif() # Required packages +# +# Threads +# +find_package(Threads REQUIRED) + # # Qt5 # @@ -203,10 +213,33 @@ endif() # LTO option # -if (ENABLE_LTO AND (CMAKE_COMPILER_IS_GNUCC OR (CMAKE_CSS_COMPILER_IS STREQUAL "Clang"))) +if (ENABLE_LTO) message("Link Time Optimizer enabled") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto") + if (MSVC) + string(REPLACE "INCREMENTAL" "INCREMENTAL:NO" CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}") + string(REPLACE "INCREMENTAL" "INCREMENTAL:NO" CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO}") + string(REPLACE "INCREMENTAL" "INCREMENTAL:NO" CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GL") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LTCG") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LTCG") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LTCG") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto") + endif() +endif() + +# +# Enable CFG +# +if (MSVC) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:4194304") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /STACK:4194304") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /STACK:4194304") + if (ENABLE_CFG) + add_compile_options(/guard:CF) + add_link_options(/GUARD:CF) + endif() endif() # @@ -265,9 +298,13 @@ if (WIN32) add_definitions(-Dcimg_display=2) add_definitions(-DPSAPI_VERSION=1) add_definitions(-D_IS_WINDOWS_) + if (MSVC) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + add_compile_options(/wd4267) + endif() set(gmic_qt_LIBRARIES ${gmic_qt_LIBRARIES} - pthread psapi gdi32 + Threads::Threads psapi gdi32 ) endif() @@ -282,19 +319,30 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug") endif(ENABLE_ASAN) elseif (CMAKE_BUILD_TYPE STREQUAL "Release") add_definitions(-DQT_NO_DEBUG_OUTPUT) - string(REPLACE "-O2" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") - string(REPLACE "-O3" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s") - if (WIN32) + if (MSVC) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /fp:fast /Oi") + else() + string(REPLACE "-O2" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") + string(REPLACE "-O3" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast") + endif() + if (NOT MSVC) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s") + endif() + if (WIN32 AND NOT MSVC) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -mwindows") endif() elseif (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") add_definitions(-DQT_NO_DEBUG_OUTPUT) - string(REPLACE "-O2" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") - string(REPLACE "-O3" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") - set_source_files_properties(${GMIC_PATH}/gmic.cpp PROPERTIES COMPILE_FLAGS "-Ofast") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O2") + if(MSVC) + string(REPLACE "Ob1" "Ob2" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /fp:fast /Oi") + else() + string(REPLACE "-O2" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + string(REPLACE "-O3" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + set_source_files_properties(${GMIC_PATH}/gmic.cpp PROPERTIES COMPILE_FLAGS "-Ofast") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O2") + endif() else() message(FATAL_ERROR "Build type not recognized (${CMAKE_BUILD_TYPE})") endif() diff --git a/gmic-qt/cmake/modules/FindFFTW3.cmake b/gmic-qt/cmake/modules/FindFFTW3.cmake index 919edb7..6f83b3c 100644 --- a/gmic-qt/cmake/modules/FindFFTW3.cmake +++ b/gmic-qt/cmake/modules/FindFFTW3.cmake @@ -62,7 +62,7 @@ else() find_library( FFTW3_LIBRARY - NAMES libfftw3 libfftw3-3 libfftw3f-3 libfftw3l-3 + NAMES libfftw3 libfftw3-3 libfftw3f-3 libfftw3l-3 fftw3 DOC "Libraries to link against for FFT Support") if (FFTW3_LIBRARY) diff --git a/gmic-qt/src/FilterParameters/FloatParameter.cpp b/gmic-qt/src/FilterParameters/FloatParameter.cpp index 21378a3..71ae670 100644 --- a/gmic-qt/src/FilterParameters/FloatParameter.cpp +++ b/gmic-qt/src/FilterParameters/FloatParameter.cpp @@ -161,7 +161,7 @@ void FloatParameter::timerEvent(QTimerEvent * event) { killTimer(event->timerId()); _timerId = 0; - if (not _spinBox->unfinishedKeyboardEditing()) { + if (!_spinBox->unfinishedKeyboardEditing()) { notifyIfRelevant(); } } diff --git a/gmic-qt/src/FilterParameters/IntParameter.cpp b/gmic-qt/src/FilterParameters/IntParameter.cpp index 4801568..28e1693 100644 --- a/gmic-qt/src/FilterParameters/IntParameter.cpp +++ b/gmic-qt/src/FilterParameters/IntParameter.cpp @@ -156,7 +156,7 @@ void IntParameter::timerEvent(QTimerEvent * e) { killTimer(e->timerId()); _timerId = 0; - if (not _spinBox->unfinishedKeyboardEditing()) { + if (!_spinBox->unfinishedKeyboardEditing()) { notifyIfRelevant(); } } diff --git a/gmic-qt/src/FilterParameters/PointParameter.cpp b/gmic-qt/src/FilterParameters/PointParameter.cpp index 12f64ef..dc73014 100644 --- a/gmic-qt/src/FilterParameters/PointParameter.cpp +++ b/gmic-qt/src/FilterParameters/PointParameter.cpp @@ -202,7 +202,7 @@ void PointParameter::setVisibilityState(AbstractParameter::VisibilityState state void PointParameter::updateView() { - if (not _spinBoxX) { + if (!_spinBoxX) { return; } disconnectSpinboxes(); diff --git a/gmic-qt/src/FilterSelector/FiltersPresenter.cpp b/gmic-qt/src/FilterSelector/FiltersPresenter.cpp index af437c1..3779c7a 100644 --- a/gmic-qt/src/FilterSelector/FiltersPresenter.cpp +++ b/gmic-qt/src/FilterSelector/FiltersPresenter.cpp @@ -261,7 +261,7 @@ void FiltersPresenter::selectFilterFromHash(QString hash, bool notify) hashExists = false; } } - if (not hashExists) { + if (!hashExists) { hash.clear(); } setCurrentFilter(hash); @@ -536,12 +536,12 @@ void FiltersPresenter::removeFave(const QString & hash) bool FiltersPresenter::danglingFaveIsSelected() const { - if (not _filtersView || not _filtersView->aFaveIsSelected()) { + if (!_filtersView || !_filtersView->aFaveIsSelected()) { return false; } QString hash = _filtersView->selectedFilterHash(); if (_favesModel.contains(hash)) { - return not _filtersModel.contains(_favesModel.getFaveFromHash(hash).originalHash()); + return !_filtersModel.contains(_favesModel.getFaveFromHash(hash).originalHash()); } return false; } diff --git a/gmic-qt/src/HeadlessProcessor.cpp b/gmic-qt/src/HeadlessProcessor.cpp index f67cbc4..446d1a8 100644 --- a/gmic-qt/src/HeadlessProcessor.cpp +++ b/gmic-qt/src/HeadlessProcessor.cpp @@ -271,7 +271,7 @@ void HeadlessProcessor::endApplication(const QString & errorMessage) if (!errorMessage.isEmpty()) { Logger::error(errorMessage); } - QCoreApplication::exit(not errorMessage.isEmpty()); + QCoreApplication::exit(!errorMessage.isEmpty()); } } // namespace GmicQt diff --git a/src/gmic.cpp b/src/gmic.cpp index 6560bb1..44b9ae6 100644 --- a/src/gmic.cpp +++ b/src/gmic.cpp @@ -2534,7 +2534,11 @@ struct _gmic_parallel { }; template +#if cimg_OS==2 && defined(_MSC_VER) +DWORD WINAPI gmic_parallel(LPVOID arg) { +#else static void *gmic_parallel(void *arg) { +#endif _gmic_parallel &st = *(_gmic_parallel*)arg; try { unsigned int pos = 0;