[M-git] Mahogany sources repository. branch master updated. v0.67-921-gaf073d76
vadz via Mahogany-cvsupdates <[email protected]> Tue, 06 Jan 2026 23:24:07 +0000
| Newsgroups | gmane.mail.mahogany.cvs |
|---|---|
| Message-ID | <[email protected]> |
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Mahogany sources repository.".
The branch, master has been updated
via af073d7646cb71eea10eeb649ffb0fa84858fb23 (commit)
via fc072ff1aa4014b89c5d4a1c9749ead9b6228c84 (commit)
via 627216794c02505b81df124b67d04812c5aeb19a (commit)
from 02e41e8de38b2a5cb3e8100c8940f11a90f7e896 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit af073d7646cb71eea10eeb649ffb0fa84858fb23
Author: Vadim Zeitlin <[email protected]>
Date: Mon Jan 5 00:28:18 2026 +0100
Add CMake build system
This is the first version which doesn't support all the features of the
existing makefiles yet, but seems to work under Unix.
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 9f08103d..e52e4e9a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -27,12 +27,35 @@ jobs:
conda install -y conda-forge::wxwidgets
- name: Configure
run: |
- mkdir build
- cd build
+ mkdir build-autoconf
+ cd build-autoconf
../configure --with-wx-config=/usr/share/miniconda/bin/wx-config
- name: Build
run: |
- make -j`nproc` -C build
+ make -j`nproc` -C build-autoconf
+
+ build-linux-cmake:
+ runs-on: ubuntu-latest
+ env:
+ LD_LIBRARY_PATH: /usr/lib/miniconda/lib
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up Miniconda
+ uses: conda-incubator/setup-miniconda@v3
+ with:
+ auto-activate-base: false
+ auto-update-conda: false
+ activate-environment: wxenv
+ channels: conda-forge,defaults
+ - name: Install wxWidgets
+ run: |
+ conda install -y conda-forge::wxwidgets
+ - name: Configure
+ run: |
+ cmake -S . -B build-cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DWX_CONFIG=/usr/share/miniconda/bin/wx-config
+ - name: Build
+ run: |
+ ninja -C build-cmake
build-windows:
runs-on: windows-latest
@@ -54,3 +77,26 @@ jobs:
env:
WXWIN: 'c:\Miniconda\envs\wxenv\Library'
run: msbuild.exe -noLogo -maxCpuCount -property:"Platform=x64,Configuration=Release DLL" M.sln
+
+ build-windows-cmake:
+ runs-on: windows-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up Miniconda
+ uses: conda-incubator/setup-miniconda@v3
+ with:
+ auto-activate-base: false
+ auto-update-conda: false
+ activate-environment: wxenv
+ channels: conda-forge,defaults
+ - name: Install wxWidgets
+ run: |
+ conda install -y conda-forge::wxwidgets
+ - name: Configure
+ env:
+ WXWIN: 'c:\Miniconda\envs\wxenv\Library'
+ run: |
+ cmake -S . -B build-cmake
+ - name: Build
+ run: |
+ cmake --build build-cmake --config Release
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 00000000..5692f8ba
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,238 @@
+# Top level CMakeLists.txt for Mahogany
+#
+# USAGE:
+# ------
+# 1. Prerequisites:
+# - CMake 3.27 or later
+# - C++ compiler with C++11 support
+# - wxWidgets 3.2 or later
+# - Python development headers (optional, for Python support)
+# - OpenSSL (optional, for SSL/TLS support under Unix systems only)
+#
+# 2. Configure:
+#
+# cmake -S . -B build-dir
+#
+# The following Mahogany-specific options can be set:
+#
+# - USE_PYTHON: Enable Python scripting support (default: ON if Python found)
+# - USE_SSL: Enable SSL/TLS support (default: ON if OpenSSL found)
+#
+# 3. Build:
+#
+# cmake --build build-dir
+#
+# TODO:
+# -----
+#
+# - Add installation targets.
+# - Add USE_MODULES=static|dynamic option.
+
+cmake_minimum_required(VERSION 3.27)
+
+# Extract version from Mversion.h which is the source of truth for it.
+file(READ "${CMAKE_CURRENT_SOURCE_DIR}/include/Mversion.h" MVERSION_H_CONTENT)
+string(REGEX MATCH "#define +M_VERSION_MAJOR +([0-9]+)" _ "${MVERSION_H_CONTENT}")
+set(M_VERSION_MAJOR "${CMAKE_MATCH_1}")
+string(REGEX MATCH "#define +M_VERSION_MINOR +([0-9]+)" _ "${MVERSION_H_CONTENT}")
+set(M_VERSION_MINOR "${CMAKE_MATCH_1}")
+string(REGEX MATCH "#define +M_VERSION_RELEASE +([0-9]+)" _ "${MVERSION_H_CONTENT}")
+set(M_VERSION_RELEASE "${CMAKE_MATCH_1}")
+
+project(Mahogany
+ VERSION "${M_VERSION_MAJOR}.${M_VERSION_MINOR}.${M_VERSION_RELEASE}"
+ DESCRIPTION "Mahogany Cross-Platform Email Client"
+ LANGUAGES C CXX
+)
+
+# Set C++ standard
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS OFF)
+
+# Build options
+option(USE_PYTHON "Enable Python scripting support" ON)
+if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
+ # This is always enabled under Windows because there is really no reason not
+ # to do it, as system TLS support is used.
+ set(USE_SSL ON)
+else()
+ option(USE_SSL "Enable SSL/TLS support" ON)
+endif()
+option(USE_DSPAM "Enable built-in support for spam filtering" OFF)
+set(WX_CONFIG "" CACHE PATH "Path to wxWidgets wx-config script")
+
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ message(STATUS "Setting build type to 'Release' as none was specified.")
+ set(CMAKE_BUILD_TYPE Release CACHE
+ STRING "Choose the type of build: Debug Release RelWithDebInfo MinSizeRel"
+ FORCE
+ )
+ # Set the possible values of build type for cmake-gui
+ set_property(CACHE CMAKE_BUILD_TYPE
+ PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo"
+ )
+endif()
+
+# Define helpers for testing for the compiler in generator expressions.
+if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+ set(IS_GCC_LIKE TRUE)
+elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ set(IS_GCC_LIKE TRUE)
+endif()
+
+# Find required dependencies
+
+# We need to use our own version of FindwxWidgets.cmake because the one
+# bundled with CMake 3.27 does not support wxWidgets 3.3 yet (webp library is
+# not linked under Windows).
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake")
+
+if(WX_CONFIG)
+ execute_process(
+ COMMAND
+ ${WX_CONFIG} --version
+ OUTPUT_VARIABLE
+ wxWidgets_VERSION
+ ERROR_VARIABLE
+ WX_CONFIG_ERROR
+ RESULT_VARIABLE
+ WX_CONFIG_RESULT
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+
+ if(NOT WX_CONFIG_RESULT EQUAL 0)
+ message(FATAL_ERROR "Failed to run \"${WX_CONFIG}\": ${WX_CONFIG_ERROR}")
+ endif()
+
+ execute_process(
+ COMMAND
+ ${WX_CONFIG} --cxxflags
+ OUTPUT_VARIABLE
+ wxWidgets_CXXFLAGS
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+
+ execute_process(
+ COMMAND
+ ${WX_CONFIG} --libs net,html,qa,xml,core,base
+ OUTPUT_VARIABLE
+ wxWidgets_LIBS
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+
+ separate_arguments(wxWidgets_CXXFLAGS)
+ separate_arguments(wxWidgets_LIBS)
+
+ add_library(mahogany_wx INTERFACE)
+ target_compile_options(mahogany_wx INTERFACE ${wxWidgets_CXXFLAGS})
+ target_link_libraries(mahogany_wx INTERFACE ${wxWidgets_LIBS})
+ set(wxWidgets_LIBRARIES mahogany_wx)
+else()
+ find_package(wxWidgets 3.2 COMPONENTS core base net html qa xml)
+ if(NOT wxWidgets_FOUND)
+ message(FATAL_ERROR "wxWidgets not found. Mahogany requires wxWidgets 3.2 or later.
+
+ To install wxWidgets:
+ - Ubuntu/Debian: sudo apt-get install libwxgtk3.2-dev
+ - CentOS/RHEL: sudo yum install wxGTK3-devel
+ - Windows: Download from https://www.wxwidgets.org/")
+ endif()
+
+ # This variable is not defined in CONFIG search mode.
+ if(wxWidgets_USE_FILE)
+ include(${wxWidgets_USE_FILE})
+ endif()
+endif()
+
+# Find optional dependencies
+if(USE_PYTHON)
+ find_package(Python3 COMPONENTS Development)
+ if(Python3_FOUND)
+ list(APPEND extra_features "Python: ${Python3_VERSION}")
+
+ # We use SWIG to generate Python bindings, but don't complain if it's
+ # not found because we have pre-generated files in the repository.
+ find_package(SWIG COMPONENTS python QUIET)
+ if(SWIG_FOUND)
+ # Enable new behaviour of UseSWIG module before including it.
+ set(UseSWIG_MODULE_VERSION 2)
+ include(UseSWIG)
+ list(APPEND extra_features "SWIG: ${SWIG_VERSION}")
+ endif()
+ else()
+ message(WARNING "Python development headers not found. Python support will be disabled.")
+ set(USE_PYTHON OFF)
+ endif()
+endif()
+
+if(USE_SSL AND NOT WIN32)
+ find_package(OpenSSL COMPONENTS Crypto SSL)
+ if(OPENSSL_FOUND)
+ list(APPEND extra_features "OpenSSL: ${OPENSSL_VERSION}")
+ set(USE_OPENSSL ON)
+ else()
+ message(WARNING "OpenSSL not found. SSL/TLS support will be disabled.")
+ set(USE_SSL OFF)
+ endif()
+endif()
+
+if(USE_DSPAM)
+ list(APPEND extra_features "DSPAM")
+ message(FATAL_ERROR "DSPAM support is not yet implemented in CMake.")
+endif()
+
+# Generate headers and related files now that we have all USE_XXX values.
+add_subdirectory(include)
+
+# Create interface target for C library common settings
+add_library(mahogany_c_library_common INTERFACE)
+
+if(WIN32)
+ target_compile_definitions(mahogany_c_library_common INTERFACE WIN32)
+endif()
+
+# Common compiler-specific settings for C libraries
+if(MSVC)
+ target_compile_definitions(mahogany_c_library_common INTERFACE
+ _CRT_SECURE_NO_WARNINGS
+ _CRT_NONSTDC_NO_WARNINGS
+ )
+
+ target_compile_options(mahogany_c_library_common INTERFACE
+ /wd4100 # Disable unused parameter warnings
+ /wd4244 # Disable conversion warnings
+ /wd4267 # Disable size_t conversion warnings
+ /wd4273 # Disable inconsistent dll linkage warnings
+ /wd4996 # Disable deprecated function warnings
+ )
+elseif(IS_GCC_LIKE)
+ target_compile_options(mahogany_c_library_common INTERFACE
+ -Wno-unused-parameter
+ -Wno-sign-compare
+ -Wno-unused-variable
+ -Wno-pointer-sign
+ -Wno-parentheses
+ )
+endif()
+
+# Add subdirectories for libraries
+add_subdirectory(lib/imap)
+add_subdirectory(lib/compface)
+if(USE_DSPAM)
+ add_subdirectory(lib/dspam)
+endif()
+add_subdirectory(src/wx/vcard)
+
+# Add main application directory.
+add_subdirectory(src)
+
+# Summary
+message(STATUS "Configured Mahogany ${PROJECT_VERSION}:")
+if(CMAKE_BUILD_TYPE)
+ message(STATUS " Build type: ${CMAKE_BUILD_TYPE}")
+endif()
+message(STATUS " wxWidgets: ${wxWidgets_VERSION}")
+foreach(feature IN LISTS extra_features)
+ message(STATUS " ${feature}")
+endforeach()
diff --git a/build.bat b/build.bat
new file mode 100644
index 00000000..59d04155
--- /dev/null
+++ b/build.bat
@@ -0,0 +1,82 @@
+@echo off
+REM #############################################################################
+REM build.bat - Sample build script for Mahogany using CMake on Windows
+REM #############################################################################
+REM This script demonstrates how to build Mahogany with various configurations
+REM on Windows using Visual Studio or other generators.
+
+setlocal
+
+REM Configuration variables
+set BUILD_TYPE=Release
+set BUILD_SHARED=OFF
+set ENABLE_PYTHON=ON
+set ENABLE_SSL=ON
+set BUILD_TESTS=ON
+set GENERATOR=Visual Studio 17 2022
+set PLATFORM=x64
+
+REM Build directory
+set BUILD_DIR=build
+
+echo === Mahogany CMake Build Script (Windows) ===
+echo Build type: %BUILD_TYPE%
+echo Generator: %GENERATOR%
+echo Platform: %PLATFORM%
+echo Shared libs: %BUILD_SHARED%
+echo Python support: %ENABLE_PYTHON%
+echo SSL support: %ENABLE_SSL%
+echo Build tests: %BUILD_TESTS%
+echo.
+
+REM Clean build directory if requested
+if "%1"=="clean" (
+ echo Cleaning build directory...
+ rmdir /s /q %BUILD_DIR% 2>nul
+ echo Clean complete.
+ goto :eof
+)
+
+REM Create build directory
+if not exist %BUILD_DIR% mkdir %BUILD_DIR%
+cd %BUILD_DIR%
+
+REM Configure with CMake
+echo Configuring with CMake...
+cmake .. ^
+ -G "%GENERATOR%" ^
+ -A %PLATFORM% ^
+ -DCMAKE_BUILD_TYPE=%BUILD_TYPE% ^
+ -DBUILD_SHARED_LIBS=%BUILD_SHARED% ^
+ -DENABLE_PYTHON=%ENABLE_PYTHON% ^
+ -DENABLE_SSL=%ENABLE_SSL% ^
+ -DBUILD_TESTS=%BUILD_TESTS%
+
+if %ERRORLEVEL% neq 0 (
+ echo Configuration failed!
+ pause
+ exit /b 1
+)
+
+REM Build
+echo Building...
+cmake --build . --config %BUILD_TYPE% --parallel
+
+if %ERRORLEVEL% neq 0 (
+ echo Build failed!
+ pause
+ exit /b 1
+)
+
+REM Run tests if enabled
+if "%BUILD_TESTS%"=="ON" (
+ echo Running tests...
+ ctest -C %BUILD_TYPE% --output-on-failure
+)
+
+echo.
+echo === Build Complete ===
+echo To install: cmake --install . --config %BUILD_TYPE%
+echo To open in Visual Studio: start Mahogany.sln
+
+pause
\ No newline at end of file
diff --git a/build.sh b/build.sh
new file mode 100755
index 00000000..fc4a70ab
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+#################################################################################
+# build.sh - Sample build script for Mahogany using CMake
+#################################################################################
+# This script demonstrates how to build Mahogany with various configurations.
+# Modify the variables below to suit your environment.
+
+set -e # Exit on error
+
+# Configuration variables
+BUILD_TYPE=${BUILD_TYPE:-Release}
+BUILD_SHARED=${BUILD_SHARED:-OFF}
+ENABLE_PYTHON=${ENABLE_PYTHON:-ON}
+ENABLE_SSL=${ENABLE_SSL:-ON}
+BUILD_TESTS=${BUILD_TESTS:-ON}
+INSTALL_PREFIX=${INSTALL_PREFIX:-/usr/local}
+
+# Build directory
+BUILD_DIR=build
+
+echo "=== Mahogany CMake Build Script ==="
+echo "Build type: $BUILD_TYPE"
+echo "Shared libs: $BUILD_SHARED"
+echo "Python support: $ENABLE_PYTHON"
+echo "SSL support: $ENABLE_SSL"
+echo "Build tests: $BUILD_TESTS"
+echo "Install prefix: $INSTALL_PREFIX"
+echo ""
+
+# Clean build directory if requested
+if [ "$1" = "clean" ]; then
+ echo "Cleaning build directory..."
+ rm -rf $BUILD_DIR
+ echo "Clean complete."
+ exit 0
+fi
+
+# Create build directory
+mkdir -p $BUILD_DIR
+cd $BUILD_DIR
+
+# Configure with CMake
+echo "Configuring with CMake..."
+cmake .. \
+ -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
+ -DBUILD_SHARED_LIBS=$BUILD_SHARED \
+ -DENABLE_PYTHON=$ENABLE_PYTHON \
+ -DENABLE_SSL=$ENABLE_SSL \
+ -DBUILD_TESTS=$BUILD_TESTS \
+ -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX
+
+# Build
+echo "Building..."
+make -j$(nproc)
+
+# Run tests if enabled
+if [ "$BUILD_TESTS" = "ON" ]; then
+ echo "Running tests..."
+ ctest --output-on-failure
+fi
+
+echo ""
+echo "=== Build Complete ==="
+echo "To install: cd $BUILD_DIR && make install"
+echo "To package: cd $BUILD_DIR && make package"
\ No newline at end of file
diff --git a/build/cmake/FindwxWidgets.cmake b/build/cmake/FindwxWidgets.cmake
new file mode 100644
index 00000000..dbbfb3c1
--- /dev/null
+++ b/build/cmake/FindwxWidgets.cmake
@@ -0,0 +1,1410 @@
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file LICENSE.rst or https://cmake.org/licensing for details.
+
+#[=======================================================================[.rst:
+FindwxWidgets
+-------------
+
+Finds a wxWidgets installation and provides usage requirements for usage in
+projects:
+
+.. code-block:: cmake
+
+ find_package(wxWidgets [<version>] [COMPONENTS <components>...] [...])
+
+wxWidgets (formerly known as wxWindows) is a widget toolkit and tools
+library for creating graphical user interfaces (GUIs) for cross-platform
+applications.
+
+.. versionadded:: 3.4
+ Support for :command:`find_package` version argument.
+
+.. versionadded:: 3.14
+ ``OPTIONAL_COMPONENTS`` support.
+
+Components
+^^^^^^^^^^
+
+wxWidgets is a modular library. This module supports components to specify
+the modules to use. Components can be specified with the
+:command:`find_package` command:
+
+.. code-block:: cmake
+
+ find_package(
+ wxWidgets
+ [COMPONENTS <components>...]
+ [OPTIONAL_COMPONENTS <components>...]
+ )
+
+Supported components include:
+
+``base``
+ Finds the library that provides mandatory classes that any wxWidgets code
+ depends on. This component is always required for applications
+ implementing wxWidgets.
+
+``core``
+ Finds the library that provides basic GUI classes such as GDI classes or
+ controls.
+
+``gl``
+ Finds the OpenGL support.
+
+``mono``
+ Finds the wxWidgets monolithic library.
+
+``aui``
+ Finds the Advanced User Interface docking library.
+
+``net``
+ Finds the library that provides network access.
+
+``webview``
+ .. versionadded:: 3.4
+
+ Finds the library that provides rendering of web documents
+ (HTML/CSS/JavaScript).
+
+For a full list of supported wxWidgets components, refer to the upstream
+documentation.
+
+If no components are specified, this module by default searches for ``core``
+and ``base`` components.
+
+Imported Targets
+^^^^^^^^^^^^^^^^
+
+This module provides the following :ref:`Imported Targets`:
+
+``wxWidgets::wxWidgets``
+ .. versionadded:: 3.27
+
+ An interface imported target encapsulating the wxWidgets usage requirements
+ for the found components, available if wxWidgets is found.
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+This module defines the following variables:
+
+``wxWidgets_FOUND``
+ Boolean indicating whether (the requested version of) wxWidgets and all
+ its requested components were found.
+
+``wxWidgets_VERSION``
+ .. versionadded:: 4.2
+
+ The version of the wxWidgets found.
+
+``wxWidgets_INCLUDE_DIRS``
+ Include directories for WIN32, i.e., where to find ``<wx/wx.h>`` and
+ ``<wx/setup.h>``; possibly empty for Unix-like systems.
+
+``wxWidgets_LIBRARIES``
+ Path to the wxWidgets libraries.
+
+``wxWidgets_LIBRARY_DIRS``
+ Compile time link dirs, useful for setting ``rpath`` on Unix-like systems.
+ Typically an empty string in WIN32 environment.
+
+``wxWidgets_DEFINITIONS``
+ Contains compile definitions required to compile/link against WX, e.g.
+ ``WXUSINGDLL``.
+
+``wxWidgets_DEFINITIONS_DEBUG``
+ Contains compile definitions required to compile/link against WX debug builds,
+ e.g. ``__WXDEBUG__``.
+
+``wxWidgets_CXX_FLAGS``
+ Include directories and compiler flags for Unix-like systems, empty on
+ Windows. Essentially the output of ``wx-config --cxxflags``.
+
+Hints
+^^^^^
+
+This module accepts the following variables before calling
+``find_package(wxWidgets)``:
+
+``WX_CONFIG``
+ .. versionadded:: 3.11
+
+ Environment variable to manually specify the name of the wxWidgets library
+ configuration provider executable that will be searched besides the default
+ name ``wx-config``.
+
+``WXRC_CMD``
+ .. versionadded:: 3.11
+
+ Environment variable to manually specify the name of the wxWidgets resource
+ file compiler executable that will be searched besides the default name
+ ``wxrc``.
+
+There are two search branches: a Windows style and a Unix style. For
+Windows, the following variables are searched for and set to defaults
+in case of multiple choices. Change them if the defaults are not
+desired (i.e., these are the only variables that should be changed to
+select a configuration):
+
+``wxWidgets_ROOT_DIR``
+ Base wxWidgets directory (e.g., ``C:/wxWidgets-3.2.0``).
+
+``wxWidgets_LIB_DIR``
+ Path to wxWidgets libraries (e.g., ``C:/wxWidgets-3.2.0/lib/vc_x64_lib``).
+
+``wxWidgets_CONFIGURATION``
+ Configuration to use (e.g., msw, mswd, mswu, mswunivud, etc.)
+
+``wxWidgets_EXCLUDE_COMMON_LIBRARIES``
+ Set to TRUE to exclude linking of commonly required libs (e.g., png, tiff,
+ jpeg, zlib, webp, regex, expat, scintilla, lexilla, etc.).
+
+For Unix style this module uses the ``wx-config`` utility. Selecting
+between debug/release, unicode/ansi, universal/non-universal, and
+static/shared is possible in the QtDialog or ccmake interfaces by turning
+ON/OFF the following variables:
+
+``wxWidgets_USE_DEBUG``
+ If enabled, the wxWidgets debug build will be searched.
+
+``wxWidgets_USE_UNICODE``
+ If enabled, the wxWidgets unicode build will be searched.
+
+``wxWidgets_USE_UNIVERSAL``
+ If enabled, the wxWidgets universal build will be searched.
+
+``wxWidgets_USE_STATIC``
+ If enabled, static wxWidgets libraries will be linked.
+
+``wxWidgets_CONFIG_OPTIONS``
+ This variable can be used for all other options that need to be passed to
+ the wx-config utility. For example, to use the base toolkit found on the
+ system at ``/usr`` install prefix, set the variable (before calling the
+ :command:`find_package` command) as such:
+
+ .. code-block:: cmake
+
+ set(wxWidgets_CONFIG_OPTIONS --toolkit=base --prefix=/usr)
+
+Deprecated Variables
+^^^^^^^^^^^^^^^^^^^^
+
+The following variables are provided for backward compatibility:
+
+``wxWidgets_VERSION_STRING``
+ .. deprecated:: 4.2
+ Use ``wxWidgets_VERSION``, which has the same value.
+
+ .. versionadded:: 3.4
+
+ The version of the wxWidgets found.
+
+``wxWidgets_USE_FILE``
+ .. deprecated:: 4.2
+ Instead of using this variable, include the :module:`UsewxWidgets`
+ module directly:
+
+ .. code-block:: cmake
+
+ include(UsewxWidgets)
+
+ The path to the :module:`UsewxWidgets` module for using wxWidgets in the
+ current directory. For example:
+
+ .. code-block:: cmake
+
+ find_package(wxWidgets)
+ if(wxWidgets_FOUND)
+ include(${wxWidgets_USE_FILE})
+ endif()
+
+Examples
+^^^^^^^^
+
+Example: Finding wxWidgets
+""""""""""""""""""""""""""
+
+Finding wxWidgets and making it required (if wxWidgets is not found,
+processing stops with an error message):
+
+.. code-block:: cmake
+
+ find_package(wxWidgets REQUIRED)
+
+Example: Using Imported Target
+""""""""""""""""""""""""""""""
+
+Finding wxWidgets and using imported target in a project:
+
+.. code-block:: cmake
+
+ find_package(wxWidgets)
+ target_link_libraries(example PRIVATE wxWidgets::wxWidgets)
+
+Example: Using Components
+"""""""""""""""""""""""""
+
+Finding wxWidgets and specifying components:
+
+.. code-block:: cmake
+
+ find_package(wxWidgets COMPONENTS gl core base OPTIONAL_COMPONENTS net)
+ target_link_libraries(example PRIVATE wxWidgets::wxWidgets)
+
+Example: Monolithic wxWidgets Build
+"""""""""""""""""""""""""""""""""""
+
+Sample usage with monolithic wxWidgets build:
+
+.. code-block:: cmake
+
+ find_package(wxWidgets COMPONENTS mono)
+ target_link_libraries(example PRIVATE wxWidgets::wxWidgets)
+
+Example: Using Variables
+""""""""""""""""""""""""
+
+Finding and using wxWidgets in CMake versions prior to 3.27, when the
+imported target wasn't yet available:
+
+.. code-block:: cmake
+
+ # Note that for MinGW users the order of libs is important.
+ find_package(wxWidgets COMPONENTS gl core base OPTIONAL_COMPONENTS net)
+
+ if(wxWidgets_FOUND)
+ include(UsewxWidgets)
+ # and for each of the project dependent executable/library targets:
+ target_link_libraries(example ${wxWidgets_LIBRARIES})
+ endif()
+#]=======================================================================]
+
+# NOTES
+#
+# This module has been tested on the WIN32 platform with wxWidgets
+# 2.6.2, 2.6.3, and 2.5.3. However, it has been designed to
+# easily extend support to all possible builds, e.g., static/shared,
+# debug/release, unicode, universal, multilib/monolithic, etc..
+#
+# If you want to use the module and your build type is not supported
+# out-of-the-box, please contact me to exchange information on how
+# your system is setup and I'll try to add support for it.
+#
+# AUTHOR
+#
+# Miguel A. Figueroa-Villanueva (miguelf at ieee dot org).
+# Jan Woetzel (jw at mip.informatik.uni-kiel.de).
+#
+# Based on previous works of:
+# Jan Woetzel (FindwxWindows.cmake),
+# Jorgen Bodde and Jerry Fath (FindwxWin.cmake).
+
+# TODO/ideas
+#
+# (1) Option/Setting to use all available wx libs
+# In contrast to expert developer who lists the
+# minimal set of required libs in wxWidgets_USE_LIBS
+# there is the newbie user:
+# - who just wants to link against WX with more 'magic'
+# - doesn't know the internal structure of WX or how it was built,
+# in particular if it is monolithic or not
+# - want to link against all available WX libs
+# Basically, the intent here is to mimic what wx-config would do by
+# default (i.e., `wx-config --libs`).
+#
+# Possible solution:
+# Add a reserved keyword "std" that initializes to what wx-config
+# would default to. If the user has not set the wxWidgets_USE_LIBS,
+# default to "std" instead of "base core" as it is now. To implement
+# "std" will basically boil down to a FOR_EACH lib-FOUND, but maybe
+# checking whether a minimal set was found.
+
+
+# FIXME: This and all the DBG_MSG calls should be removed after the
+# module stabilizes.
+#
+# Helper macro to control the debugging output globally. There are
+# two versions for controlling how verbose your output should be.
+macro(DBG_MSG _MSG)
+# message(STATUS
+# "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): ${_MSG}")
+endmacro()
+macro(DBG_MSG_V _MSG)
+# message(STATUS
+# "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): ${_MSG}")
+endmacro()
+
+# Clear return values in case the module is loaded more than once.
+set(wxWidgets_FOUND FALSE)
+set(wxWidgets_INCLUDE_DIRS "")
+set(wxWidgets_LIBRARIES "")
+set(wxWidgets_LIBRARY_DIRS "")
+set(wxWidgets_CXX_FLAGS "")
+
+# DEPRECATED: This is a patch to support the DEPRECATED use of
+# wxWidgets_USE_LIBS.
+#
+# If wxWidgets_USE_LIBS is set:
+# - if using <components>, then override wxWidgets_USE_LIBS
+# - else set wxWidgets_FIND_COMPONENTS to wxWidgets_USE_LIBS
+if(wxWidgets_USE_LIBS AND NOT wxWidgets_FIND_COMPONENTS)
+ set(wxWidgets_FIND_COMPONENTS ${wxWidgets_USE_LIBS})
+endif()
+DBG_MSG("wxWidgets_FIND_COMPONENTS : ${wxWidgets_FIND_COMPONENTS}")
+
+# Add the convenience use file if available.
+#
+# Get dir of this file which may reside in:
+# - CMAKE_ROOT/Modules on CMake installation
+# - CMAKE_MODULE_PATH if the user prefers their own specialized version
+set(wxWidgets_CURRENT_LIST_DIR "${CMAKE_CURRENT_LIST_DIR}")
+# Prefer an existing customized version, but the user might override
+# the FindwxWidgets module and not the UsewxWidgets one.
+if(EXISTS "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake")
+ set(wxWidgets_USE_FILE "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake")
+else()
+ set(wxWidgets_USE_FILE UsewxWidgets)
+endif()
+
+# Known wxWidgets versions.
+set(wx_versions 3.3 3.2 3.1 3.0 2.9 2.8 2.7 2.6 2.5)
+
+macro(wx_extract_version)
+ unset(_wx_filename)
+ find_file(_wx_filename wx/version.h PATHS ${wxWidgets_INCLUDE_DIRS} NO_DEFAULT_PATH)
+ dbg_msg("_wx_filename: ${_wx_filename}")
+
+ if(NOT _wx_filename)
+ message(FATAL_ERROR "wxWidgets wx/version.h file not found in ${wxWidgets_INCLUDE_DIRS}.")
+ endif()
+
+ file(READ "${_wx_filename}" _wx_version_h)
+ unset(_wx_filename CACHE)
+
+ string(REGEX REPLACE "^(.*\n)?#define +wxMAJOR_VERSION +([0-9]+).*"
+ "\\2" wxWidgets_VERSION_MAJOR "${_wx_version_h}" )
+ string(REGEX REPLACE "^(.*\n)?#define +wxMINOR_VERSION +([0-9]+).*"
+ "\\2" wxWidgets_VERSION_MINOR "${_wx_version_h}" )
+ string(REGEX REPLACE "^(.*\n)?#define +wxRELEASE_NUMBER +([0-9]+).*"
+ "\\2" wxWidgets_VERSION_PATCH "${_wx_version_h}" )
+ string(REGEX REPLACE "^(.*\n)?#define +wxSUBRELEASE_NUMBER +([0-9]+).*"
+ "\\2" wxWidgets_VERSION_TWEAK "${_wx_version_h}" )
+
+ set(wxWidgets_VERSION
+ "${wxWidgets_VERSION_MAJOR}.${wxWidgets_VERSION_MINOR}.${wxWidgets_VERSION_PATCH}")
+ if(${wxWidgets_VERSION_TWEAK} GREATER 0)
+ string(APPEND wxWidgets_VERSION ".${wxWidgets_VERSION_TWEAK}")
+ endif()
+ set(wxWidgets_VERSION_STRING "${wxWidgets_VERSION}")
+endmacro()
+
+#=====================================================================
+# Determine whether unix or win32 paths should be used
+#=====================================================================
+if(WIN32 AND NOT CYGWIN AND NOT MSYS AND NOT CMAKE_CROSSCOMPILING)
+ set(wxWidgets_FIND_STYLE "win32")
+else()
+ set(wxWidgets_FIND_STYLE "unix")
+endif()
+
+#=====================================================================
+# WIN32_FIND_STYLE
+#=====================================================================
+if(wxWidgets_FIND_STYLE STREQUAL "win32")
+ # Useful common wx libs needed by almost all components.
+ set(wxWidgets_WEBP_LIBRARIES webp webpdemux sharpyuv)
+ set(wxWidgets_COMMON_LIBRARIES png tiff jpeg zlib ${wxWidgets_WEBP_LIBRARIES} regex expat)
+
+ # Libraries needed by stc component
+ set(wxWidgets_STC_LIBRARIES scintilla lexilla)
+
+ # DEPRECATED: Use find_package(wxWidgets COMPONENTS mono) instead.
+ if(NOT wxWidgets_FIND_COMPONENTS)
+ if(wxWidgets_USE_MONOLITHIC)
+ set(wxWidgets_FIND_COMPONENTS mono)
+ else()
+ set(wxWidgets_FIND_COMPONENTS core base) # this is default
+ endif()
+ endif()
+
+ # Add the common (usually required libs) unless
+ # wxWidgets_EXCLUDE_COMMON_LIBRARIES has been set.
+ if(NOT wxWidgets_EXCLUDE_COMMON_LIBRARIES)
+ if(stc IN_LIST wxWidgets_FIND_COMPONENTS)
+ list(APPEND wxWidgets_FIND_COMPONENTS ${wxWidgets_STC_LIBRARIES})
+ endif()
+ list(APPEND wxWidgets_FIND_COMPONENTS ${wxWidgets_COMMON_LIBRARIES})
+ endif()
+
+ # Remove duplicates, for example when user has specified common libraries.
+ list(REMOVE_DUPLICATES wxWidgets_FIND_COMPONENTS)
+
+ #-------------------------------------------------------------------
+ # WIN32: Helper MACROS
+ #-------------------------------------------------------------------
+ #
+ # Get filename components for a configuration. For example,
+ # if _CONFIGURATION = mswunivud, then _PF="msw", _UNV=univ, _UCD=u _DBG=d
+ # if _CONFIGURATION = mswu, then _PF="msw", _UNV="", _UCD=u _DBG=""
+ #
+ macro(WX_GET_NAME_COMPONENTS _CONFIGURATION _PF _UNV _UCD _DBG)
+ DBG_MSG_V(${_CONFIGURATION})
+ string(REGEX MATCH "univ" ${_UNV} "${_CONFIGURATION}")
+ string(REGEX REPLACE "[msw|qt].*(u)[d]*$" "u" ${_UCD} "${_CONFIGURATION}")
+ if(${_UCD} STREQUAL ${_CONFIGURATION})
+ set(${_UCD} "")
+ endif()
+ string(REGEX MATCH "d$" ${_DBG} "${_CONFIGURATION}")
+ string(REGEX MATCH "^[msw|qt]*" ${_PF} "${_CONFIGURATION}")
+ endmacro()
+
+ #
+ # Find libraries associated to a configuration.
+ #
+ macro(WX_FIND_LIBS _PF _UNV _UCD _DBG _VER)
+ DBG_MSG_V("m_unv = ${_UNV}")
+ DBG_MSG_V("m_ucd = ${_UCD}")
+ DBG_MSG_V("m_dbg = ${_DBG}")
+ DBG_MSG_V("m_ver = ${_VER}")
+
+ # FIXME: What if both regex libs are available. regex should be
+ # found outside the loop and only wx${LIB}${_UCD}${_DBG}.
+ # Find wxWidgets common libraries.
+ foreach(LIB ${wxWidgets_COMMON_LIBRARIES} ${wxWidgets_STC_LIBRARIES})
+ find_library(WX_${LIB}${_DBG}
+ NAMES
+ wx${LIB}${_UCD}${_DBG} # for regex
+ wx${LIB}${_DBG}
+ PATHS ${WX_LIB_DIR}
+ NO_DEFAULT_PATH
+ )
+ mark_as_advanced(WX_${LIB}${_DBG})
+ endforeach()
+
+ # Find wxWidgets multilib base libraries.
+ find_library(WX_base${_DBG}
+ NAMES wxbase${_VER}${_UCD}${_DBG}
+ PATHS ${WX_LIB_DIR}
+ NO_DEFAULT_PATH
+ )
+ mark_as_advanced(WX_base${_DBG})
+ foreach(LIB net odbc xml)
+ find_library(WX_${LIB}${_DBG}
+ NAMES wxbase${_VER}${_UCD}${_DBG}_${LIB}
+ PATHS ${WX_LIB_DIR}
+ NO_DEFAULT_PATH
+ )
+ mark_as_advanced(WX_${LIB}${_DBG})
+ endforeach()
+
+ # Find wxWidgets monolithic library.
+ find_library(WX_mono${_DBG}
+ NAMES wx${_PF}${_UNV}${_VER}${_UCD}${_DBG}
+ PATHS ${WX_LIB_DIR}
+ NO_DEFAULT_PATH
+ )
+ mark_as_advanced(WX_mono${_DBG})
+
+ # Find wxWidgets multilib libraries.
+ foreach(LIB core adv aui html media xrc dbgrid gl qa richtext
+ stc ribbon propgrid webview)
+ find_library(WX_${LIB}${_DBG}
+ NAMES wx${_PF}${_UNV}${_VER}${_UCD}${_DBG}_${LIB}
+ PATHS ${WX_LIB_DIR}
+ NO_DEFAULT_PATH
+ )
+ mark_as_advanced(WX_${LIB}${_DBG})
+ endforeach()
+ endmacro()
+
+ #
+ # Clear all library paths, so that FIND_LIBRARY refinds them.
+ #
+ # Clear a lib, reset its found flag, and mark as advanced.
+ macro(WX_CLEAR_LIB _LIB)
+ set(${_LIB} "${_LIB}-NOTFOUND" CACHE FILEPATH "Cleared." FORCE)
+ set(${_LIB}_FOUND FALSE)
+ mark_as_advanced(${_LIB})
+ endmacro()
+ # Clear all debug or release library paths (arguments are "d" or "").
+ macro(WX_CLEAR_ALL_LIBS _DBG)
+ # Clear wxWidgets common libraries.
+ foreach(LIB ${wxWidgets_COMMON_LIBRARIES} ${wxWidgets_STC_LIBRARIES})
+ WX_CLEAR_LIB(WX_${LIB}${_DBG})
+ endforeach()
+
+ # Clear wxWidgets multilib base libraries.
+ WX_CLEAR_LIB(WX_base${_DBG})
+ foreach(LIB net odbc xml)
+ WX_CLEAR_LIB(WX_${LIB}${_DBG})
+ endforeach()
+
+ # Clear wxWidgets monolithic library.
+ WX_CLEAR_LIB(WX_mono${_DBG})
+
+ # Clear wxWidgets multilib libraries.
+ foreach(LIB core adv aui html media xrc dbgrid gl qa richtext
+ webview stc ribbon propgrid)
+ WX_CLEAR_LIB(WX_${LIB}${_DBG})
+ endforeach()
+ endmacro()
+ # Clear all wxWidgets debug libraries.
+ macro(WX_CLEAR_ALL_DBG_LIBS)
+ WX_CLEAR_ALL_LIBS("d")
+ endmacro()
+ # Clear all wxWidgets release libraries.
+ macro(WX_CLEAR_ALL_REL_LIBS)
+ WX_CLEAR_ALL_LIBS("")
+ endmacro()
+
+ #
+ # Set the wxWidgets_LIBRARIES variable.
+ # Also, Sets output variable wxWidgets_FOUND to FALSE if it fails.
+ #
+ macro(WX_SET_LIBRARIES _LIBS _DBG)
+ DBG_MSG_V("Looking for ${${_LIBS}}")
+ if(WX_USE_REL_AND_DBG)
+ foreach(LIB ${${_LIBS}})
+ DBG_MSG_V("Searching for ${LIB} and ${LIB}d")
+ DBG_MSG_V("WX_${LIB} : ${WX_${LIB}}")
+ DBG_MSG_V("WX_${LIB}d : ${WX_${LIB}d}")
+ if(WX_${LIB} AND WX_${LIB}d)
+ DBG_MSG_V("Found ${LIB} and ${LIB}d")
+ list(APPEND wxWidgets_LIBRARIES
+ debug ${WX_${LIB}d} optimized ${WX_${LIB}}
+ )
+ set(wxWidgets_${LIB}_FOUND TRUE)
+ elseif(NOT wxWidgets_FIND_REQUIRED_${LIB})
+ DBG_MSG_V("- ignored optional missing WX_${LIB}=${WX_${LIB}} or WX_${LIB}d=${WX_${LIB}d}")
+ else()
+ DBG_MSG_V("- not found due to missing WX_${LIB}=${WX_${LIB}} or WX_${LIB}d=${WX_${LIB}d}")
+ set(wxWidgets_FOUND FALSE)
+ endif()
+ endforeach()
+ else()
+ foreach(LIB ${${_LIBS}})
+ DBG_MSG_V("Searching for ${LIB}${_DBG}")
+ DBG_MSG_V("WX_${LIB}${_DBG} : ${WX_${LIB}${_DBG}}")
+ if(WX_${LIB}${_DBG})
+ DBG_MSG_V("Found ${LIB}${_DBG}")
+ list(APPEND wxWidgets_LIBRARIES ${WX_${LIB}${_DBG}})
+ set(wxWidgets_${LIB}_FOUND TRUE)
+ elseif(NOT wxWidgets_FIND_REQUIRED_${LIB})
+ DBG_MSG_V("- ignored optional missing WX_${LIB}${_DBG}=${WX_${LIB}${_DBG}}")
+ else()
+ DBG_MSG_V("- not found due to missing WX_${LIB}${_DBG}=${WX_${LIB}${_DBG}}")
+ set(wxWidgets_FOUND FALSE)
+ endif()
+ endforeach()
+ endif()
+
+ DBG_MSG_V("OpenGL")
+ if(gl IN_LIST ${_LIBS})
+ DBG_MSG_V("- is required.")
+ list(APPEND wxWidgets_LIBRARIES opengl32 glu32)
+ endif()
+
+ if(stc IN_LIST ${_LIBS})
+ list(APPEND wxWidgets_LIBRARIES imm32)
+ endif()
+
+ list(APPEND wxWidgets_LIBRARIES
+ kernel32
+ user32
+ gdi32
+ gdiplus
+ msimg32
+ comdlg32
+ winspool
+ winmm
+ shell32
+ shlwapi
+ comctl32
+ ole32
+ oleaut32
+ uuid
+ rpcrt4
+ advapi32
+ version
+ ws2_32
+ wininet
+ oleacc
+ uxtheme
+ wsock32
+ )
+ endmacro()
+
+ #-------------------------------------------------------------------
+ # WIN32: Start actual work.
+ #-------------------------------------------------------------------
+
+ set(wx_paths "wxWidgets")
+ foreach(version ${wx_versions})
+ foreach(patch RANGE 15 0 -1)
+ list(APPEND wx_paths "wxWidgets-${version}.${patch}")
+ foreach(tweak RANGE 3 1 -1)
+ list(APPEND wx_paths "wxWidgets-${version}.${patch}.${tweak}")
+ endforeach()
+ endforeach()
+ endforeach()
+
+ # Look for an installation tree.
+ find_path(wxWidgets_ROOT_DIR
+ NAMES include/wx/wx.h
+ PATHS
+ ENV wxWidgets_ROOT_DIR
+ ENV WXWIN
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\wxWidgets_is1;Inno Setup: App Path]" # WX 2.6.x
+ C:/
+ D:/
+ ENV ProgramFiles
+ PATH_SUFFIXES
+ ${wx_paths}
+ DOC "wxWidgets base/installation directory"
+ )
+
+ # If wxWidgets_ROOT_DIR changed, clear lib dir.
+ if(NOT WX_ROOT_DIR STREQUAL wxWidgets_ROOT_DIR)
+ if(NOT wxWidgets_LIB_DIR OR WX_ROOT_DIR)
+ set(wxWidgets_LIB_DIR "wxWidgets_LIB_DIR-NOTFOUND"
+ CACHE PATH "Cleared." FORCE)
+ endif()
+ set(WX_ROOT_DIR ${wxWidgets_ROOT_DIR}
+ CACHE INTERNAL "wxWidgets_ROOT_DIR")
+ endif()
+
+ if(WX_ROOT_DIR)
+ # Select one default tree inside the already determined wx tree.
+ # Prefer static/shared order usually consistent with build
+ # settings.
+ set(_WX_TOOL "")
+ set(_WX_TOOLVER "")
+ set(_WX_ARCH "")
+ if(MINGW)
+ set(_WX_TOOL gcc)
+ elseif(MSVC)
+ set(_WX_TOOL vc)
+ set(_WX_TOOLVER ${MSVC_TOOLSET_VERSION})
+ # support for a lib/vc14x_x64_dll/ path from wxW 3.1.3 distribution
+ string(REGEX REPLACE ".$" "x" _WX_TOOLVERx ${_WX_TOOLVER})
+ if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+ set(_WX_ARCH _x64)
+ endif()
+ endif()
+ if(BUILD_SHARED_LIBS)
+ find_path(wxWidgets_LIB_DIR
+ NAMES
+ qtu/wx/setup.h
+ qtud/wx/setup.h
+ msw/wx/setup.h
+ mswd/wx/setup.h
+ mswu/wx/setup.h
+ mswud/wx/setup.h
+ mswuniv/wx/setup.h
+ mswunivd/wx/setup.h
+ mswunivu/wx/setup.h
+ mswunivud/wx/setup.h
+ PATHS
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}_xp${_WX_ARCH}_dll # prefer shared
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}${_WX_ARCH}_dll # prefer shared
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}_xp${_WX_ARCH}_dll # prefer shared
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}${_WX_ARCH}_dll # prefer shared
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_ARCH}_dll # prefer shared
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}_xp${_WX_ARCH}_lib
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}${_WX_ARCH}_lib
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}_xp${_WX_ARCH}_lib
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}${_WX_ARCH}_lib
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_ARCH}_lib
+ DOC "Path to wxWidgets libraries"
+ NO_DEFAULT_PATH
+ )
+ else()
+ find_path(wxWidgets_LIB_DIR
+ NAMES
+ qtu/wx/setup.h
+ qtud/wx/setup.h
+ msw/wx/setup.h
+ mswd/wx/setup.h
+ mswu/wx/setup.h
+ mswud/wx/setup.h
+ mswuniv/wx/setup.h
+ mswunivd/wx/setup.h
+ mswunivu/wx/setup.h
+ mswunivud/wx/setup.h
+ PATHS
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}_xp${_WX_ARCH}_lib # prefer static
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}${_WX_ARCH}_lib # prefer static
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}_xp${_WX_ARCH}_lib # prefer static
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}${_WX_ARCH}_lib # prefer static
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_ARCH}_lib # prefer static
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}_xp${_WX_ARCH}_dll
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}${_WX_ARCH}_dll
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}_xp${_WX_ARCH}_dll
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVERx}${_WX_ARCH}_dll
+ ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_ARCH}_dll
+ DOC "Path to wxWidgets libraries"
+ NO_DEFAULT_PATH
+ )
+ endif()
+ unset(_WX_TOOL)
+ unset(_WX_TOOLVER)
+ unset(_WX_ARCH)
+
+ # If wxWidgets_LIB_DIR changed, clear all libraries.
+ if(NOT WX_LIB_DIR STREQUAL wxWidgets_LIB_DIR)
+ set(WX_LIB_DIR ${wxWidgets_LIB_DIR} CACHE INTERNAL "wxWidgets_LIB_DIR")
+ WX_CLEAR_ALL_DBG_LIBS()
+ WX_CLEAR_ALL_REL_LIBS()
+ endif()
+
+ if(WX_LIB_DIR)
+ # If building shared libs, define WXUSINGDLL to use dllimport.
+ if(WX_LIB_DIR MATCHES "[dD][lL][lL]")
+ set(wxWidgets_DEFINITIONS WXUSINGDLL)
+ DBG_MSG_V("detected SHARED/DLL tree WX_LIB_DIR=${WX_LIB_DIR}")
+ endif()
+
+ # Search for available configuration types.
+ foreach(CFG mswunivud mswunivd mswud mswd mswunivu mswuniv mswu msw qt qtd qtu qtud)
+ set(WX_${CFG}_FOUND FALSE)
+ if(EXISTS ${WX_LIB_DIR}/${CFG})
+ list(APPEND WX_CONFIGURATION_LIST ${CFG})
+ set(WX_${CFG}_FOUND TRUE)
+ set(WX_CONFIGURATION ${CFG})
+ endif()
+ endforeach()
+ DBG_MSG_V("WX_CONFIGURATION_LIST=${WX_CONFIGURATION_LIST}")
+
+ if(WX_CONFIGURATION)
+ set(wxWidgets_FOUND TRUE)
+
+ # If the selected configuration wasn't found force the default
+ # one. Otherwise, use it but still force a refresh for
+ # updating the doc string with the current list of available
+ # configurations.
+ if(NOT WX_${wxWidgets_CONFIGURATION}_FOUND)
+ set(wxWidgets_CONFIGURATION ${WX_CONFIGURATION} CACHE STRING
+ "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE)
+ else()
+ set(wxWidgets_CONFIGURATION ${wxWidgets_CONFIGURATION} CACHE STRING
+ "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE)
+ endif()
+
+ # If release config selected, and both release/debug exist.
+ if(WX_${wxWidgets_CONFIGURATION}d_FOUND)
+ option(wxWidgets_USE_REL_AND_DBG
+ "Use release and debug configurations?" TRUE)
+ set(WX_USE_REL_AND_DBG ${wxWidgets_USE_REL_AND_DBG})
+ else()
+ # If the option exists (already in cache), force it false.
+ if(wxWidgets_USE_REL_AND_DBG)
+ set(wxWidgets_USE_REL_AND_DBG FALSE CACHE BOOL
+ "No ${wxWidgets_CONFIGURATION}d found." FORCE)
+ endif()
+ set(WX_USE_REL_AND_DBG FALSE)
+ endif()
+
+ # Get configuration parameters from the name.
+ WX_GET_NAME_COMPONENTS(${wxWidgets_CONFIGURATION} PF UNV UCD DBG)
+
+ # Set wxWidgets lib setup include directory.
+ if(EXISTS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h)
+ set(wxWidgets_INCLUDE_DIRS
+ ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION})
+ else()
+ DBG_MSG("wxWidgets_FOUND FALSE because ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h does not exist.")
+ set(wxWidgets_FOUND FALSE)
+ endif()
+
+ # Set wxWidgets main include directory.
+ if(EXISTS ${WX_ROOT_DIR}/include/wx/wx.h)
+ list(APPEND wxWidgets_INCLUDE_DIRS ${WX_ROOT_DIR}/include)
+ else()
+ DBG_MSG("wxWidgets_FOUND FALSE because WX_ROOT_DIR=${WX_ROOT_DIR} has no ${WX_ROOT_DIR}/include/wx/wx.h")
+ set(wxWidgets_FOUND FALSE)
+ endif()
+
+ # Get version number.
+ wx_extract_version()
+ set(VER "${wxWidgets_VERSION_MAJOR}${wxWidgets_VERSION_MINOR}")
+
+ # Find wxWidgets libraries.
+ WX_FIND_LIBS("${PF}" "${UNV}" "${UCD}" "${DBG}" "${VER}")
+ if(WX_USE_REL_AND_DBG)
+ WX_FIND_LIBS("${PF}" "${UNV}" "${UCD}" "d" "${VER}")
+ endif()
+
+ # Settings for requested libs (i.e., include dir, libraries, etc.).
+ WX_SET_LIBRARIES(wxWidgets_FIND_COMPONENTS "${DBG}")
+
+ # Add necessary definitions for unicode builds
+ if("${UCD}" STREQUAL "u")
+ list(APPEND wxWidgets_DEFINITIONS UNICODE _UNICODE)
+ endif()
+
+ # Add necessary definitions for debug builds
+ set(wxWidgets_DEFINITIONS_DEBUG _DEBUG __WXDEBUG__)
+
+ endif()
+ endif()
+ endif()
+
+ if(MINGW AND NOT wxWidgets_FOUND)
+ # Try unix search mode as well.
+ set(wxWidgets_FIND_STYLE "unix")
+ dbg_msg_v("wxWidgets_FIND_STYLE changed to unix")
+ endif()
+endif()
+
+#=====================================================================
+# UNIX_FIND_STYLE
+#=====================================================================
+if(wxWidgets_FIND_STYLE STREQUAL "unix")
+ #-----------------------------------------------------------------
+ # UNIX: Helper MACROS
+ #-----------------------------------------------------------------
+ #
+ # Set the default values based on "wx-config --selected-config".
+ #
+ macro(WX_CONFIG_SELECT_GET_DEFAULT)
+ execute_process(
+ COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
+ ${wxWidgets_CONFIG_OPTIONS} --selected-config
+ OUTPUT_VARIABLE _wx_selected_config
+ RESULT_VARIABLE _wx_result
+ ERROR_QUIET
+ )
+ if(_wx_result EQUAL 0)
+ foreach(_opt_name debug static unicode universal)
+ string(TOUPPER ${_opt_name} _upper_opt_name)
+ if(_wx_selected_config MATCHES "${_opt_name}")
+ set(wxWidgets_DEFAULT_${_upper_opt_name} ON)
+ else()
+ set(wxWidgets_DEFAULT_${_upper_opt_name} OFF)
+ endif()
+ endforeach()
+ else()
+ foreach(_upper_opt_name DEBUG STATIC UNICODE UNIVERSAL)
+ set(wxWidgets_DEFAULT_${_upper_opt_name} OFF)
+ endforeach()
+ endif()
+ endmacro()
+
+ #
+ # Query a boolean configuration option to determine if the system
+ # has both builds available. If so, provide the selection option
+ # to the user.
+ #
+ macro(WX_CONFIG_SELECT_QUERY_BOOL _OPT_NAME _OPT_HELP)
+ execute_process(
+ COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
+ ${wxWidgets_CONFIG_OPTIONS} --${_OPT_NAME}=yes
+ RESULT_VARIABLE _wx_result_yes
+ OUTPUT_QUIET
+ ERROR_QUIET
+ )
+ execute_process(
+ COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
+ ${wxWidgets_CONFIG_OPTIONS} --${_OPT_NAME}=no
+ RESULT_VARIABLE _wx_result_no
+ OUTPUT_QUIET
+ ERROR_QUIET
+ )
+ string(TOUPPER ${_OPT_NAME} _UPPER_OPT_NAME)
+ if(_wx_result_yes EQUAL 0 AND _wx_result_no EQUAL 0)
+ option(wxWidgets_USE_${_UPPER_OPT_NAME}
+ ${_OPT_HELP} ${wxWidgets_DEFAULT_${_UPPER_OPT_NAME}})
+ else()
+ # If option exists (already in cache), force to available one.
+ if(DEFINED wxWidgets_USE_${_UPPER_OPT_NAME})
+ if(_wx_result_yes EQUAL 0)
+ set(wxWidgets_USE_${_UPPER_OPT_NAME} ON CACHE BOOL ${_OPT_HELP} FORCE)
+ else()
+ set(wxWidgets_USE_${_UPPER_OPT_NAME} OFF CACHE BOOL ${_OPT_HELP} FORCE)
+ endif()
+ endif()
+ endif()
+ endmacro()
+
+ #
+ # Set wxWidgets_SELECT_OPTIONS to wx-config options for selecting
+ # among multiple builds.
+ #
+ macro(WX_CONFIG_SELECT_SET_OPTIONS)
+ set(wxWidgets_SELECT_OPTIONS ${wxWidgets_CONFIG_OPTIONS})
+ foreach(_opt_name debug static unicode universal)
+ string(TOUPPER ${_opt_name} _upper_opt_name)
+ if(DEFINED wxWidgets_USE_${_upper_opt_name})
+ if(wxWidgets_USE_${_upper_opt_name})
+ list(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=yes)
+ else()
+ list(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=no)
+ endif()
+ endif()
+ endforeach()
+ endmacro()
+
+ #-----------------------------------------------------------------
+ # UNIX: Start actual work.
+ #-----------------------------------------------------------------
+ # Support cross-compiling, only search in the target platform.
+ #
+ # Look for wx-config -- this can be set in the environment,
+ # or try versioned and toolchain-versioned variants of the -config
+ # executable as well.
+ set(wx_config_names "wx-config")
+ foreach(version ${wx_versions})
+ list(APPEND wx_config_names "wx-config-${version}" "wxgtk3u-${version}-config" "wxgtk2u-${version}-config")
+ endforeach()
+ find_program(wxWidgets_CONFIG_EXECUTABLE
+ NAMES
+ $ENV{WX_CONFIG}
+ ${wx_config_names}
+ DOC "Location of wxWidgets library configuration provider binary (wx-config)."
+ ONLY_CMAKE_FIND_ROOT_PATH
+ )
+
+ if(wxWidgets_CONFIG_EXECUTABLE)
+ set(wxWidgets_FOUND TRUE)
+
+ # get defaults based on "wx-config --selected-config"
+ WX_CONFIG_SELECT_GET_DEFAULT()
+
+ # for each option: if both builds are available, provide option
+ WX_CONFIG_SELECT_QUERY_BOOL(debug "Use debug build?")
+ WX_CONFIG_SELECT_QUERY_BOOL(unicode "Use unicode build?")
+ WX_CONFIG_SELECT_QUERY_BOOL(universal "Use universal build?")
+ WX_CONFIG_SELECT_QUERY_BOOL(static "Link libraries statically?")
+
+ # process selection to set wxWidgets_SELECT_OPTIONS
+ WX_CONFIG_SELECT_SET_OPTIONS()
+ DBG_MSG("wxWidgets_SELECT_OPTIONS=${wxWidgets_SELECT_OPTIONS}")
+
+ # run the wx-config program to get cxxflags
+ execute_process(
+ COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
+ ${wxWidgets_SELECT_OPTIONS} --cxxflags
+ OUTPUT_VARIABLE wxWidgets_CXX_FLAGS
+ RESULT_VARIABLE RET
+ ERROR_QUIET
+ )
+ if(RET EQUAL 0)
+ string(STRIP "${wxWidgets_CXX_FLAGS}" wxWidgets_CXX_FLAGS)
+ separate_arguments(wxWidgets_CXX_FLAGS_LIST NATIVE_COMMAND "${wxWidgets_CXX_FLAGS}")
+
+ DBG_MSG_V("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}")
+
+ # parse definitions and include dirs from cxxflags
+ # drop the -D and -I prefixes
+ set(wxWidgets_CXX_FLAGS)
+ foreach(arg IN LISTS wxWidgets_CXX_FLAGS_LIST)
+ if("${arg}" MATCHES "^-I(.*)$")
+ # include directory
+ list(APPEND wxWidgets_INCLUDE_DIRS "${CMAKE_MATCH_1}")
+ elseif("${arg}" MATCHES "^-D(.*)$")
+ # compile definition
+ list(APPEND wxWidgets_DEFINITIONS "${CMAKE_MATCH_1}")
+ else()
+ list(APPEND wxWidgets_CXX_FLAGS "${arg}")
+ endif()
+ endforeach()
+
+ DBG_MSG_V("wxWidgets_DEFINITIONS=${wxWidgets_DEFINITIONS}")
+ DBG_MSG_V("wxWidgets_INCLUDE_DIRS=${wxWidgets_INCLUDE_DIRS}")
+ DBG_MSG_V("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}")
+
+ else()
+ set(wxWidgets_FOUND FALSE)
+ DBG_MSG_V(
+ "${wxWidgets_CONFIG_EXECUTABLE} --cxxflags FAILED with RET=${RET}")
+ endif()
+
+ # run the wx-config program to get the libs
+ # - NOTE: wx-config doesn't verify that the libs requested exist
+ # it just produces the names. Maybe a TRY_COMPILE would
+ # be useful here...
+ unset(_cmp_req)
+ unset(_cmp_opt)
+ foreach(_cmp IN LISTS wxWidgets_FIND_COMPONENTS)
+ if(wxWidgets_FIND_REQUIRED_${_cmp})
+ list(APPEND _cmp_req "${_cmp}")
+ else()
+ list(APPEND _cmp_opt "${_cmp}")
+ endif()
+ endforeach()
+ DBG_MSG_V("wxWidgets required components : ${_cmp_req}")
+ DBG_MSG_V("wxWidgets optional components : ${_cmp_opt}")
+ if(DEFINED _cmp_opt)
+ string(REPLACE ";" "," _cmp_opt "${_cmp_opt}")
+ set(_cmp_opt "--optional-libs" ${_cmp_opt})
+ endif()
+ string(REPLACE ";" "," _cmp_req "${_cmp_req}")
+ execute_process(
+ COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
+ ${wxWidgets_SELECT_OPTIONS} --libs ${_cmp_req} ${_cmp_opt}
+ OUTPUT_VARIABLE wxWidgets_LIBRARIES
+ RESULT_VARIABLE RET
+ ERROR_QUIET
+ )
+ if(RET EQUAL 0)
+ string(STRIP "${wxWidgets_LIBRARIES}" wxWidgets_LIBRARIES)
+ separate_arguments(wxWidgets_LIBRARIES)
+ string(REPLACE "-framework;" "-framework "
+ wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
+ string(REPLACE "-weak_framework;" "-weak_framework "
+ wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
+ string(REPLACE "-arch;" "-arch "
+ wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
+ string(REPLACE "-isysroot;" "-isysroot "
+ wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
+
+ # extract linkdirs (-L) for rpath (i.e., LINK_DIRECTORIES)
+ string(REGEX MATCHALL "-L[^;]+"
+ wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARIES}")
+ string(REGEX REPLACE "-L([^;]+)" "\\1"
+ wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARY_DIRS}")
+
+ DBG_MSG_V("wxWidgets_LIBRARIES=${wxWidgets_LIBRARIES}")
+ DBG_MSG_V("wxWidgets_LIBRARY_DIRS=${wxWidgets_LIBRARY_DIRS}")
+
+ else()
+ set(wxWidgets_FOUND FALSE)
+ DBG_MSG("${wxWidgets_CONFIG_EXECUTABLE} --libs ${_cmp_req} ${_cmp_opt} FAILED with RET=${RET}")
+ endif()
+ unset(_cmp_req)
+ unset(_cmp_opt)
+ endif()
+
+ # When using wx-config in MSYS, the include paths are UNIX style paths which may or may
+ # not work correctly depending on you MSYS/MinGW configuration. CMake expects native
+ # paths internally.
+ if(wxWidgets_FOUND AND MSYS)
+ find_program(_cygpath_exe cygpath ONLY_CMAKE_FIND_ROOT_PATH)
+ DBG_MSG_V("_cygpath_exe: ${_cygpath_exe}")
+ if(_cygpath_exe)
+ set(_tmp_path "")
+ foreach(_path ${wxWidgets_INCLUDE_DIRS})
+ execute_process(
+ COMMAND cygpath -w ${_path}
+ OUTPUT_VARIABLE _native_path
+ RESULT_VARIABLE _retv
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_QUIET
+ )
+ if(_retv EQUAL 0)
+ file(TO_CMAKE_PATH ${_native_path} _native_path)
+ DBG_MSG_V("Path ${_path} converted to ${_native_path}")
+ string(APPEND _tmp_path " ${_native_path}")
+ endif()
+ endforeach()
+ DBG_MSG("Setting wxWidgets_INCLUDE_DIRS = ${_tmp_path}")
+ set(wxWidgets_INCLUDE_DIRS ${_tmp_path})
+ separate_arguments(wxWidgets_INCLUDE_DIRS)
+ list(REMOVE_ITEM wxWidgets_INCLUDE_DIRS "")
+
+ set(_tmp_path "")
+ foreach(_path ${wxWidgets_LIBRARY_DIRS})
+ execute_process(
+ COMMAND cygpath -w ${_path}
+ OUTPUT_VARIABLE _native_path
+ RESULT_VARIABLE _retv
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_QUIET
+ )
+ if(_retv EQUAL 0)
+ file(TO_CMAKE_PATH ${_native_path} _native_path)
+ DBG_MSG_V("Path ${_path} converted to ${_native_path}")
+ string(APPEND _tmp_path " ${_native_path}")
+ endif()
+ endforeach()
+ DBG_MSG("Setting wxWidgets_LIBRARY_DIRS = ${_tmp_path}")
+ set(wxWidgets_LIBRARY_DIRS ${_tmp_path})
+ separate_arguments(wxWidgets_LIBRARY_DIRS)
+ list(REMOVE_ITEM wxWidgets_LIBRARY_DIRS "")
+ endif()
+ unset(_cygpath_exe CACHE)
+ endif()
+
+ # Check that all libraries are present, as wx-config does not check it
+ set(_wx_lib_missing "")
+ foreach(_wx_lib_ ${wxWidgets_LIBRARIES})
+ if("${_wx_lib_}" MATCHES "^-l(.*)")
+ set(_wx_lib_name "${CMAKE_MATCH_1}")
+ if(_wx_lib_name STREQUAL "atomic")
+ continue()
+ endif()
+
+ unset(_wx_lib_found CACHE)
+ find_library(_wx_lib_found NAMES ${_wx_lib_name} HINTS ${wxWidgets_LIBRARY_DIRS})
+ if(_wx_lib_found STREQUAL _wx_lib_found-NOTFOUND)
+ list(APPEND _wx_lib_missing ${_wx_lib_name})
+ endif()
+ unset(_wx_lib_found CACHE)
+ endif()
+ endforeach()
+
+ if (_wx_lib_missing)
+ string(REPLACE ";" " " _wx_lib_missing "${_wx_lib_missing}")
+ DBG_MSG_V("wxWidgets not found due to following missing libraries: ${_wx_lib_missing}")
+ set(wxWidgets_FOUND FALSE)
+ unset(wxWidgets_LIBRARIES)
+ endif()
+ unset(_wx_lib_missing)
+endif()
+
+# Check if a specific version was requested by find_package().
+if(wxWidgets_FOUND)
+ wx_extract_version()
+endif()
+
+file(TO_CMAKE_PATH "${wxWidgets_INCLUDE_DIRS}" wxWidgets_INCLUDE_DIRS)
+file(TO_CMAKE_PATH "${wxWidgets_LIBRARY_DIRS}" wxWidgets_LIBRARY_DIRS)
+
+# Debug output:
+DBG_MSG("wxWidgets_FOUND : ${wxWidgets_FOUND}")
+DBG_MSG("wxWidgets_INCLUDE_DIRS : ${wxWidgets_INCLUDE_DIRS}")
+DBG_MSG("wxWidgets_LIBRARY_DIRS : ${wxWidgets_LIBRARY_DIRS}")
+DBG_MSG("wxWidgets_LIBRARIES : ${wxWidgets_LIBRARIES}")
+DBG_MSG("wxWidgets_CXX_FLAGS : ${wxWidgets_CXX_FLAGS}")
+
+#=====================================================================
+#=====================================================================
+
+include(FindPackageHandleStandardArgs)
+
+# FIXME: set wxWidgets_<comp>_FOUND for wx-config branch
+# and use HANDLE_COMPONENTS on Unix too
+if(wxWidgets_FIND_STYLE STREQUAL "win32")
+ set(wxWidgets_HANDLE_COMPONENTS "HANDLE_COMPONENTS")
+endif()
+
+find_package_handle_standard_args(wxWidgets
+ REQUIRED_VARS wxWidgets_LIBRARIES wxWidgets_INCLUDE_DIRS
+ VERSION_VAR wxWidgets_VERSION
+ ${wxWidgets_HANDLE_COMPONENTS}
+ )
+unset(wxWidgets_HANDLE_COMPONENTS)
+
+if(wxWidgets_FOUND AND NOT TARGET wxWidgets::wxWidgets)
+ add_library(wxWidgets::wxWidgets INTERFACE IMPORTED)
+ target_link_libraries(wxWidgets::wxWidgets INTERFACE ${wxWidgets_LIBRARIES})
+ target_link_directories(wxWidgets::wxWidgets INTERFACE ${wxWidgets_LIBRARY_DIRS})
+ target_include_directories(wxWidgets::wxWidgets INTERFACE ${wxWidgets_INCLUDE_DIRS})
+ target_compile_options(wxWidgets::wxWidgets INTERFACE ${wxWidgets_CXX_FLAGS})
+ target_compile_definitions(wxWidgets::wxWidgets INTERFACE ${wxWidgets_DEFINITIONS})
+ # FIXME: Add "$<$<CONFIG:Debug>:${wxWidgets_DEFINITIONS_DEBUG}>"
+ # if the debug library variant is available.
+endif()
+
+#=====================================================================
+# Macros for use in wxWidgets apps.
+# - This module will not fail to find wxWidgets based on the code
+# below. Hence, it's required to check for validity of:
+#
+# wxWidgets_wxrc_EXECUTABLE
+#=====================================================================
+
+# Resource file compiler.
+find_program(wxWidgets_wxrc_EXECUTABLE
+ NAMES $ENV{WXRC_CMD} wxrc
+ PATHS ${wxWidgets_ROOT_DIR}/utils/wxrc/vc_msw
+ DOC "Location of wxWidgets resource file compiler binary (wxrc)"
+ )
+
+#
+# WX_SPLIT_ARGUMENTS_ON(<keyword> <left> <right> <arg1> <arg2> ...)
+#
+# Sets <left> and <right> to contain arguments to the left and right,
+# respectively, of <keyword>.
+#
+# Example usage:
+# function(WXWIDGETS_ADD_RESOURCES outfiles)
+# WX_SPLIT_ARGUMENTS_ON(OPTIONS wxrc_files wxrc_options ${ARGN})
+# ...
+# endfunction()
+#
+# WXWIDGETS_ADD_RESOURCES(sources ${xrc_files} OPTIONS -e -o file.C)
+#
+# NOTE: This is a generic piece of code that should be renamed to
+# SPLIT_ARGUMENTS_ON and put in a file serving the same purpose as
+# FindPackageHandleStandardArgs.cmake. At the time of this writing
+# FindQt4.cmake has a qt4_extract_options(), which I basically copied
+# here a bit more generalized. So, there are already two find modules
+# using this approach.
+#
+function(WX_SPLIT_ARGUMENTS_ON _keyword _leftvar _rightvar)
+ # FIXME: Document that the input variables will be cleared.
+ #list(APPEND ${_leftvar} "")
+ #list(APPEND ${_rightvar} "")
+ set(${_leftvar} "")
+ set(${_rightvar} "")
+
+ set(_doing_right FALSE)
+ foreach(element ${ARGN})
+ if("${element}" STREQUAL "${_keyword}")
+ set(_doing_right TRUE)
+ else()
+ if(_doing_right)
+ list(APPEND ${_rightvar} "${element}")
+ else()
+ list(APPEND ${_leftvar} "${element}")
+ endif()
+ endif()
+ endforeach()
+
+ set(${_leftvar} ${${_leftvar}} PARENT_SCOPE)
+ set(${_rightvar} ${${_rightvar}} PARENT_SCOPE)
+endfunction()
+
+#
+# WX_GET_DEPENDENCIES_FROM_XML(
+# <depends>
+# <match_pattern>
+# <clean_pattern>
+# <xml_contents>
+# <depends_path>
+# )
+#
+# FIXME: Add documentation here...
+#
+function(WX_GET_DEPENDENCIES_FROM_XML
+ _depends
+ _match_patt
+ _clean_patt
+ _xml_contents
+ _depends_path
+ )
+
+ string(REGEX MATCHALL
+ ${_match_patt}
+ dep_file_list
+ "${${_xml_contents}}"
+ )
+ foreach(dep_file ${dep_file_list})
+ string(REGEX REPLACE ${_clean_patt} "" dep_file "${dep_file}")
+
+ # make the file have an absolute path
+ if(NOT IS_ABSOLUTE "${dep_file}")
+ set(dep_file "${${_depends_path}}/${dep_file}")
+ endif()
+
+ # append file to dependency list
+ list(APPEND ${_depends} "${dep_file}")
+ endforeach()
+
+ set(${_depends} ${${_depends}} PARENT_SCOPE)
+endfunction()
+
+#
+# WXWIDGETS_ADD_RESOURCES(<sources> <xrc_files>
+# OPTIONS <options> [NO_CPP_CODE])
+#
+# Adds a custom command for resource file compilation of the
+# <xrc_files> and appends the output files to <sources>.
+#
+# Example usages:
+# WXWIDGETS_ADD_RESOURCES(sources xrc/main_frame.xrc)
+# WXWIDGETS_ADD_RESOURCES(sources ${xrc_files} OPTIONS -e -o altname.cxx)
+#
+function(WXWIDGETS_ADD_RESOURCES _outfiles)
+ WX_SPLIT_ARGUMENTS_ON(OPTIONS rc_file_list rc_options ${ARGN})
+
+ # Parse files for dependencies.
+ set(rc_file_list_abs "")
+ set(rc_depends "")
+ foreach(rc_file ${rc_file_list})
+ get_filename_component(depends_path ${rc_file} PATH)
+
+ get_filename_component(rc_file_abs ${rc_file} ABSOLUTE)
+ list(APPEND rc_file_list_abs "${rc_file_abs}")
+
+ # All files have absolute paths or paths relative to the location
+ # of the rc file.
+ file(READ "${rc_file_abs}" rc_file_contents)
+
+ # get bitmap/bitmap2 files
+ WX_GET_DEPENDENCIES_FROM_XML(
+ rc_depends
+ "<bitmap[^<]+"
+ "^<bitmap[^>]*>"
+ rc_file_contents
+ depends_path
+ )
+
+ # get url files
+ WX_GET_DEPENDENCIES_FROM_XML(
+ rc_depends
+ "<url[^<]+"
+ "^<url[^>]*>"
+ rc_file_contents
+ depends_path
+ )
+
+ # get wxIcon files
+ WX_GET_DEPENDENCIES_FROM_XML(
+ rc_depends
+ "<object[^>]*class=\"wxIcon\"[^<]+"
+ "^<object[^>]*>"
+ rc_file_contents
+ depends_path
+ )
+ endforeach()
+
+ #
+ # Parse options.
+ #
+ # If NO_CPP_CODE option specified, then produce .xrs file rather
+ # than a .cpp file (i.e., don't add the default --cpp-code option).
+ list(FIND rc_options NO_CPP_CODE index)
+ if(index EQUAL -1)
+ list(APPEND rc_options --cpp-code)
+ # wxrc's default output filename for cpp code.
+ set(outfile resource.cpp)
+ else()
+ list(REMOVE_AT rc_options ${index})
+ # wxrc's default output filename for xrs file.
+ set(outfile resource.xrs)
+ endif()
+
+ # Get output name for use in ADD_CUSTOM_COMMAND.
+ # - short option scanning
+ list(FIND rc_options -o index)
+ if(NOT index EQUAL -1)
+ math(EXPR filename_index "${index} + 1")
+ list(GET rc_options ${filename_index} outfile)
+ #list(REMOVE_AT rc_options ${index} ${filename_index})
+ endif()
+ # - long option scanning
+ string(REGEX MATCH "--output=[^;]*" outfile_opt "${rc_options}")
+ if(outfile_opt)
+ string(REPLACE "--output=" "" outfile "${outfile_opt}")
+ endif()
+ #string(REGEX REPLACE "--output=[^;]*;?" "" rc_options "${rc_options}")
+ #string(REGEX REPLACE ";$" "" rc_options "${rc_options}")
+
+ if(NOT IS_ABSOLUTE "${outfile}")
+ set(outfile "${CMAKE_CURRENT_BINARY_DIR}/${outfile}")
+ endif()
+ add_custom_command(
+ OUTPUT "${outfile}"
+ COMMAND ${wxWidgets_wxrc_EXECUTABLE} ${rc_options} ${rc_file_list_abs}
+ DEPENDS ${rc_file_list_abs} ${rc_depends}
+ )
+
+ # Add generated header to output file list.
+ list(FIND rc_options -e short_index)
+ list(FIND rc_options --extra-cpp-code long_index)
+ if(NOT short_index EQUAL -1 OR NOT long_index EQUAL -1)
+ get_filename_component(outfile_ext ${outfile} EXT)
+ string(REPLACE "${outfile_ext}" ".h" outfile_header "${outfile}")
+ list(APPEND ${_outfiles} "${outfile_header}")
+ set_source_files_properties(
+ "${outfile_header}" PROPERTIES GENERATED TRUE
+ )
+ endif()
+
+ # Add generated file to output file list.
+ list(APPEND ${_outfiles} "${outfile}")
+
+ set(${_outfiles} ${${_outfiles}} PARENT_SCOPE)
+endfunction()
diff --git a/build/cmake/config.h.in b/build/cmake/config.h.in
new file mode 100644
index 00000000..631a25f2
--- /dev/null
+++ b/build/cmake/config.h.in
@@ -0,0 +1,21 @@
+///////////////////////////////////////////////////////////////////////////////
+// Project: M - cross platform e-mail GUI client
+// File name: build/cmake/config.h.in - config.h template for CMake
+// Purpose: this file contains hand-generated options for Windows
+// Copyright: (c) 2025 Vadim Zeitlin <[email protected]>
+// Licence: M license
+///////////////////////////////////////////////////////////////////////////////
+
+#cmakedefine USE_PYTHON 1
+
+#cmakedefine USE_SSL 1
+
+/* These are always enabled in CMake builds */
+#define USE_I18N 1
+#define HAVE_COMPFACE_H 1
+#define USE_MODULES 1
+#define USE_MODULES_STATIC 1
+
+#define M_PREFIX "@CMAKE_INSTALL_PREFIX@"
+
+#define M_CANONICAL_HOST "@CMAKE_LIBRARY_ARCHITECTURE@"
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
new file mode 100644
index 00000000..4544320e
--- /dev/null
+++ b/include/CMakeLists.txt
@@ -0,0 +1,76 @@
+find_program(M4 m4 DOC "Macro processor (m4)")
+
+set(interface_outdir ${CMAKE_BINARY_DIR}/include)
+if(M4)
+ set(interface_file ${CMAKE_CURRENT_SOURCE_DIR}/MInterface.mid)
+
+ # Function used to generate custom commands for generating all files created
+ # from MInterface.h.m4 defining the API interface.
+ function(add_interface_command ext)
+ add_custom_command(
+ OUTPUT
+ ${interface_outdir}/MInterface.${ext}
+ COMMAND
+ ${M4} -DM4FILE=${CMAKE_CURRENT_SOURCE_DIR}/mid2${ext}.m4
+ ${interface_file} > ${interface_outdir}/MInterface.${ext}
+ DEPENDS
+ ${interface_file}
+ ${CMAKE_CURRENT_SOURCE_DIR}/mid2${ext}.m4
+ COMMENT
+ "Generating MInterface.${ext}"
+ )
+
+ # Also define a custom command to update the files in the source directory.
+ add_custom_command(
+ OUTPUT
+ ${CMAKE_CURRENT_SOURCE_DIR}/MInterface.${ext}.m4
+ COMMAND
+ ${CMAKE_COMMAND} -E copy
+ ${interface_outdir}/MInterface.${ext}
+ ${CMAKE_CURRENT_SOURCE_DIR}/MInterface.${ext}.m4
+ DEPENDS
+ ${interface_outdir}/MInterface.${ext}
+ COMMENT
+ "Updating source MInterface.${ext}.m4"
+ )
+ endfunction()
+
+ add_interface_command(h)
+ add_interface_command(cpp)
+ add_interface_command(idl)
+
+ add_custom_target(generate_interface_files
+ DEPENDS
+ ${interface_outdir}/MInterface.h
+ ${interface_outdir}/MInterface.cpp
+ )
+
+ add_custom_target(update_m4_output
+ DEPENDS
+ ${CMAKE_CURRENT_SOURCE_DIR}/MInterface.h.m4
+ ${CMAKE_CURRENT_SOURCE_DIR}/MInterface.cpp.m4
+ ${CMAKE_CURRENT_SOURCE_DIR}/MInterface.idl.m4
+ )
+else()
+ configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/MInterface.h.m4
+ ${interface_outdir}/MInterface.h
+ COPYONLY
+ )
+ configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/MInterface.cpp.m4
+ ${interface_outdir}/MInterface.cpp
+ COPYONLY
+ )
+ configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/MInterface.idl.m4
+ ${interface_outdir}/MInterface.idl
+ COPYONLY
+ )
+endif()
+
+# Generate config.h.
+configure_file(
+ ${CMAKE_SOURCE_DIR}/build/cmake/config.h.in
+ config.h
+)
diff --git a/lib/compface/CMakeLists.txt b/lib/compface/CMakeLists.txt
new file mode 100644
index 00000000..0e246eda
--- /dev/null
+++ b/lib/compface/CMakeLists.txt
@@ -0,0 +1,27 @@
+#################################################################################
+# CMakeLists.txt for Compface Library
+#################################################################################
+# This file builds the compface library which provides X-Face image compression
+# and decompression functionality for email headers.
+
+# Library sources
+set(COMPFACE_SOURCES
+ arith.c
+ compface.c
+ compress.c
+ file.c
+ gen.c
+ uncompface.c
+)
+
+# Create the compface library
+add_library(mahogany_compface STATIC ${COMPFACE_SOURCES})
+
+# Use common C library settings
+target_link_libraries(mahogany_compface PRIVATE mahogany_c_library_common)
+
+# Include directories
+target_include_directories(mahogany_compface
+ PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}
+)
diff --git a/lib/dspam/CMakeLists.txt b/lib/dspam/CMakeLists.txt
new file mode 100644
index 00000000..d4ebfa7d
--- /dev/null
+++ b/lib/dspam/CMakeLists.txt
@@ -0,0 +1,100 @@
+#################################################################################
+# CMakeLists.txt for DSPAM Library
+#################################################################################
+# This file builds the DSPAM spam filtering library which provides statistical
+# spam detection and filtering capabilities.
+
+# Library sources
+set(DSPAM_SOURCES
+ src/base64.c
+ src/bnr.c
+ src/buffer.c
+ src/config_shared.c
+ src/decode.c
+ src/diction.c
+ src/error.c
+ src/hash.c
+ src/hash_drv.c
+ src/heap.c
+ src/libdspam.c
+ src/list.c
+ src/nodetree.c
+ src/pref.c
+ src/read_config.c
+ src/tokenizer.c
+ src/util.c
+)
+
+# Create the DSPAM library
+add_library(mahogany_dspam STATIC ${DSPAM_SOURCES})
+
+# Use common C library settings
+target_link_libraries(mahogany_dspam PRIVATE mahogany_c_library_common)
+
+# Include directories
+target_include_directories(mahogany_dspam
+ PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}/src
+)
+
+# Handle auto-config.h generation
+if(WIN32)
+ # On Windows, copy the existing Windows config file
+ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/auto-config.h.win32")
+ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/auto-config.h.win32"
+ "${CMAKE_CURRENT_BINARY_DIR}/auto-config.h" COPYONLY)
+ else()
+ # Fallback: create basic Windows config
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/auto-config.h" "
+/* Basic Windows configuration for DSPAM library */
+#ifndef AUTO_CONFIG_H
+#define AUTO_CONFIG_H
+
+#define HAVE_CONFIG_H
+#define HAVE_STDLIB_H 1
+#define HAVE_STRING_H 1
+
+#endif /* AUTO_CONFIG_H */
+")
+ endif()
+ target_include_directories(mahogany_dspam PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
+elseif(UNIX)
+ # On Unix, generate from template if available
+ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/auto-config.h.in")
+ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/auto-config.h.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/auto-config.h" @ONLY)
+ else()
+ # Fallback: create basic Unix config
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/auto-config.h" "
+/* Basic Unix configuration for DSPAM library */
+#ifndef AUTO_CONFIG_H
+#define AUTO_CONFIG_H
+
+#define HAVE_CONFIG_H
+#define HAVE_STDLIB_H 1
+#define HAVE_STRING_H 1
+#define HAVE_UNISTD_H 1
+
+#endif /* AUTO_CONFIG_H */
+")
+ endif()
+ target_include_directories(mahogany_dspam PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
+endif()
+
+if(WIN32)
+ target_compile_definitions(mahogany_dspam PRIVATE
+ _WINDLL
+ )
+endif()
+
+# Force C compilation for this library
+set_target_properties(mahogany_dspam PROPERTIES
+ LINKER_LANGUAGE C
+)
+
+# Platform-specific linking
+if(WIN32)
+ target_link_libraries(mahogany_dspam PRIVATE ws2_32)
+elseif(UNIX)
+ target_link_libraries(mahogany_dspam PRIVATE m)
+endif()
\ No newline at end of file
diff --git a/lib/imap/CMakeLists.txt b/lib/imap/CMakeLists.txt
new file mode 100644
index 00000000..c672b445
--- /dev/null
+++ b/lib/imap/CMakeLists.txt
@@ -0,0 +1,283 @@
+#################################################################################
+# CMakeLists.txt for IMAP Library
+#################################################################################
+
+# Build IMAP library for Windows or Linux (other platforms supported by
+# c-client are not currently supported).
+
+add_library(mahogany_imap STATIC)
+
+set(DRIVERS
+ mbox
+ imap
+ nntp
+ pop3
+ mix
+ mx
+ mbx
+ tenex
+ mtx
+ mh
+ mmdf
+ unix
+ news
+ phile
+ dummy
+)
+
+set(AUTHENTICATORS
+ ext
+ md5
+ pla
+ log
+)
+
+# Library sources from c-client (core functionality)
+set(IMAP_C_CLIENT_SOURCES
+ src/c-client/flstring.c
+ src/c-client/misc.c
+ src/c-client/netmsg.c
+ src/c-client/newsrc.c
+ src/c-client/rfc822.c
+ src/c-client/utf8.c
+ src/c-client/utf8aux.c
+ src/c-client/mail.c
+ src/c-client/smanager.c
+ src/c-client/smtp.c
+)
+
+# Platform-specific OS sources and generated files.
+if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ set(IMAP_OS "unix")
+
+ set(IMAP_OSDEP_SOURCES
+ ${CMAKE_CURRENT_BINARY_DIR}/osdep.h
+ ${CMAKE_CURRENT_BINARY_DIR}/osdep.c
+ src/osdep/unix/fdstring.c
+ src/osdep/unix/pseudo.c
+ src/osdep/unix/sig_psx.c
+ )
+
+ file(CREATE_LINK
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/osdep/unix/os_slx.h
+ ${CMAKE_CURRENT_BINARY_DIR}/osdep.h
+ SYMBOLIC
+ )
+
+ set(OSDEP_C_CONTENTS "/* Generated osdep.c for ${CMAKE_SYSTEM_NAME} builds */\n")
+ string(APPEND OSDEP_C_CONTENTS "#include \"os_slx.c\"\n")
+ string(APPEND OSDEP_C_CONTENTS "#include \"log_std.c\"\n")
+ string(APPEND OSDEP_C_CONTENTS "#include \"ckp_psx.c\"\n")
+ if(USE_SSL)
+ string(APPEND OSDEP_C_CONTENTS "#include \"ssl_unix.c\"\n")
+
+ # Linking with OpenSSL::SSL is not enough because c-client code includes
+ # OpenSSL headers without "openssl/" prefix, so we need to explicitly add
+ # this directory to the include path to make it compile.
+ set_property(
+ SOURCE
+ ${CMAKE_CURRENT_BINARY_DIR}/osdep.c
+ APPEND PROPERTY
+ COMPILE_DEFINITIONS
+ SSL_CERT_DIRECTORY="/etc/ssl/certs"
+ SSL_KEY_DIRECTORY="/etc/ssl/private"
+ )
+ set_property(
+ SOURCE
+ ${CMAKE_CURRENT_BINARY_DIR}/osdep.c
+ APPEND PROPERTY
+ INCLUDE_DIRECTORIES
+ ${OPENSSL_INCLUDE_DIR}/openssl
+ )
+ else()
+ string(APPEND OSDEP_C_CONTENTS "#include \"ssl_none.c\"\n")
+ endif()
+
+ file(GENERATE
+ OUTPUT
+ ${CMAKE_CURRENT_BINARY_DIR}/osdep.c
+ CONTENT
+ ${OSDEP_C_CONTENTS}
+ )
+
+ file(CREATE_LINK
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/osdep/unix/crx_nfs.c
+ ${CMAKE_CURRENT_BINARY_DIR}/crexcl.c
+ SYMBOLIC
+ )
+
+ file(CREATE_LINK
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/osdep/unix/ip4_unix.c
+ ${CMAKE_CURRENT_BINARY_DIR}/ip_unix.c
+ SYMBOLIC
+ )
+
+ foreach(driver IN LISTS DRIVERS)
+ # Most drivers live in files with the same name under c-client directory,
+ # but there are a couple of exceptions.
+ if(driver STREQUAL "imap")
+ set(driver_file "c-client/imap4r1.c")
+ elseif(driver STREQUAL "mbox")
+ set(driver_file "osdep/unix/unix.c")
+ else()
+ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/c-client/${driver}.c")
+ set(driver_file "c-client/${driver}.c")
+ else()
+ set(driver_file "osdep/unix/${driver}.c")
+ endif()
+ endif()
+
+ list(APPEND IMAP_C_CLIENT_SOURCES src/${driver_file})
+ endforeach()
+
+ # All drivers are enabled on Unix.
+ set(ENABLED_DRIVERS ${DRIVERS})
+
+ # Additional Unix-specific definitions.
+ target_compile_definitions(mahogany_imap PRIVATE
+ ACTIVEFILE="/var/lib/news/active"
+ ANONYMOUSHOME="/var/spool/mail/anonymous"
+ CREATEPROTO=unixproto
+ EMPTYPROTO=unixproto
+ LOCKPGM=""
+ LOCKPGM1="/usr/libexec/mlock"
+ LOCKPGM2="/usr/sbin/mlock"
+ LOCKPGM3="/etc/mlock"
+ MAILSPOOL="/var/spool/mail"
+ MD5ENABLE="/etc/cram-md5.pwd"
+ NEWSSPOOL="/var/spool/news"
+ RSHPATH="/usr/bin/rsh"
+ SPOOLDIR="/var/spool"
+ )
+
+ # Disable some warnings specific to c-client code, there are just too many of
+ # them to fix (but ideally they should be fixed, of course).
+ target_compile_options(mahogany_imap PRIVATE
+ -Wno-deprecated-declarations
+ -Wno-format
+ -Wno-format-overflow
+ -Wno-unused-result
+ )
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
+ set(IMAP_OS "nt")
+
+ set(IMAP_OSDEP_SOURCES
+ src/osdep/nt/fdstring.c
+ src/osdep/nt/os_nt.c
+ src/osdep/nt/pseudo.c
+ )
+
+ file(CREATE_LINK
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/osdep/nt/os_nt.h
+ ${CMAKE_CURRENT_BINARY_DIR}/osdep.h
+ SYMBOLIC
+ )
+
+ file(CREATE_LINK
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/osdep/nt/ip4_nt.c
+ ${CMAKE_CURRENT_BINARY_DIR}/ip_nt.c
+ SYMBOLIC
+ )
+
+ foreach(driver IN LISTS DRIVERS)
+ if(driver STREQUAL "imap")
+ set(driver_file "c-client/imap4r1.c")
+ else()
+ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/c-client/${driver}.c")
+ set(driver_file "c-client/${driver}.c")
+ elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/osdep/nt/${driver}nt.c")
+ set(driver_file "osdep/nt/${driver}nt.c")
+ else()
+ # Some drivers are not available on Windows. Skip them.
+ continue()
+ endif()
+ endif()
+
+ list(APPEND ENABLED_DRIVERS ${driver})
+ list(APPEND IMAP_C_CLIENT_SOURCES src/${driver_file})
+ endforeach()
+
+ if(MSVC)
+ target_compile_options(mahogany_imap PRIVATE
+ /wd4311 # pointer truncation from 'type1' to 'type2'
+ /wd4312 # conversion from 'type1' to 'type2' of greater size
+ )
+ endif()
+else()
+ # See src/osdep/unix/Makefile for how to do it.
+ message(FATAL_ERROR "Please add support for ${CMAKE_SYSTEM_NAME}.")
+endif()
+
+set(LINKAGE_H_CONTENTS "/* Generated linkage.h for ${CMAKE_SYSTEM_NAME} builds */\n")
+set(LINKAGE_C_CONTENTS "/* Generated linkage.c for ${CMAKE_SYSTEM_NAME} builds */\n")
+
+foreach(driver IN LISTS ENABLED_DRIVERS)
+ string(APPEND LINKAGE_H_CONTENTS
+ "extern DRIVER ${driver}driver\;\n"
+ )
+ string(APPEND LINKAGE_C_CONTENTS
+ " mail_link (&${driver}driver)\;\t\t/* link in the ${driver} driver */\n"
+ )
+endforeach()
+
+set(AUTHS_C_CONTENTS "/* Generated auths.c for ${CMAKE_SYSTEM_NAME} builds */\n")
+foreach(authenticator IN LISTS AUTHENTICATORS)
+ string(APPEND AUTHS_C_CONTENTS
+ "#include \"auth_${authenticator}.c\"\n"
+ )
+
+ string(APPEND LINKAGE_H_CONTENTS
+ "extern AUTHENTICATOR auth_${authenticator}\;\n"
+ )
+ string(APPEND LINKAGE_C_CONTENTS
+ " auth_link (&auth_${authenticator})\;\t\t/* link in the ${authenticator} authenticator */\n"
+ )
+endforeach()
+
+file(GENERATE
+ OUTPUT
+ "${CMAKE_CURRENT_BINARY_DIR}/linkage.h"
+ CONTENT
+ ${LINKAGE_H_CONTENTS}
+)
+file(GENERATE
+ OUTPUT
+ "${CMAKE_CURRENT_BINARY_DIR}/linkage.c"
+ CONTENT
+ ${LINKAGE_C_CONTENTS}
+)
+file(GENERATE
+ OUTPUT
+ "${CMAKE_CURRENT_BINARY_DIR}/auths.c"
+ CONTENT
+ ${AUTHS_C_CONTENTS}
+)
+
+target_sources(mahogany_imap PRIVATE
+ ${IMAP_C_CLIENT_SOURCES}
+ ${IMAP_OSDEP_SOURCES}
+)
+
+# Use common C library settings
+target_link_libraries(mahogany_imap PRIVATE mahogany_c_library_common)
+
+# Include directories
+target_include_directories(mahogany_imap
+ PUBLIC
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/osdep/${IMAP_OS}
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/c-client
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/charset
+)
+
+# Library-specific preprocessor definitions
+target_compile_definitions(mahogany_imap PRIVATE
+ CHUNKSIZE=65536
+)
+
+# Platform-specific linking
+if(WIN32)
+ target_link_libraries(mahogany_imap INTERFACE ws2_32)
+elseif(USE_SSL)
+ target_link_libraries(mahogany_imap INTERFACE OpenSSL::SSL OpenSSL::Crypto crypt)
+endif()
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 00000000..d033f88f
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,457 @@
+# CMakeLists.txt for Mahogany application itself
+
+# Create the main executable
+add_executable(mahogany)
+
+# Add sources used under all platforms
+target_sources(mahogany PRIVATE
+ # Classes
+ classes/CacheFile.cpp
+ classes/ComposeTemplate.cpp
+ classes/ConfigSource.cpp
+ classes/ConfigSourcesAll.cpp
+ classes/FolderMonitor.cpp
+ classes/FolderView.cpp
+ classes/ListReceiver.cpp
+ classes/MApplication.cpp
+ classes/MEvent.cpp
+ classes/MFilter.cpp
+ classes/MFolder.cpp
+ classes/MModule.cpp
+ classes/MObject.cpp
+ classes/MessageTemplate.cpp
+ classes/MessageView.cpp
+ classes/Moptions.cpp
+ classes/Mpers.cpp
+ classes/NewMailNotifier.cpp
+ classes/PGPClickInfo.cpp
+ classes/PathFinder.cpp
+ classes/Profile.cpp
+ classes/QuotedText.cpp
+ classes/Sequence.cpp
+ classes/XFace.cpp
+ classes/kbList.cpp
+
+ # GUI components
+ gui/AddressExpander.cpp
+ gui/ClickAtt.cpp
+ gui/ClickURL.cpp
+ gui/ConfigSourceChoice.cpp
+ gui/CreateFolderWizard.cpp
+ gui/ImportFoldersWizard.cpp
+ gui/MImport.cpp
+ gui/Mdnd.cpp
+ gui/wxAttachDialog.cpp
+ gui/wxBrowseButton.cpp
+ gui/wxColumnsDlg.cpp
+ gui/wxComposeView.cpp
+ gui/wxDialogLayout.cpp
+ gui/wxFiltersDialog.cpp
+ gui/wxFolderMenu.cpp
+ gui/wxFolderTree.cpp
+ gui/wxFolderView.cpp
+ gui/wxHeadersDialogs.cpp
+ gui/wxIconManager.cpp
+ gui/wxMApp.cpp
+ gui/wxMDialogs.cpp
+ gui/wxMFolderDialogs.cpp
+ gui/wxMFrame.cpp
+ gui/wxMGuiUtils.cpp
+ gui/wxMIMETreeDialog.cpp
+ gui/wxMLog.cpp
+ gui/wxMSplash.cpp
+ gui/wxMainFrame.cpp
+ gui/wxMenuDefs.cpp
+ gui/wxMessageView.cpp
+ gui/wxMimeDialog.cpp
+ gui/wxModulesDlg.cpp
+ gui/wxMsgCmdProc.cpp
+ gui/wxOptionsDlg.cpp
+ gui/wxRenameDialog.cpp
+ gui/wxSearchDialog.cpp
+ gui/wxSortDialog.cpp
+ gui/wxSubfoldersDialog.cpp
+ gui/wxTemplateDialog.cpp
+ gui/wxTextDialog.cpp
+ gui/wxThrDialog.cpp
+ gui/wxllist.cpp
+ gui/wxlparser.cpp
+ gui/wxlwindow.cpp
+
+ # Mail handling
+ mail/ASMailFolder.cpp
+ mail/Address.cpp
+ mail/AddressCC.cpp
+ mail/FolderType.cpp
+ mail/HeaderInfoImpl.cpp
+ mail/HeaderIterator.cpp
+ mail/LogCircle.cpp
+ mail/MFCache.cpp
+ mail/MFDriver.cpp
+ mail/MFPool.cpp
+ mail/MFui.cpp
+ mail/MailFolder.cpp
+ mail/MailFolderCC.cpp
+ mail/MailFolderCmn.cpp
+ mail/MailMH.cpp
+ mail/Message.cpp
+ mail/MessageCC.cpp
+ mail/MimeDecode.cpp
+ mail/MimePartCC.cpp
+ mail/MimePartCCBase.cpp
+ mail/MimePartVirtual.cpp
+ mail/MimeType.cpp
+ mail/Pop3.cpp
+ mail/SendMessageCC.cpp
+ mail/Sorting.cpp
+ mail/SpamFilter.cpp
+ mail/ThreadJWZ.cpp
+ mail/Threading.cpp
+ mail/VFolder.cpp
+ mail/VMessage.cpp
+
+ # Address book
+ adb/AdbDialogs.cpp
+ adb/AdbEntry.cpp
+ adb/AdbExport.cpp
+ adb/AdbFrame.cpp
+ adb/AdbImport.cpp
+ adb/AdbManager.cpp
+ adb/AdbModule.cpp
+ adb/AdbProvider.cpp
+ adb/Collect.cpp
+ adb/ExportText.cpp
+ adb/ExportVCard.cpp
+ adb/ImportEudora.cpp
+ adb/ImportPine.cpp
+ adb/ImportText.cpp
+ adb/ImportVCard.cpp
+ adb/ImportXFMail.cpp
+ adb/ProvDummy.cpp
+ adb/ProvFC.cpp
+
+ # Modules
+ modules/BareBonesEditor.cpp
+ modules/Filters.cpp
+ modules/HtmlViewer.cpp
+ modules/LayoutEditor.cpp
+ modules/LayoutViewer.cpp
+ modules/Migrate.cpp
+ modules/NetscapeImporter.cpp
+ modules/PineImport.cpp
+ modules/TextViewer.cpp
+ modules/crypt/PGPEngine.cpp
+ modules/spam/HeadersFilter.cpp
+ modules/spam/ServerSideFilter.cpp
+ modules/viewflt/PGP.cpp
+ modules/viewflt/QuoteURL.cpp
+ modules/viewflt/Rot13.cpp
+ modules/viewflt/Signature.cpp
+ modules/viewflt/TextMarkup.cpp
+ modules/viewflt/Trailer.cpp
+ modules/viewflt/UUDecode.cpp
+
+ # Utilities
+ util/ColourNames.cpp
+ util/matchurl.cpp
+ util/ssl.cpp
+ util/strutil.cpp
+ util/sysutil.cpp
+ util/twofish2.c
+ util/upgrade.cpp
+
+ # wxWidgets extensions
+ wx/common/vcard.cpp
+ wx/generic/persctrl.cpp
+ wx/generic/vcarddlg.cpp
+)
+
+# Some files are only compiled under Unix because they're useless under
+# Windows (and wouldn't compile there).
+if(UNIX)
+ target_sources(mahogany PRIVATE
+ adb/ImportMailrc.cpp
+ adb/ProvBbdb.cpp
+ adb/ProvLine.cpp
+ adb/ProvPalm.cpp
+ adb/ProvPasswd.cpp
+
+ modules/XFMailImport.cpp
+ )
+endif()
+
+if(WIN32)
+ target_sources(mahogany PRIVATE ${CMAKE_SOURCE_DIR}/res/M.rc)
+endif()
+
+# Generated MInterface.* must be built before MModule.cpp can be compiled.
+set_source_files_properties(
+ classes/MModule.cpp
+ PROPERTIES
+ OBJECT_DEPENDS
+ generate_interface_files
+)
+
+# Add Python sources if enabled
+if(USE_PYTHON)
+ # Python interface files.
+ set(PYTHON_INTERFACES
+ HeaderInfo
+ MDialogs
+ MailFolder
+ Message
+ MimePart
+ MimeType
+ SendMessage
+ )
+
+ set(PYTHON_SOURCES
+ Python/InitPython.cpp
+ Python/PythonHelp.cpp
+ )
+
+ # Directly containing SWIG-generated Python files.
+ set(swig_python_outdir ${CMAKE_BINARY_DIR}/src/Python)
+
+ if(SWIG_FOUND)
+ add_custom_command(
+ OUTPUT
+ ${swig_python_outdir}/Mswigpyrun.h
+ COMMAND
+ ${SWIG_EXECUTABLE} -python -external-runtime
+ ${swig_python_outdir}/Mswigpyrun.h
+ )
+
+ foreach(interface IN LISTS PYTHON_INTERFACES)
+ set(source "${CMAKE_SOURCE_DIR}/include/interface/${interface}.i")
+ list(APPEND PYTHON_SWIG_SOURCES ${source})
+
+ set_source_files_properties(${source} PROPERTIES
+ CPLUSPLUS TRUE
+ )
+ endforeach()
+
+ set(SWIG_USE_SWIG_DEPENDENCIES TRUE)
+ swig_add_library(mahogany_python
+ TYPE
+ STATIC
+ LANGUAGE
+ python
+ SOURCES
+ ${PYTHON_SWIG_SOURCES}
+ OUTPUT_DIR
+ ${swig_python_outdir}
+ )
+
+ set_target_properties(mahogany_python PROPERTIES
+ SWIG_INCLUDE_DIRECTORIES
+ "${CMAKE_SOURCE_DIR}/include;${CMAKE_SOURCE_DIR}/include/interface"
+ SWIG_GENERATED_COMPILE_OPTIONS
+ -w
+ )
+
+ # Create custom target copying back SWIG-generated files to source tree.
+ set(swig_generated_files)
+
+ # Define custom commands for updating files for all interfaces.
+ foreach(interface IN LISTS PYTHON_INTERFACES)
+ add_custom_command(
+ OUTPUT
+ ${CMAKE_CURRENT_SOURCE_DIR}/Python/${interface}.cpp-swig
+ ${CMAKE_CURRENT_SOURCE_DIR}/Python/${interface}.py-swig
+ COMMAND
+ ${CMAKE_COMMAND} -E copy_if_different
+ ${swig_python_outdir}/${interface}_wrap.cxx
+ ${CMAKE_CURRENT_SOURCE_DIR}/Python/${interface}.cpp-swig
+ COMMAND
+ ${CMAKE_COMMAND} -E copy_if_different
+ ${swig_python_outdir}/${interface}.py
+ ${CMAKE_CURRENT_SOURCE_DIR}/Python/${interface}.py-swig
+ )
+
+ list(APPEND swig_generated_files
+ ${CMAKE_CURRENT_SOURCE_DIR}/Python/${interface}.cpp-swig
+ ${CMAKE_CURRENT_SOURCE_DIR}/Python/${interface}.py-swig
+ )
+ endforeach()
+
+ # And also a separate one for updating Mswigpyrun.h in source directory.
+ add_custom_command(
+ OUTPUT
+ ${CMAKE_CURRENT_SOURCE_DIR}/Python/Mswigpyrun.h-swig
+ COMMAND
+ ${CMAKE_COMMAND} -E copy_if_different
+ ${swig_python_outdir}/Mswigpyrun.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/Python/Mswigpyrun.h-swig
+ )
+
+ list(APPEND swig_generated_files Python/Mswigpyrun.h-swig)
+
+ add_custom_target(update_swig_output DEPENDS ${swig_generated_files})
+ else()
+ add_library(mahogany_python STATIC)
+
+ # Use pre-generated SWIG files from the repository.
+ foreach(interface IN LISTS PYTHON_INTERFACES)
+ add_custom_command(
+ OUTPUT
+ ${swig_python_outdir}/${interface}_wrap.cxx
+ ${swig_python_outdir}/${interface}.py
+ COMMAND
+ ${CMAKE_COMMAND} -E copy_if_different
+ ${CMAKE_CURRENT_SOURCE_DIR}/Python/${interface}.cpp-swig
+ ${swig_python_outdir}/${interface}_wrap.cxx
+ COMMAND
+ ${CMAKE_COMMAND} -E copy_if_different
+ ${CMAKE_CURRENT_SOURCE_DIR}/Python/${interface}.py-swig
+ ${swig_python_outdir}/${interface}.py
+ )
+
+ target_sources(mahogany_python
+ PRIVATE
+ ${swig_python_outdir}/${interface}_wrap.cxx
+ )
+ endforeach()
+
+ add_custom_command(
+ OUTPUT
+ ${swig_python_outdir}/Mswigpyrun.h
+ COMMAND
+ ${CMAKE_COMMAND} -E copy_if_different
+ ${CMAKE_CURRENT_SOURCE_DIR}/Python/Mswigpyrun.h-swig
+ ${swig_python_outdir}/Mswigpyrun.h
+ )
+ endif()
+
+ # Adding it to the sources ensures that it is generated before compiling
+ # the files that use it.
+ target_sources(mahogany_python
+ PRIVATE
+ ${swig_python_outdir}/Mswigpyrun.h
+ )
+
+ target_sources(mahogany_python
+ PRIVATE
+ ${PYTHON_SOURCES}
+ )
+
+ target_include_directories(mahogany_python
+ PRIVATE
+ ${CMAKE_BINARY_DIR}/include
+ ${CMAKE_SOURCE_DIR}/include
+ ${swig_python_outdir}
+ ${Python3_INCLUDE_DIRS}
+ )
+
+ target_link_libraries(mahogany_python
+ PRIVATE
+ Python3::Python
+ ${wxWidgets_LIBRARIES}
+ )
+
+ target_link_libraries(mahogany PRIVATE mahogany_python)
+endif()
+
+if(USE_DSPAM)
+ target_sources(mahogany PRIVATE modules/spam/DspamFilter.cpp)
+endif()
+
+# Set executable properties
+set_target_properties(mahogany PROPERTIES
+ OUTPUT_NAME
+ M
+ WIN32_EXECUTABLE
+ TRUE
+)
+
+# Include directories
+target_include_directories(mahogany
+ PRIVATE
+ ${CMAKE_BINARY_DIR}/include
+ ${CMAKE_SOURCE_DIR}/include
+)
+
+# Compiler/platform-specific compilation options
+if(WIN32)
+ target_compile_definitions(mahogany PRIVATE
+ WIN32
+ _WINDOWS
+ _UNICODE
+ UNICODE
+ )
+endif()
+
+if(MSVC)
+ target_compile_definitions(mahogany PRIVATE
+ wxNO_AUI_LIB
+ wxNO_GL_LIB
+ wxNO_MEDIA_LIB
+ wxNO_RIBBON_LIB
+ wxNO_RICHTEXT_LIB
+ wxNO_STC_LIB
+ wxNO_WEBVIEW_LIB
+ wxNO_XRC_LIB
+ USE_PCH
+ )
+
+ target_compile_options(mahogany PRIVATE
+ /Zm110 # Increase compiler memory limit
+ /W4 # Maximum warning level
+ /wd4100 # Disable unused parameter warnings
+ /wd4244 # Disable conversion warnings
+ /wd4267 # Disable size_t conversion warnings
+ )
+ # Use precompiled headers
+ target_precompile_headers(mahogany PRIVATE
+ $<$<COMPILE_LANGUAGE:CXX>:${CMAKE_SOURCE_DIR}/include/Mpch.h>
+ )
+
+ # Except for some files that don't include Mpch.h
+ set_source_files_properties(
+ wx/common/vcard.cpp
+ wx/generic/persctrl.cpp
+ wx/generic/vcarddlg.cpp
+ PROPERTIES
+ SKIP_PRECOMPILE_HEADERS ON
+ )
+elseif(IS_GCC_LIKE)
+ target_compile_options(mahogany PRIVATE
+ -Wall
+ -Wextra
+ -Wno-unused-parameter
+ -Wno-missing-field-initializers
+ -Wno-implicit-fallthrough # TODO: fix fall-through warnings and remove this
+ $<$<COMPILE_LANGUAGE:CXX>:-fno-operator-names>
+ )
+endif()
+
+
+# Platform-specific libraries
+if(WIN32)
+ set(PLATFORM_LIBS winmm comctl32 rpcrt4 ws2_32)
+elseif(UNIX AND NOT APPLE)
+ set(PLATFORM_LIBS dl pthread)
+endif()
+
+# Link libraries
+target_link_libraries(mahogany PRIVATE
+ mahogany_imap
+ mahogany_compface
+ mahogany_versit
+ ${wxWidgets_LIBRARIES}
+ ${PLATFORM_LIBS}
+)
+
+# Python support
+if(USE_PYTHON)
+ target_link_libraries(mahogany PRIVATE Python3::Python)
+endif()
+
+# SSL support via OpenSSL?
+if(USE_OPENSSL)
+ target_link_libraries(mahogany PRIVATE OpenSSL::SSL OpenSSL::Crypto)
+endif()
+
+if(USE_DSPAM)
+ target_link_libraries(mahogany PRIVATE dspam)
+endif()
diff --git a/src/wx/vcard/CMakeLists.txt b/src/wx/vcard/CMakeLists.txt
new file mode 100644
index 00000000..36c5ef74
--- /dev/null
+++ b/src/wx/vcard/CMakeLists.txt
@@ -0,0 +1,55 @@
+#################################################################################
+# CMakeLists.txt for Versit Library
+#################################################################################
+# This file builds the versit library which provides vCard and vCalendar support
+# for contact and calendar data handling.
+
+# Library sources
+set(VERSIT_SOURCES
+ vobject.c
+)
+
+# Check if we have vcc.c or need to use pre-compiled version
+if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/vcc.c")
+ list(APPEND VERSIT_SOURCES vcc.c)
+elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/vcc.c-yacc")
+ # Copy pre-compiled yacc file
+ configure_file(
+ "${CMAKE_CURRENT_SOURCE_DIR}/vcc.c-yacc"
+ "${CMAKE_CURRENT_BINARY_DIR}/vcc.c"
+ COPYONLY
+ )
+ list(APPEND VERSIT_SOURCES "${CMAKE_CURRENT_BINARY_DIR}/vcc.c")
+else()
+ # Try to generate from yacc if available
+ find_program(YACC_EXECUTABLE NAMES yacc bison)
+ if(YACC_EXECUTABLE AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/vcc.y")
+ add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/vcc.c"
+ COMMAND ${YACC_EXECUTABLE} -d "${CMAKE_CURRENT_SOURCE_DIR}/vcc.y"
+ COMMAND ${CMAKE_COMMAND} -E copy y.tab.c "${CMAKE_CURRENT_BINARY_DIR}/vcc.c"
+ DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/vcc.y"
+ COMMENT "Generating vcc.c from vcc.y"
+ )
+ list(APPEND VERSIT_SOURCES "${CMAKE_CURRENT_BINARY_DIR}/vcc.c")
+ else()
+ message(FATAL_ERROR "Cannot find vcc.c source file. Please ensure vcc.c, vcc.c-yacc, or yacc/bison is available.")
+ endif()
+endif()
+
+# Create the versit library
+add_library(mahogany_versit STATIC ${VERSIT_SOURCES})
+
+# Use common C library settings
+target_link_libraries(mahogany_versit PRIVATE mahogany_c_library_common)
+
+# Include directories
+target_include_directories(mahogany_versit
+ PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+# Force C compilation for this library
+set_target_properties(mahogany_versit PROPERTIES
+ LINKER_LANGUAGE C
+)
\ No newline at end of file
commit fc072ff1aa4014b89c5d4a1c9749ead9b6228c84
Author: Vadim Zeitlin <[email protected]>
Date: Tue Jan 6 23:50:50 2026 +0100
Define USE_PCH only for main Mahogany project itself
Don't define it unconditionally in Mconfig.h when using MSVC because we
don't necessarily want to use the PCH for the other projects, such as
Python wrappers.
diff --git a/M.vcxproj b/M.vcxproj
index 97b40b62..d8a1e9a3 100644
--- a/M.vcxproj
+++ b/M.vcxproj
@@ -146,7 +146,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WholeProgramOptimization>true</WholeProgramOptimization>
- <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>USE_PCH;WIN32;NDEBUG;_WINDOWS;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>Mpch.h</PrecompiledHeaderFile>
@@ -176,7 +176,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'">
<ClCompile>
<WholeProgramOptimization>true</WholeProgramOptimization>
- <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_UNICODE;WXUSINGDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>USE_PCH;WIN32;NDEBUG;_WINDOWS;_UNICODE;WXUSINGDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>Mpch.h</PrecompiledHeaderFile>
@@ -208,7 +208,7 @@
<TargetEnvironment>X64</TargetEnvironment>
</Midl>
<ClCompile>
- <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>USE_PCH;WIN32;NDEBUG;_WINDOWS;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>Mpch.h</PrecompiledHeaderFile>
@@ -239,7 +239,7 @@
<TargetEnvironment>X64</TargetEnvironment>
</Midl>
<ClCompile>
- <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>USE_PCH;WIN32;NDEBUG;_WINDOWS;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>Mpch.h</PrecompiledHeaderFile>
@@ -269,7 +269,7 @@
<ClCompile>
<AdditionalOptions>/Zm110 %(AdditionalOptions)</AdditionalOptions>
<Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>USE_PCH;WIN32;_DEBUG;_WINDOWS;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader>Use</PrecompiledHeader>
@@ -297,7 +297,7 @@
<ClCompile>
<AdditionalOptions>/Zm110 %(AdditionalOptions)</AdditionalOptions>
<Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_UNICODE;WXUSINGDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>USE_PCH;WIN32;_DEBUG;_WINDOWS;_UNICODE;WXUSINGDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader>Use</PrecompiledHeader>
@@ -327,7 +327,7 @@
</Midl>
<ClCompile>
<Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>USE_PCH;WIN32;_DEBUG;_WINDOWS;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader>Use</PrecompiledHeader>
@@ -357,7 +357,7 @@
</Midl>
<ClCompile>
<Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>USE_PCH;WIN32;_DEBUG;_WINDOWS;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader>Use</PrecompiledHeader>
diff --git a/include/Mconfig.h b/include/Mconfig.h
index 041b9c82..b848b322 100644
--- a/include/Mconfig.h
+++ b/include/Mconfig.h
@@ -113,11 +113,6 @@
#ifdef _MSC_VER
# define CC_MSC 1
# define CC_TYPE "Visual C++"
-
- // no reason not to use precompiled headers with VC++
-# ifndef USE_PCH
-# define USE_PCH
-# endif
#endif
// MSVC defines _DEBUG in debug builds, set DEBUG accordingly
commit 627216794c02505b81df124b67d04812c5aeb19a
Author: Vadim Zeitlin <[email protected]>
Date: Mon Jan 5 00:52:39 2026 +0100
Fix another problem in PCH-less build under Linux
Include header declaring wxPaintDC.
diff --git a/src/modules/TextViewer.cpp b/src/modules/TextViewer.cpp
index 9e7d0291..f82bbfd2 100644
--- a/src/modules/TextViewer.cpp
+++ b/src/modules/TextViewer.cpp
@@ -25,6 +25,7 @@
# include "guidef.h" // for GetFrame
# include "gui/wxMApp.h" // for wxMApp
+# include <wx/dcclient.h>
# include <wx/textctrl.h>
#endif // USE_PCH
-----------------------------------------------------------------------
Summary of changes:
.github/workflows/ci.yml | 52 +-
CMakeLists.txt | 238 +++++++
M.vcxproj | 16 +-
build.bat | 82 +++
build.sh | 65 ++
build/cmake/FindwxWidgets.cmake | 1410 +++++++++++++++++++++++++++++++++++++++
build/cmake/config.h.in | 21 +
include/CMakeLists.txt | 76 +++
include/Mconfig.h | 5 -
lib/compface/CMakeLists.txt | 27 +
lib/dspam/CMakeLists.txt | 100 +++
lib/imap/CMakeLists.txt | 283 ++++++++
src/CMakeLists.txt | 457 +++++++++++++
src/modules/TextViewer.cpp | 1 +
src/wx/vcard/CMakeLists.txt | 55 ++
15 files changed, 2872 insertions(+), 16 deletions(-)
create mode 100644 CMakeLists.txt
create mode 100644 build.bat
create mode 100755 build.sh
create mode 100644 build/cmake/FindwxWidgets.cmake
create mode 100644 build/cmake/config.h.in
create mode 100644 include/CMakeLists.txt
create mode 100644 lib/compface/CMakeLists.txt
create mode 100644 lib/dspam/CMakeLists.txt
create mode 100644 lib/imap/CMakeLists.txt
create mode 100644 src/CMakeLists.txt
create mode 100644 src/wx/vcard/CMakeLists.txt
hooks/post-receive
--
Mahogany sources repository.