1
2#-------------------------------------------------------------------------------
3# Includes
4#-------------------------------------------------------------------------------
5include(SMTG_CodeSign)
6
7if(SMTG_MAC AND SMTG_ADD_VSTGUI)
8    if(XCODE)
9        set(SMTG_AUV3_FOLDER FOLDER "AudioUnit V3")
10
11        set(auv3wrappermacos_sources
12            ${SDK_ROOT}/public.sdk/source/vst/auv3wrapper/AUv3WrappermacOS/main.mm
13        )
14
15        set(auv3wrappermacosextension_sources
16            ${SDK_ROOT}/public.sdk/source/vst/auv3wrapper/Shared/AUv3WrapperFactory.mm
17        )
18
19        set(auv3wrapperios_sources
20        )
21
22        set(auv3wrapperiosextension_sources
23            ${SDK_ROOT}/public.sdk/source/vst/auv3wrapper/Shared/AUv3WrapperFactory.mm
24        )
25
26        #--------------------------------------------------------------------------------------------------------
27        # Add a AudioUnit Version 3 target for macOS
28        # @param target                 target name
29        # @param BuildTarget            must be either "macOS" or "iOS"
30        # @param OutputName             Output App name
31        # @param BundleID               Bundle Identifier
32        # @param AudioUnitConfigHeader  configuration header
33        # @param EntitlementFile        Code sign entitlements file
34        # @param AppSources             Application Sources
35        # @param AppUIResources         Application UI Resources
36        # @param AppInfoPlist           Info.plist for the application
37        # @param ExtensionInfoPlist     Info.plist for the app-extension
38        # @param vst3_plugin_target     the vst3 plugin target
39        #--------------------------------------------------------------------------------------------------------
40        function(smtg_add_auv3 target BuildTarget OutputName BundleID AudioUnitConfigHeader EntitlementFile AppSources AppUIResources AppInfoPlist ExtensionInfoPlist vst3_plugin_target)
41            if(BuildTarget STREQUAL macOS)
42                set(macOS TRUE)
43            elseif(BuildTarget STREQUAL iOS)
44                set(iOS TRUE)
45            else()
46                message(FATAL_ERROR "BuildTarget must be macOS or iOS not ${BuildTarget}")
47            endif()
48
49            if(macOS)
50                set(link_frameworks
51                    "-framework Accelerate"
52                    "-framework AppKit"
53                    "-framework AudioToolbox"
54                    "-framework AVFoundation"
55                    "-framework CoreAudioKit"
56                    "-framework OpenGL"
57                    "-framework QuartzCore"
58                    "-framework CoreMIDI"
59                )
60                set(app-extension-target ${target}_appextension_macos)
61                set(app-target ${target})
62                set(app-extension-sources ${auv3wrappermacosextension_sources})
63                set(auwrapper-sources ${auv3wrappermacos_sources} ${AppSources})
64                set(auwrapper-lib auv3wrappermacos)
65            else()
66                set(link_frameworks
67                    "-framework UIKit"
68                    "-framework CoreAudioKit"
69                    "-framework AudioToolbox"
70                    "-framework CoreGraphics"
71                    "-framework QuartzCore"
72                    "-framework CoreText"
73                    "-framework Accelerate"
74                    "-framework AVFoundation"
75                    "-framework ImageIO"
76                    "-framework MobileCoreServices"
77                    "-framework MediaPlayer"
78                    "-framework CoreMIDI"
79                )
80                set(app-extension-target ${target}_appextension_ios)
81                set(app-target ${target})
82                set(app-extension-sources ${auv3wrapperiosextension_sources})
83                set(auwrapper-sources ${AppSources})
84                set(auwrapper-lib auv3wrapperios)
85            endif()
86
87            set(auwrapper-xib-resources ${AppUIResources})
88
89            get_filename_component(AudioUnitConfig ${AudioUnitConfigHeader} ABSOLUTE)
90            get_filename_component(AppInfoPlist ${AppInfoPlist} ABSOLUTE)
91            get_filename_component(ExtensionInfoPlist ${ExtensionInfoPlist} ABSOLUTE)
92            get_filename_component(EntitlementFile ${EntitlementFile} ABSOLUTE)
93
94            # app-extension
95            add_executable(${app-extension-target} ${app-extension-sources})
96            target_link_libraries(${app-extension-target} PRIVATE ${auwrapper-lib} ${link_frameworks})
97            add_dependencies(${app-extension-target} "${vst3_plugin_target}")
98            set_target_properties(${app-extension-target} PROPERTIES
99                # BUNDLE YES
100                # MACOSX_BUNDLE TRUE
101                XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER ${BundleID}.appex
102                XCODE_ATTRIBUTE_INFOPLIST_PREFIX_HEADER ${AudioUnitConfig}
103                XCODE_ATTRIBUTE_GCC_PREFIX_HEADER ${AudioUnitConfig}
104                XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES
105                XCODE_ATTRIBUTE_WRAPPER_EXTENSION appex
106                XCODE_PRODUCT_TYPE com.apple.product-type.app-extension
107                ${SMTG_AUV3_FOLDER}
108            )
109            smtg_set_bundle(${app-extension-target} INFOPLIST "${ExtensionInfoPlist}" PREPROCESS)
110
111            # application
112            add_executable(${app-target} ${auwrapper-sources} ${auwrapper-xib-resources})
113            target_link_libraries(${app-target} PRIVATE ${auwrapper-lib} ${link_frameworks})
114            add_dependencies(${app-target} "${app-extension-target}")
115            set_target_properties(${app-target} PROPERTIES RESOURCE "${auwrapper-xib-resources}")
116            set_target_properties(${app-target} PROPERTIES
117                MACOSX_BUNDLE TRUE
118                OUTPUT_NAME "${OutputName}"
119                XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER ${BundleID}
120                XCODE_ATTRIBUTE_INFOPLIST_PREFIX_HEADER ${AudioUnitConfig}
121                XCODE_ATTRIBUTE_GCC_PREFIX_HEADER ${AudioUnitConfig}
122                XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES
123                ${SMTG_AUV3_FOLDER}
124            )
125            smtg_set_bundle(${app-target} INFOPLIST "${AppInfoPlist}" PREPROCESS)
126
127            get_target_property(PLUGIN_PACKAGE_PATH ${vst3_plugin_target} SMTG_PLUGIN_PACKAGE_PATH)
128
129            if(macOS)
130                add_custom_command(TARGET ${app-extension-target}
131                    COMMENT "Copy VST3 plugin into App-Extension"
132                    POST_BUILD
133                    COMMAND rm -Rf
134                        "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>/$<TARGET_FILE_NAME:${app-extension-target}>.appex/Contents/PlugIns/plugin.vst3"
135                    COMMAND ${CMAKE_COMMAND} -E make_directory
136                        "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>/$<TARGET_FILE_NAME:${app-extension-target}>.appex/Contents/PlugIns/plugin.vst3"
137                    COMMAND /bin/cp -a -v
138                        "${PLUGIN_PACKAGE_PATH}/"
139                        "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>/$<TARGET_FILE_NAME:${app-extension-target}>.appex/Contents/PlugIns/plugin.vst3/"
140                )
141
142                add_custom_command(TARGET ${app-target}
143                    COMMENT "Copy App-Extension into Application"
144                    POST_BUILD
145                    COMMAND rm -Rf
146                        "$<TARGET_BUNDLE_CONTENT_DIR:${app-target}>/PlugIns/auv3.appex"
147                    COMMAND ${CMAKE_COMMAND} -E make_directory
148                        "$<TARGET_BUNDLE_CONTENT_DIR:${app-target}>/PlugIns/auv3.appex"
149                    COMMAND /bin/cp -a -v
150                        "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>/$<TARGET_FILE_NAME:${app-extension-target}>.appex/"
151                        "$<TARGET_BUNDLE_CONTENT_DIR:${app-target}>/PlugIns/auv3.appex/"
152                )
153                smtg_codesign_target(${app-target} ${SMTG_IOS_DEVELOPMENT_TEAM} "${SMTG_CODE_SIGN_IDENTITY_MAC}")
154                smtg_codesign_target(${app-extension-target} ${SMTG_IOS_DEVELOPMENT_TEAM} "${SMTG_CODE_SIGN_IDENTITY_MAC}")
155                set_target_properties(${app-extension-target} PROPERTIES
156                    XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${EntitlementFile}"
157                )
158            else()
159                add_custom_command(TARGET ${app-extension-target}
160                    COMMENT "Copy VST3 plugin into App-Extension"
161                    POST_BUILD
162                    COMMAND rm -Rf
163                        "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>/$<TARGET_FILE_NAME:${app-extension-target}>.appex/PlugIns/plugin.vst3"
164                    COMMAND ${CMAKE_COMMAND} -E make_directory
165                        "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>/$<TARGET_FILE_NAME:${app-extension-target}>.appex/PlugIns/plugin.vst3"
166                    COMMAND /bin/cp -a -v
167                        "${PLUGIN_PACKAGE_PATH}/"
168                        "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>/$<TARGET_FILE_NAME:${app-extension-target}>.appex/PlugIns/plugin.vst3/"
169                )
170                add_custom_command(TARGET ${app-target}
171                    COMMENT "Copy App-Extension into Application"
172                    POST_BUILD
173                    COMMAND rm -Rf
174                        "$<TARGET_BUNDLE_DIR:${app-target}>/PlugIns/auv3.appex"
175                    COMMAND ${CMAKE_COMMAND} -E make_directory
176                        "$<TARGET_BUNDLE_DIR:${app-target}>/PlugIns/auv3.appex"
177                    COMMAND /bin/cp -a -v
178                        "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>/$<TARGET_FILE_NAME:${app-extension-target}>.appex/"
179                        "$<TARGET_BUNDLE_DIR:${app-target}>/PlugIns/auv3.appex/"
180                )
181
182                smtg_set_platform_ios(${app-target})
183                smtg_set_platform_ios(${app-extension-target})
184                smtg_codesign_target(${app-target} ${SMTG_IOS_DEVELOPMENT_TEAM} "${SMTG_IOS_DEVELOPMENT_TEAM}")
185                smtg_codesign_target(${app-extension-target} ${SMTG_IOS_DEVELOPMENT_TEAM} "${SMTG_IOS_DEVELOPMENT_TEAM}")
186
187                set_target_properties(${app-target} PROPERTIES
188                    XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
189                )
190                set_target_properties(${app-extension-target} PROPERTIES
191                    XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${EntitlementFile}"
192                    XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
193                )
194            endif()
195
196            set(AUV3_APP_TARGET ${app-target} PARENT_SCOPE)
197            set(AUV3_EXTENSION_TARGET ${app-extension-target} PARENT_SCOPE)
198
199        endfunction()
200
201    endif()
202endif()