IF(NOT LMMS_SUPPORT_VST)
	RETURN()
ENDIF()

INCLUDE(BuildPlugin)

SET(LMMS_BINARY_DIR ${CMAKE_BINARY_DIR})
SET(LMMS_SOURCE_DIR ${CMAKE_SOURCE_DIR})
SET(EXTERNALPROJECT_ARGS "")

# build 32 bit version of RemoteVstPlugin
IF(LMMS_BUILD_WIN64 AND MSVC)
	INCLUDE(ExternalProject)

	SET(MSVC_VER ${CMAKE_CXX_COMPILER_VERSION})

	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()
		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()

# build 64 bit version of RemoteVstPlugin
IF(LMMS_BUILD_WIN64)
	ADD_SUBDIRECTORY(RemoteVstPlugin)
ENDIF()

ADD_SUBDIRECTORY(vstbase)
