MSVC: Fix VST build

This commit is contained in:
Lukas W
2017-11-26 14:15:26 +01:00
parent 07a22181da
commit d756a7ade0
13 changed files with 189 additions and 119 deletions

View File

@@ -94,9 +94,7 @@ IF(MSVC)
organic
ReverbSC
sid
vestige
vibed
vst_base
VstEffect
Xpressive
zynaddsubfx

View File

@@ -1,6 +1,5 @@
IF(LMMS_SUPPORT_VST)
INCLUDE(BuildPlugin)
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/../vst_base")
LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/..")
IF(LMMS_BUILD_LINUX)
LINK_LIBRARIES(-Wl,--enable-new-dtags)
@@ -10,7 +9,6 @@ IF(LMMS_SUPPORT_VST)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${PLUGIN_DIR}")
ENDIF()
BUILD_PLUGIN(vestige vestige.cpp vestige.h MOCFILES vestige.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png")
TARGET_LINK_LIBRARIES(vestige -lvstbase)
ADD_DEPENDENCIES(vestige vstbase)
TARGET_LINK_LIBRARIES(vestige vstbase)
ENDIF(LMMS_SUPPORT_VST)

View File

@@ -22,6 +22,10 @@
*
*/
#include <QtCore/QtGlobal>
#include "VstPlugin.h"
#include "vestige.h"
#include <memory>
@@ -41,7 +45,7 @@
#include "gui_templates.h"
#include "InstrumentPlayHandle.h"
#include "InstrumentTrack.h"
#include "VstPlugin.h"
#include "MainWindow.h"
#include "Mixer.h"
#include "GuiApplication.h"
@@ -52,6 +56,7 @@
#include "ToolTip.h"
#include "FileDialog.h"
#include "embed.h"
@@ -59,7 +64,7 @@
extern "C"
{
Plugin::Descriptor PLUGIN_EXPORT vestige_plugin_descriptor =
Plugin::Descriptor Q_DECL_EXPORT vestige_plugin_descriptor =
{
STRINGIFY( PLUGIN_NAME ),
"VeSTige",
@@ -612,7 +617,7 @@ void VestigeInstrumentView::updateMenu( void )
QMenu * to_menu = m_selPresetButton->menu();
to_menu->clear();
QAction *presetActions[list1.size()];
QVector<QAction*> presetActions(list1.size());
for (int i = 0; i < list1.size(); i++) {
presetActions[i] = new QAction(this);
@@ -1163,7 +1168,7 @@ extern "C"
{
// necessary for getting instance out of shared lib
PLUGIN_EXPORT Plugin * lmms_plugin_main( Model *, void * _data )
Q_DECL_EXPORT Plugin * lmms_plugin_main( Model *, void * _data )
{
return new vestigeInstrument( static_cast<InstrumentTrack *>( _data ) );
}

View File

@@ -1,93 +1,110 @@
IF(LMMS_SUPPORT_VST)
IF(NOT LMMS_SUPPORT_VST)
RETURN()
ENDIF()
INCLUDE(BuildPlugin)
IF(LMMS_BUILD_WIN32)
ADD_DEFINITIONS(-DPTW32_STATIC_LIB)
ADD_EXECUTABLE(RemoteVstPlugin "${CMAKE_CURRENT_SOURCE_DIR}/RemoteVstPlugin.cpp")
SET(LMMS_BINARY_DIR ${CMAKE_BINARY_DIR})
SET(LMMS_SOURCE_DIR ${CMAKE_SOURCE_DIR})
SET(EXTERNALPROJECT_ARGS "")
TARGET_LINK_LIBRARIES(RemoteVstPlugin Qt5::Core)
TARGET_LINK_LIBRARIES(RemoteVstPlugin -lpthread -lgdi32 -lws2_32)
SET_TARGET_PROPERTIES(RemoteVstPlugin PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -O0")
ADD_CUSTOM_COMMAND(TARGET RemoteVstPlugin POST_BUILD COMMAND "${STRIP}" "$<TARGET_FILE:RemoteVstPlugin>")
INSTALL(TARGETS RemoteVstPlugin RUNTIME DESTINATION "${PLUGIN_DIR}")
# build 32 bit version of RemoteVstPlugin
IF(LMMS_BUILD_WIN64 AND MSVC)
INCLUDE(ExternalProject)
# FIXME: 32-bit VST fails on MSYS
IF(LMMS_BUILD_WIN64 AND NOT LMMS_BUILD_MSYS)
# build 32 bit version of RemoteVstPlugin for Win64 so we can load
# 32 bit VST plugins
ADD_SUBDIRECTORY(Win64)
ENDIF(LMMS_BUILD_WIN64 AND NOT LMMS_BUILD_MSYS)
ENDIF(LMMS_BUILD_WIN32)
SET(MSVC_VER ${CMAKE_CXX_COMPILER_VERSION})
SET(REMOTE_VST_PLUGIN_FILEPATH "RemoteVstPlugin" CACHE STRING "Relative file path to RemoteVstPlugin")
INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/src/3rdparty/qt5-x11embed/src/")
ADD_DEFINITIONS(-DREMOTE_VST_PLUGIN_FILEPATH="${REMOTE_VST_PLUGIN_FILEPATH}")
BUILD_PLUGIN(vstbase vst_base.cpp VstPlugin.cpp VstPlugin.h communication.h MOCFILES VstPlugin.h)
IF(LMMS_BUILD_LINUX)
TARGET_LINK_LIBRARIES(vstbase qx11embedcontainer)
ENDIF()
IF(LMMS_BUILD_LINUX AND NOT WANT_VST_NOWINE)
IF(LMMS_HOST_X86_64)
SET(EXTRA_FLAGS -m32)
IF(WINE_LIBRARY_FIX)
SET(EXTRA_FLAGS ${EXTRA_FLAGS} -nodefaultlibs ${WINE_LIBRARY_FIX}wine/libwinecrt0.a -L${WINE_LIBRARY_FIX}wine/ -luser32 -lkernel32 -lgdi32)
ENDIF()
ENDIF(LMMS_HOST_X86_64)
SET(WINE_CXX_FLAGS "" CACHE STRING "Extra flags passed to wineg++")
STRING(REPLACE "include/wine" "include" WINE_INCLUDE_BASE_DIR ${WINE_INCLUDE_DIR})
STRING(REPLACE "lib/libwine.so" "lib" WINE_LIBRARY_DIR ${WINE_LIBRARY})
STRING(REPLACE " " ";" WINE_BUILD_FLAGS ${CMAKE_CXX_FLAGS} " " ${CMAKE_EXE_LINKER_FLAGS} " " ${WINE_CXX_FLAGS})
SET(WINE_CXX_ARGS
-I${CMAKE_BINARY_DIR}
-I${CMAKE_SOURCE_DIR}/include
-I${WINE_INCLUDE_BASE_DIR}
-I${WINE_INCLUDE_DIR}/windows
-L${WINE_LIBRARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/RemoteVstPlugin.cpp
-std=c++0x
-mwindows -lpthread ${EXTRA_FLAGS} -fno-omit-frame-pointer
${WINE_BUILD_FLAGS}
-o ../RemoteVstPlugin
)
# winegcc fails if winebuild is not in path
GET_FILENAME_COMPONENT(WINE_BINDIR ${WINE_CXX} PATH)
FIND_PROGRAM(WINEBUILD winebuild NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH)
IF(NOT WINEBUILD)
IF(CMAKE_VERSION VERSION_LESS 3.1)
MESSAGE(WARNING "winebuild is not in PATH. Building RemoteVstPlugin may fail.")
IF(MSVC_VER VERSION_GREATER 19.0 OR MSVC_VER VERSION_EQUAL 19.0)
SET(GENERATOR "Visual Studio 14 2015")
SET(MSVC_YEAR 2015)
ELSEIF(MSVC_VER VERSION_EQUAL 19.10 OR MSVC_VER VERSION_EQUAL 19.10)
SET(GENERATOR "Visual Studio 15 2017")
SET(MSVC_YEAR 2017)
ELSE()
SET(WINE_CXX_ARGS -E env PATH=$ENV{PATH}:${WINE_BINDIR} ${WINE_CXX} ${WINE_CXX_ARGS})
SET(WINE_CXX "${CMAKE_COMMAND}")
MESSAGE(SEND_ERROR "Can't build RemoteVstPlugin32, unknown MSVC version ${MSVC_VER}")
ENDIF()
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()
ExternalProject_Add(RemoteVstPlugin32
SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/RemoteVstPlugin"
INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/../"
CMAKE_GENERATOR ${GENERATOR}
CMAKE_ARGS
-DLMMS_SOURCE_DIR=${CMAKE_SOURCE_DIR}
-DLMMS_BINARY_DIR=${CMAKE_BINARY_DIR}
-DCMAKE_PREFIX_PATH=${QT_32_PREFIX}
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
INSTALL_COMMAND ""
BUILD_ALWAYS ON
)
ELSEIF(LMMS_BUILD_WIN32)
ADD_SUBDIRECTORY(RemoteVstPlugin)
ELSEIF(LMMS_BUILD_LINUX AND NOT WANT_VST_NOWINE)
IF(LMMS_HOST_X86_64)
SET(EXTRA_FLAGS -m32)
IF(WINE_LIBRARY_FIX)
SET(EXTRA_FLAGS ${EXTRA_FLAGS} -nodefaultlibs ${WINE_LIBRARY_FIX}wine/libwinecrt0.a -L${WINE_LIBRARY_FIX}wine/ -luser32 -lkernel32 -lgdi32)
ENDIF()
ENDIF(LMMS_HOST_X86_64)
SET(WINE_CXX_FLAGS "" CACHE STRING "Extra flags passed to wineg++")
STRING(REPLACE "include/wine" "include" WINE_INCLUDE_BASE_DIR ${WINE_INCLUDE_DIR})
STRING(REPLACE "lib/libwine.so" "lib" WINE_LIBRARY_DIR ${WINE_LIBRARY})
STRING(REPLACE " " ";" WINE_BUILD_FLAGS ${CMAKE_CXX_FLAGS} " " ${CMAKE_EXE_LINKER_FLAGS} " " ${WINE_CXX_FLAGS})
SET(WINE_CXX_ARGS
-I${CMAKE_BINARY_DIR}
-I${CMAKE_SOURCE_DIR}/include
-I${WINE_INCLUDE_BASE_DIR}
-I${WINE_INCLUDE_DIR}/windows
-L${WINE_LIBRARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/RemoteVstPlugin.cpp
-std=c++0x
-mwindows -lpthread ${EXTRA_FLAGS} -fno-omit-frame-pointer
${WINE_BUILD_FLAGS}
-o ../RemoteVstPlugin
)
# winegcc fails if winebuild is not in path
GET_FILENAME_COMPONENT(WINE_BINDIR ${WINE_CXX} PATH)
FIND_PROGRAM(WINEBUILD winebuild NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH)
IF(NOT WINEBUILD)
IF(CMAKE_VERSION VERSION_LESS 3.1)
MESSAGE(WARNING "winebuild is not in PATH. Building RemoteVstPlugin may fail.")
ELSE()
SET(WINE_CXX_ARGS -E env PATH=$ENV{PATH}:${WINE_BINDIR} ${WINE_CXX} ${WINE_CXX_ARGS})
SET(WINE_CXX "${CMAKE_COMMAND}")
ENDIF()
ENDIF()
set(ENV{PATH} "$ENV{PATH}:${WINE_BINDIR}")
ADD_CUSTOM_COMMAND(
SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/RemoteVstPlugin.cpp"
COMMAND export
ARGS "PATH=$PATH:${WINE_BINDIR}"
COMMAND ${WINE_CXX}
ARGS ${WINE_CXX_ARGS}
# Ensure correct file extension
COMMAND sh -c "mv ../RemoteVstPlugin.exe ../RemoteVstPlugin || true"
TARGET vstbase
OUTPUTS ../RemoteVstPlugin
VERBATIM
)
SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ../RemoteVstPlugin32.exe.so)
INSTALL(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin32" "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin32.exe.so" DESTINATION "${PLUGIN_DIR}")
ENDIF()
set(ENV{PATH} "$ENV{PATH}:${WINE_BINDIR}")
# build 64 bit version of RemoteVstPlugin
IF(LMMS_BUILD_WIN64)
ADD_SUBDIRECTORY(RemoteVstPlugin)
ENDIF()
ADD_CUSTOM_COMMAND(
SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/RemoteVstPlugin.cpp"
COMMAND export
ARGS "PATH=$PATH:${WINE_BINDIR}"
COMMAND ${WINE_CXX}
ARGS ${WINE_CXX_ARGS}
# Ensure correct file extension
COMMAND sh -c "mv ../RemoteVstPlugin.exe ../RemoteVstPlugin || true"
TARGET vstbase
OUTPUTS ../RemoteVstPlugin
VERBATIM
)
SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ../RemoteVstPlugin.exe.so)
INSTALL(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin" "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin.exe.so" DESTINATION "${PLUGIN_DIR}")
ENDIF(LMMS_BUILD_LINUX AND NOT WANT_VST_NOWINE)
ENDIF(LMMS_SUPPORT_VST)
ADD_SUBDIRECTORY(vstbase)

View File

@@ -0,0 +1,33 @@
cmake_minimum_required(VERSION 3.0.0)
project(RemoteVstPlugin
LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(BITNESS 64)
else()
set(BITNESS 32)
endif()
set(EXE_NAME RemoteVstPlugin${BITNESS})
add_executable(${EXE_NAME}
../RemoteVstPlugin.cpp
)
target_include_directories(${EXE_NAME}
PRIVATE
"${LMMS_SOURCE_DIR}/plugins/vst_base/common"
"${LMMS_SOURCE_DIR}/include"
"${LMMS_BINARY_DIR}"
)
if(WIN32)
find_package(Qt5 REQUIRED COMPONENTS Core)
target_link_libraries(${EXE_NAME} Qt5::Core)
endif()
IF(STRIP)
ADD_CUSTOM_COMMAND(TARGET RemoteVstPlugin32 POST_BUILD COMMAND "${STRIP}" "$<TARGET_FILE:RemoteVstPlugin32>")
ENDIF()

View File

@@ -24,6 +24,8 @@
#include "VstPlugin.h"
#include "communication.h"
#include <QtCore/QDebug>
#include <QDir>
#include <QFileInfo>
@@ -79,12 +81,14 @@ VstPlugin::VstPlugin( const QString & _plugin ) :
{
setSplittedChannels( true );
tryLoad( REMOTE_VST_PLUGIN_FILEPATH );
#ifdef LMMS_BUILD_WIN64
tryLoad( "RemoteVstPlugin64" );
if( m_badDllFormat )
{
m_badDllFormat = false;
tryLoad( "32/RemoteVstPlugin32" );
#endif
tryLoad( "RemoteVstPlugin32" );
#ifdef LMMS_BUILD_WIN64
}
#endif

View File

@@ -33,12 +33,14 @@
#include <QWidget>
#include "JournallingObject.h"
#include "communication.h"
#include "RemotePlugin.h"
#include "vstbase_export.h"
class vstSubWin;
class PLUGIN_EXPORT VstPlugin : public RemotePlugin, public JournallingObject
class VSTBASE_EXPORT VstPlugin : public RemotePlugin, public JournallingObject
{
Q_OBJECT
public:

View File

@@ -1,15 +0,0 @@
INCLUDE_DIRECTORIES("${CMAKE_BINARY_DIR}" "${CMAKE_SOURCE_DIR}/include")
SET(CMAKE_CXX_COMPILER "${CMAKE_CXX_COMPILER32}")
ADD_EXECUTABLE(RemoteVstPlugin32 "${CMAKE_CURRENT_SOURCE_DIR}/../RemoteVstPlugin.cpp")
SET(QTCORE "Qt5Core")
TARGET_LINK_LIBRARIES(RemoteVstPlugin32 -l${QTCORE} -lpthread -lgdi32 -lws2_32)
ADD_CUSTOM_COMMAND(TARGET RemoteVstPlugin32 POST_BUILD COMMAND "${STRIP}" "$<TARGET_FILE:RemoteVstPlugin32>")
SET_TARGET_PROPERTIES(RemoteVstPlugin32 PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -O0")
INSTALL(TARGETS RemoteVstPlugin32 RUNTIME DESTINATION "${PLUGIN_DIR}/32")
INSTALL(FILES "${MINGW_PREFIX32}/bin/${QTCORE}.dll" "${MINGW_PREFIX32}/bin/zlib1.dll" "${MINGW_PREFIX32}/${CMAKE_SYSTEM_PROCESSOR32}-w64-mingw32/bin/libwinpthread-1.dll"
DESTINATION "${PLUGIN_DIR}/32")

View File

@@ -27,8 +27,6 @@
#ifndef _COMMUNICATION_H
#define _COMMUNICATION_H
#include "RemotePlugin.h"
struct VstParameterDumpItem

View File

@@ -26,12 +26,12 @@
#include "Plugin.h"
#include "embed.h"
#include "vstbase_export.h"
extern "C"
{
Plugin::Descriptor PLUGIN_EXPORT vstbase_plugin_descriptor =
Plugin::Descriptor VSTBASE_EXPORT vstbase_plugin_descriptor =
{
STRINGIFY( PLUGIN_NAME ),
"VST Base",

View File

@@ -0,0 +1,14 @@
BUILD_PLUGIN(vstbase
../vst_base.cpp ../VstPlugin.cpp ../VstPlugin.h ../communication.h
MOCFILES ../VstPlugin.h
EXPORT_BASE_NAME vstbase
LINK SHARED
)
TARGET_INCLUDE_DIRECTORIES(vstbase
PUBLIC ../
)
IF(LMMS_BUILD_LINUX)
TARGET_LINK_LIBRARIES(vstbase qx11embedcontainer)
ENDIF()