From 81651525524c2532123295d07bbaf62047c10828 Mon Sep 17 00:00:00 2001 From: Lukas W Date: Mon, 11 Jun 2018 14:15:07 +0200 Subject: [PATCH] MSVC VST compilation fixes --- CMakeLists.txt | 30 +++++------ plugins/vst_base/CMakeLists.txt | 65 +---------------------- plugins/vst_base/RemoteVstPlugin32.cmake | 67 ++++++++++++++++++++++++ plugins/vst_base/RemoteVstPlugin64.cmake | 13 +++++ plugins/vst_base/VstPlugin.cpp | 14 ++--- 5 files changed, 102 insertions(+), 87 deletions(-) create mode 100644 plugins/vst_base/RemoteVstPlugin32.cmake create mode 100644 plugins/vst_base/RemoteVstPlugin64.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 492601769..026b034ef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,10 +47,6 @@ ENDIF() INCLUDE(VersionInfo) INCLUDE(DetectMachine) -IF(CMAKE_TOOLCHAIN_FILE MATCHES "vcpkg.cmake$") - SET(USING_VCPKG TRUE) -ENDIF() - OPTION(WANT_ALSA "Include ALSA (Advanced Linux Sound Architecture) support" ON) OPTION(WANT_CALF "Include CALF LADSPA plugins" ON) OPTION(WANT_CAPS "Include C* Audio Plugin Suite (LADSPA plugins)" ON) @@ -169,15 +165,15 @@ FIND_PACKAGE(Qt5Test) SET(QT_QTTEST_LIBRARY Qt5::Test) # check for libsndfile -IF(USING_VCPKG) - FIND_PACKAGE(LibSndFile 1.0.18 REQUIRED) - SET(SNDFILE_LIBRARIES sndfile-shared) -ELSE(USING_VCPKG) +IF(PKG_CONFIG_FOUND) PKG_CHECK_MODULES(SNDFILE REQUIRED sndfile>=1.0.18) IF(NOT SNDFILE_FOUND) MESSAGE(FATAL_ERROR "LMMS requires libsndfile1 and libsndfile1-dev >= 1.0.18 - please install, remove CMakeCache.txt and try again!") ENDIF() -ENDIF(USING_VCPKG) +ELSE() + FIND_PACKAGE(LibSndFile 1.0.18 REQUIRED) + SET(SNDFILE_LIBRARIES sndfile-shared) +ENDIF() # check if we can use SF_SET_COMPRESSION_LEVEL IF(NOT SNDFILE_VERSION VERSION_LESS 1.0.26) SET(LMMS_HAVE_SF_COMPLEVEL TRUE) @@ -402,13 +398,13 @@ ENDIF(WANT_JACK) # check for FFTW3F-library -IF(USING_VCPKG) +IF(PKG_CONFIG_FOUND) + PKG_CHECK_MODULES(FFTW3F REQUIRED fftw3f>=3.0.0) +ELSE() #currently find_package for fftw is broken in vcpkg. Replace this when fixed FIND_PATH(FFTW3F_INCLUDE_DIRS fftw3.h) FIND_LIBRARY(FFTW3F_LIBRARIES fftw3f) -ELSE(USING_VCPKG) - PKG_CHECK_MODULES(FFTW3F REQUIRED fftw3f>=3.0.0) -ENDIF(USING_VCPKG) +ENDIF() # check for FLTK FIND_PACKAGE(FLTK) @@ -490,13 +486,13 @@ ELSE() ENDIF(WANT_DEBUG_FPE) # check for libsamplerate -IF(USING_VCPKG) +IF(PKG_CONFIG_FOUND) + PKG_CHECK_MODULES(SAMPLERATE REQUIRED samplerate>=0.1.8) +ELSE() #TODO no cmake config support. Can we check the version some other way? FIND_FILE(SAMPLERATE_INCLUDE_DIRS samplerate.h) FIND_LIBRARY(SAMPLERATE_LIBRARIES libsamplerate-0) -ELSE(USING_VCPKG) - PKG_CHECK_MODULES(SAMPLERATE REQUIRED samplerate>=0.1.8) -ENDIF(USING_VCPKG) +ENDIF() # set compiler flags IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") diff --git a/plugins/vst_base/CMakeLists.txt b/plugins/vst_base/CMakeLists.txt index 42b5930b7..314d5fc18 100644 --- a/plugins/vst_base/CMakeLists.txt +++ b/plugins/vst_base/CMakeLists.txt @@ -29,67 +29,6 @@ SET(EXTERNALPROJECT_CMAKE_ARGS ) # build 32 bit version of RemoteVstPlugin -IF(LMMS_BUILD_WIN32 AND NOT LMMS_BUILD_WIN64) - ADD_SUBDIRECTORY(RemoteVstPlugin) -ELSEIF(LMMS_BUILD_WIN64 AND MSVC) - STRING(REPLACE " Win64" "" GENERATOR ${CMAKE_GENERATOR}) - - IF(NOT USING_VCPKG) - GET_FILENAME_COMPONENT(QT_BIN_DIR ${QT_QMAKE_EXECUTABLE} DIRECTORY) - SET(QT_32_PREFIX "${QT_BIN_DIR}/../../msvc${MSVC_YEAR}") - IF(NOT (IS_DIRECTORY ${QT_32_PREFIX} AND EXISTS ${QT_32_PREFIX}/bin/qmake.exe)) - MESSAGE(SEND_ERROR "Can't build RemoteVstPlugin32, no Qt 32 bit installation found at ${QT_32_PREFIX}") - ENDIF() - ENDIF(NOT USING_VCPKG) - - ExternalProject_Add(RemoteVstPlugin32 - "${EXTERNALPROJECT_ARGS}" - CMAKE_GENERATOR ${GENERATOR} - CMAKE_GENERATOR_TOOLSET ${CMAKE_GENERATOR_TOOLSET} - CMAKE_ARGS - "${EXTERNALPROJECT_CMAKE_ARGS}" - "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" - "-DCMAKE_PREFIX_PATH=${QT_32_PREFIX}" - ) -ELSEIF(LMMS_BUILD_LINUX) - # Use winegcc - ExternalProject_Add(RemoteVstPlugin32 - "${EXTERNALPROJECT_ARGS}" - CMAKE_ARGS - "${EXTERNALPROJECT_CMAKE_ARGS}" - "-DCMAKE_CXX_COMPILER=${WINEGCC}" - "-DCMAKE_CXX_FLAGS=-m32 -mwindows" - ) -ELSEIF(CMAKE_TOOLCHAIN_FILE_32) - ExternalProject_Add(RemoteVstPlugin32 - "${EXTERNALPROJECT_ARGS}" - CMAKE_ARGS - "${EXTERNALPROJECT_CMAKE_ARGS}" - "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH_32}" - "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE_32}" - ) -ELSE() - message(SEND_ERROR "Can't build RemoteVstPlugin32, unknown environment. Please supply CMAKE_TOOLCHAIN_FILE_32 and optionally CMAKE_PREFIX_PATH_32") -ENDIF() - +INCLUDE("${CMAKE_CURRENT_LIST_DIR}/RemoteVstPlugin32.cmake") # build 64 bit version of RemoteVstPlugin -IF(LMMS_BUILD_WIN64) - ADD_SUBDIRECTORY(RemoteVstPlugin) - INSTALL(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin64.exe" DESTINATION "${PLUGIN_DIR}") -ELSEIF(LMMS_BUILD_LINUX) - ExternalProject_Add(RemoteVstPlugin64 - "${EXTERNALPROJECT_ARGS}" - CMAKE_ARGS - "${EXTERNALPROJECT_CMAKE_ARGS}" - "-DCMAKE_CXX_COMPILER=${WINEGCC}" - "-DCMAKE_CXX_FLAGS=-m64 -mwindows" - ) -ENDIF() - -IF(TARGET RemoteVstPlugin32) - IF(LMMS_BUILD_LINUX) - INSTALL(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin32" "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin32.exe.so" DESTINATION "${PLUGIN_DIR}") - ELSEIF(LMMS_BUILD_WIN32) - INSTALL(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin32.exe" DESTINATION "${PLUGIN_DIR}") - ENDIF() -ENDIF() \ No newline at end of file +INCLUDE("${CMAKE_CURRENT_LIST_DIR}/RemoteVstPlugin64.cmake") diff --git a/plugins/vst_base/RemoteVstPlugin32.cmake b/plugins/vst_base/RemoteVstPlugin32.cmake new file mode 100644 index 000000000..a74c5b1f8 --- /dev/null +++ b/plugins/vst_base/RemoteVstPlugin32.cmake @@ -0,0 +1,67 @@ +IF(LMMS_BUILD_WIN32 AND NOT LMMS_BUILD_WIN64) + ADD_SUBDIRECTORY(RemoteVstPlugin) +ELSEIF(LMMS_BUILD_WIN64 AND MSVC) + SET(MSVC_VER ${CMAKE_CXX_COMPILER_VERSION}) + + IF(NOT CMAKE_GENERATOR_32) + IF(MSVC_VER VERSION_GREATER 19.0 OR MSVC_VER VERSION_EQUAL 19.0) + SET(CMAKE_GENERATOR_32 "Visual Studio 14 2015") + SET(MSVC_YEAR 2015) + ELSEIF(MSVC_VER VERSION_EQUAL 19.10 OR MSVC_VER VERSION_EQUAL 19.10) + SET(CMAKE_GENERATOR_32 "Visual Studio 15 2017") + SET(MSVC_YEAR 2017) + ELSE() + MESSAGE(SEND_WARNING "Can't build RemoteVstPlugin32, unknown MSVC version ${MSVC_VER} and no CMAKE_GENERATOR_32 set") + RETURN() + ENDIF() + ENDIF() + + IF(NOT QT_32_PREFIX AND NOT USING_VCPKG) + GET_FILENAME_COMPONENT(QT_BIN_DIR ${QT_QMAKE_EXECUTABLE} DIRECTORY) + SET(QT_32_PREFIX "${QT_BIN_DIR}/../../msvc${MSVC_YEAR}") + ENDIF() + + IF(NOT QT_32_PREFIX) + MESSAGE(WARNING "Can't build RemoteVstPlugin32, QT_32_PREFIX not set") + RETURN() + ELSEIF(NOT (IS_DIRECTORY ${QT_32_PREFIX} AND EXISTS ${QT_32_PREFIX}/bin/qmake.exe)) + MESSAGE(WARNING "Can't build RemoteVstPlugin32, no Qt 32 bit installation found at ${QT_32_PREFIX}") + RETURN() + ENDIF() + + ExternalProject_Add(RemoteVstPlugin32 + "${EXTERNALPROJECT_ARGS}" + CMAKE_GENERATOR "${CMAKE_GENERATOR_32}" + #CMAKE_GENERATOR_TOOLSET "${CMAKE_GENERATOR_TOOLSET}" + CMAKE_ARGS + "${EXTERNALPROJECT_CMAKE_ARGS}" + "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" + "-DCMAKE_PREFIX_PATH=${QT_32_PREFIX}" + ) +ELSEIF(LMMS_BUILD_LINUX) + # Use winegcc + ExternalProject_Add(RemoteVstPlugin32 + "${EXTERNALPROJECT_ARGS}" + CMAKE_ARGS + "${EXTERNALPROJECT_CMAKE_ARGS}" + "-DCMAKE_CXX_COMPILER=${WINEGCC}" + "-DCMAKE_CXX_FLAGS=-m32 -mwindows" + ) +ELSEIF(CMAKE_TOOLCHAIN_FILE_32) + ExternalProject_Add(RemoteVstPlugin32 + "${EXTERNALPROJECT_ARGS}" + CMAKE_ARGS + "${EXTERNALPROJECT_CMAKE_ARGS}" + "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH_32}" + "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE_32}" + ) +ELSE() + message(WARNING "Can't build RemoteVstPlugin32, unknown environment. Please supply CMAKE_TOOLCHAIN_FILE_32 and optionally CMAKE_PREFIX_PATH_32") + RETURN() +ENDIF() + +IF(LMMS_BUILD_LINUX) + INSTALL(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin32" "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin32.exe.so" DESTINATION "${PLUGIN_DIR}") +ELSEIF(LMMS_BUILD_WIN32) + INSTALL(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin32.exe" DESTINATION "${PLUGIN_DIR}") +ENDIF() diff --git a/plugins/vst_base/RemoteVstPlugin64.cmake b/plugins/vst_base/RemoteVstPlugin64.cmake new file mode 100644 index 000000000..3922ce171 --- /dev/null +++ b/plugins/vst_base/RemoteVstPlugin64.cmake @@ -0,0 +1,13 @@ +IF(LMMS_BUILD_WIN64) + ADD_SUBDIRECTORY(RemoteVstPlugin) + INSTALL(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin64.exe" DESTINATION "${PLUGIN_DIR}") +ELSEIF(LMMS_BUILD_LINUX) + ExternalProject_Add(RemoteVstPlugin64 + "${EXTERNALPROJECT_ARGS}" + CMAKE_ARGS + "${EXTERNALPROJECT_CMAKE_ARGS}" + "-DCMAKE_CXX_COMPILER=${WINEGCC}" + "-DCMAKE_CXX_FLAGS=-m64 -mwindows" + ) + INSTALL(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin64" "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin64.exe.so" DESTINATION "${PLUGIN_DIR}") +ENDIF() diff --git a/plugins/vst_base/VstPlugin.cpp b/plugins/vst_base/VstPlugin.cpp index 95fcfced1..b14efcb5e 100644 --- a/plugins/vst_base/VstPlugin.cpp +++ b/plugins/vst_base/VstPlugin.cpp @@ -74,11 +74,11 @@ namespace PE // Utilities for reading PE file machine type // See specification at https://msdn.microsoft.com/library/windows/desktop/ms680547(v=vs.85).aspx -enum MachineType : uint16_t +enum class MachineType : uint16_t { - IMAGE_FILE_MACHINE_UNKNOWN = 0x0, - IMAGE_FILE_MACHINE_AMD64 = 0x8664, - IMAGE_FILE_MACHINE_I386 = 0x14c, + unknown = 0x0, + amd64 = 0x8664, + i386 = 0x14c, }; class FileInfo @@ -135,15 +135,15 @@ VstPlugin::VstPlugin( const QString & _plugin ) : machineType = peInfo.machineType(); } catch (std::runtime_error& e) { qCritical() << "Error while determining PE file's machine type: " << e.what(); - machineType = PE::IMAGE_FILE_MACHINE_UNKNOWN; + machineType = PE::MachineType::unknown; } switch(machineType) { - case PE::IMAGE_FILE_MACHINE_AMD64: + case PE::MachineType::amd64: tryLoad( "RemoteVstPlugin64" ); break; - case PE::IMAGE_FILE_MACHINE_I386: + case PE::MachineType::i386: tryLoad( "RemoteVstPlugin32" ); break; default: