From cf9a88dfc325365acde30d505bd65636f090cad5 Mon Sep 17 00:00:00 2001 From: Rafael Kitover Date: Tue, 10 Dec 2019 11:13:58 +0000 Subject: [PATCH] cmake: Visual Studio support improvements. Add support for vcpkg ffmpeg, this requires using someone's FindFFmpeg.cmake instead of relying on pkg-config, since vcpkg does not have pkg-config. Do not use the ffmpeg from vcpkg on appveyor however, because that pushes the build cache generation over the time limit for jobs. Add secur32 and bcrypt to the list of ffmpeg libs on windows, these are standard windows libraries. Change some code in ffmpeg.cpp to remove C-style casts of struct initializers, which are illegal in MSVC. Add the INT64_C and UINT64_C macros missing in MSVC's stdint.h (if not defined) to ffmpeg.h before the ffmpeg headers are included, because they rely on them. Rewrite the wxWidgets finding code for the vcpkg wxWidgets to be nicer and work correctly for debug and static builds. Remove all /W* and /w* warnings options from cmake compiler flags, and replace them with /W4 for debug builds, and /w (no warnings) for release modes. When building a static binary, remove all /MD* flags from cmake compiler flags, and use /MT for static release builds and /MTd for static debug builds. Improve the vcpkg toolchain wrapper to only rebuild the vcpkg binary if there were git updates. Redo the handling of SDL2 and SDL_main. Only link SDL2Main to the SDL binary and don't use the definitions. Update CMakeSettings.json to use Ninja and include static configurations. Use CMAKE_PROJECT_DIR instead of CMAKE_SOURCE_DIR to determine the vcpkg root, as CMAKE_SOURCE_DIR is sometimes set incorrectly in the 2017 GUI. Add /nodefaultlib:libcmt to the debug build link flags, as in debug builds libcmtd is used and libcmt should not be. Add /subsystem:console to debug build link flags to produce a windows console app for debug builds, like we do for mingw builds. To do this, define a WIN32_CONSOLE_APP macro and if set, define a main() that calls WinMain(). Call wxMesdsageOutput::Set() in OnInit with an instance of wxMessageOutputStderr for windows debug builds to make sure the --help text etc. goes to the console instead of a popup box. Update the Visual Studio related text in README.md. Fix dynamic debug builds by linking to the debug version of SDL2 and copying the debug version of the dll to the build dir. Fix issue in MainFrame::BindAppIcon with the function we are using not being found in a Windows DLL in debug builds by using wxDynamicLibrary::GetSymboolAorW() instead of GetSymbol(). Enable LTO for MSVC in Release modes, if the option is set. Change appveyor config to use an 8 item build matrix of x64/x86 / Release/Debug / Static/Dynamic. And test the binary in debug modes by running --help. When copying the wxrc.exe out of the build tree, copy both the release and debug versions, this is so that appveyor caching of vcpkg works, since the build trees are not cached. Add some necessary win32 libraries to the SDL binary. And enable building it on appveyor. Fix #465. Signed-off-by: Rafael Kitover --- .appveyor.yml | 21 ++++- CMakeLists.txt | 136 +++++++++++++++++----------- CMakeSettings.json | 134 ++++++++++++++++++---------- README.md | 20 +++-- cmake/FindFFmpeg.cmake | 152 ++++++++++++++++++++++++++++++++ cmake/FindSDL2.cmake | 56 ++++++------ cmake/Set-Toolchain-vcpkg.cmake | 75 +++++++++++----- src/common/ffmpeg.cpp | 10 +-- src/common/ffmpeg.h | 12 +++ src/wx/CMakeLists.txt | 110 +++++++++++++++++++---- src/wx/guiinit.cpp | 2 +- src/wx/wxvbam.cpp | 24 ++++- 12 files changed, 563 insertions(+), 189 deletions(-) create mode 100644 cmake/FindFFmpeg.cmake diff --git a/.appveyor.yml b/.appveyor.yml index 3ae51d15..889d0619 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -7,14 +7,17 @@ build: verbosity: detailed configuration: + - Debug - Release platform: - x64 + - x86 environment: matrix: - - arch: Win64 + - STATIC: " " + - STATIC: "-static" matrix: fast_finish: true @@ -27,13 +30,23 @@ install: - ninja --version before_build: - - call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 + - call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" %PLATFORM% build_script: - mkdir build - cd build - - cmake .. -DVCPKG_TARGET_TRIPLET=x64-windows -DCMAKE_BUILD_TYPE=Release -G Ninja + - cmake .. -DVCPKG_TARGET_TRIPLET=%PLATFORM%-windows%STATIC% -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DENABLE_SDL=TRUE -G Ninja - ninja +# only debug builds are console mode apps, in them test --help +for: +- + matrix: + except: + - configuration: Release + + test_script: + - .\visualboyadvance-m.exe --help + cache: - - c:\projects\vcpkg\installed + - c:\vcpkg\installed diff --git a/CMakeLists.txt b/CMakeLists.txt index 6f49cdd5..dc5af739 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,8 +15,19 @@ set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) set(VCPKG_DEPS zlib libpng SDL2 SFML gettext wxWidgets) +if(NOT DEFINED ENV{APPVEYOR}) + # job goes over time limit if building ffmpeg + list(APPEND VCPKG_DEPS ffmpeg) +endif() + include(Set-Toolchain-vcpkg) +set(VBAM_STATIC_DEFAULT OFF) + +if(VCPKG_TARGET_TRIPLET MATCHES -static OR CMAKE_TOOLCHAIN_FILE MATCHES mxe) + set(VBAM_STATIC_DEFAULT ON) +endif() + project(VBA-M C CXX) cmake_minimum_required(VERSION 2.8.12) @@ -41,7 +52,7 @@ option(ENABLE_WX "Build the wxWidgets port" ON) option(ENABLE_DEBUGGER "Enable the debugger" ON) option(ENABLE_ASAN "Enable -fsanitize=