| @@ -59,3 +59,6 @@ profile | |||
| **/doxygen/build | |||
| **/.idea | |||
| extras/Projucer/JUCECompileEngine.dylib | |||
| .idea | |||
| **/cmake-build* | |||
| @@ -0,0 +1,103 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| cmake_minimum_required(VERSION 3.12) | |||
| project(JUCE VERSION 6.0.0 LANGUAGES C CXX) | |||
| set_property(GLOBAL PROPERTY USE_FOLDERS YES) | |||
| include(extras/Build/CMake/JUCEUtils.cmake) | |||
| set_directory_properties(PROPERTIES | |||
| JUCE_COMPANY_NAME "JUCE" | |||
| JUCE_COMPANY_WEBSITE "juce.com" | |||
| JUCE_COMPANY_EMAIL "info@juce.com" | |||
| JUCE_COMPANY_COPYRIGHT "Copyright (c) 2020 - ROLI Ltd.") | |||
| option(JUCE_COPY_PLUGIN_AFTER_BUILD | |||
| "Whether or not plugins should be installed to the system after building" OFF) | |||
| set_property(GLOBAL PROPERTY JUCE_COPY_PLUGIN_AFTER_BUILD ${JUCE_COPY_PLUGIN_AFTER_BUILD}) | |||
| set(CMAKE_CXX_EXTENSIONS FALSE) | |||
| add_subdirectory(modules) | |||
| add_subdirectory(extras/Build) | |||
| # If you want to build the JUCE examples with VST2/AAX support, you'll need to make the VST2/AAX | |||
| # headers visible to the juce_audio_processors module. You can either set the paths on the command | |||
| # line, (e.g. -DJUCE_GLOBAL_AAX_SDK_PATH=/path/to/sdk) if you're just building the JUCE examples, or | |||
| # you can call the `juce_set_*_sdk_path` functions in your own CMakeLists after importing JUCE. | |||
| if(JUCE_GLOBAL_AAX_SDK_PATH) | |||
| juce_set_aax_sdk_path("${JUCE_GLOBAL_AAX_SDK_PATH}") | |||
| endif() | |||
| if(JUCE_GLOBAL_VST2_SDK_PATH) | |||
| juce_set_vst2_sdk_path("${JUCE_GLOBAL_VST2_SDK_PATH}") | |||
| endif() | |||
| # We don't build anything other than the juceaide by default, because we want to keep configuration | |||
| # speedy and the number of targets low. If you want to add targets for the extra projects and | |||
| # example PIPs (there's a lot of them!), specify -DJUCE_BUILD_EXAMPLES=ON and/or | |||
| # -DJUCE_BUILD_EXTRAS=ON when initially generating your build tree. | |||
| option(JUCE_BUILD_EXTRAS "Add build targets for the Projucer and other tools" OFF) | |||
| if(JUCE_BUILD_EXTRAS) | |||
| add_subdirectory(extras) | |||
| endif() | |||
| option(JUCE_BUILD_EXAMPLES "Add build targets for the DemoRunner and PIPs" OFF) | |||
| if(JUCE_BUILD_EXAMPLES) | |||
| add_subdirectory(examples) | |||
| endif() | |||
| # ================================================================================================== | |||
| # Install configuration | |||
| include(CMakePackageConfigHelpers) | |||
| write_basic_package_version_file("${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake" | |||
| VERSION ${JUCE_VERSION} | |||
| COMPATIBILITY ExactVersion | |||
| ARCH_INDEPENDENT) | |||
| set(JUCE_INSTALL_DESTINATION "lib/cmake/JUCE-${JUCE_VERSION}" CACHE STRING | |||
| "The location, relative to the install prefix, where the JUCE config file will be installed") | |||
| install(EXPORT JUCE NAMESPACE juce:: DESTINATION "${JUCE_INSTALL_DESTINATION}") | |||
| configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in" | |||
| "${JUCE_BINARY_DIR}/JUCEConfig.cmake" | |||
| INSTALL_DESTINATION "${JUCE_INSTALL_DESTINATION}") | |||
| install(FILES "${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake" | |||
| "${JUCE_BINARY_DIR}/JUCEConfig.cmake" | |||
| "${JUCE_CMAKE_UTILS_DIR}/LaunchScreen.storyboard" | |||
| "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessor.cpp.in" | |||
| "${JUCE_CMAKE_UTILS_DIR}/PIPComponent.cpp.in" | |||
| "${JUCE_CMAKE_UTILS_DIR}/PIPConsole.cpp.in" | |||
| "${JUCE_CMAKE_UTILS_DIR}/RecentFilesMenuTemplate.nib" | |||
| "${JUCE_CMAKE_UTILS_DIR}/UnityPluginGUIScript.cs.in" | |||
| "${JUCE_CMAKE_UTILS_DIR}/copyDir.cmake" | |||
| "${JUCE_CMAKE_UTILS_DIR}/JUCEUtils.cmake" | |||
| DESTINATION "${JUCE_INSTALL_DESTINATION}") | |||
| install(FILES "${JUCE_SOURCE_DIR}/LICENSE.md" | |||
| DESTINATION "${JUCE_INSTALL_DESTINATION}" | |||
| RENAME COPYRIGHT) | |||
| @@ -58,6 +58,8 @@ inline File getExamplesDirectory() noexcept | |||
| jassert (success); | |||
| return mo.toString(); | |||
| #elif defined PIP_JUCE_EXAMPLES_DIRECTORY_STRING | |||
| return File { PIP_JUCE_EXAMPLES_DIRECTORY_STRING }; | |||
| #else | |||
| auto currentFile = File::getSpecialLocation (File::SpecialLocationType::currentApplicationFile); | |||
| auto exampleDir = currentFile.getParentDirectory().getChildFile ("examples"); | |||
| @@ -0,0 +1,17 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| _juce_add_pips() | |||
| @@ -0,0 +1,17 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| _juce_add_pips() | |||
| @@ -0,0 +1,104 @@ | |||
| # Example Audio Plugin CMakeLists.txt | |||
| # To get started on a new plugin, copy this entire folder (containing this file and C++ sources) to | |||
| # a convenient location, and then start making modifications. | |||
| # The first line of any CMake project should be a call to `cmake_minimum_required`, which checks | |||
| # that the installed CMake will be able to understand the following CMakeLists, and ensures that | |||
| # CMake's behaviour is compatible with the named version. This is a standard CMake command, so more | |||
| # information can be found in the CMake docs. | |||
| cmake_minimum_required(VERSION 3.15) | |||
| # The top-level CMakeLists.txt file for a project must contain a literal, direct call to the | |||
| # `project()` command. `project()` sets up some helpful variables that describe source/binary | |||
| # directories, and the current project version. This is a standard CMake command. | |||
| project(AUDIO_PLUGIN_EXAMPLE VERSION 0.0.1) | |||
| # If you've installed JUCE somehow (via a package manager, or directly using the CMake install | |||
| # target), you'll need to tell this project that it depends on the installed copy of JUCE. If you've | |||
| # included JUCE directly in your source tree (perhaps as a submodule), you'll need to tell CMake to | |||
| # include that subdirectory as part of the build. | |||
| # find_package(JUCE CONFIG REQUIRED) # If you've installed JUCE to your system | |||
| # or | |||
| # add_subdirectory(JUCE) # If you've put JUCE in a subdirectory called JUCE | |||
| # If you are building a VST2 or AAX plugin, CMake needs to be told where to find these SDKs on your | |||
| # system. This setup should be done before calling `juce_add_plugin`. | |||
| # juce_set_vst2_sdk_path(...) | |||
| # juce_set_aax_sdk_path(...) | |||
| # `juce_add_plugin` adds a static library target with the name passed as the first argument | |||
| # (AudioPluginExample here). This target is a normal CMake target, but has a lot of extra properties set | |||
| # up by default. As well as this shared code static library, this function adds targets for each of | |||
| # the formats specified by the FORMATS arguments. This function accepts many optional arguments. | |||
| # Check the readme at `examples/CMake` in the JUCE repo for the full list. | |||
| juce_add_plugin(AudioPluginExample | |||
| # VERSION ... # Set this if the plugin version is different to the project version | |||
| # ICON_BIG ... # ICON_* arguments specify a path to an image file to use as an icon for the Standalone | |||
| # ICON_SMALL ... | |||
| # COMPANY_NAME ... # Specify the name of the plugin's author | |||
| # IS_SYNTH TRUE/FALSE # Is this a synth or an effect? | |||
| # NEEDS_MIDI_INPUT TRUE/FALSE # Does the plugin need midi input? | |||
| # NEEDS_MIDI_OUTPUT TRUE/FALSE # Does the plugin need midi output? | |||
| # IS_MIDI_EFFECT TRUE/FALSE # Is this plugin a MIDI effect? | |||
| # EDITOR_WANTS_KEYBOARD_FOCUS TRUE/FALSE # Does the editor need keyboard focus? | |||
| # COPY_PLUGIN_AFTER_BUILD TRUE/FALSE # Should the plugin be installed to a default location after building? | |||
| PLUGIN_MANUFACTURER_CODE Juce # A four-character manufacturer id with at least one upper-case character | |||
| PLUGIN_CODE Dem0 # A unique four-character plugin id with at least one upper-case character | |||
| FORMATS AU VST3 Standalone # The formats to build. Other valid formats are: AAX Unity VST AU AUv3 | |||
| PRODUCT_NAME "Audio Plugin Example") # The name of the final executable, which can differ from the target name | |||
| # `juce_generate_juce_header` will create a JuceHeader.h for a given target, which will be generated | |||
| # into your build tree. This should be included with `#include <JuceHeader.h>`. The include path for | |||
| # this header will be automatically added to the target. The main function of the JuceHeader is to | |||
| # include all your JUCE module headers; if you're happy to include module headers directly, you | |||
| # probably don't need to call this. | |||
| # juce_generate_juce_header(AudioPluginExample) | |||
| # `target_sources` adds source files to a target. We pass the target that needs the sources as the | |||
| # first argument, then a visibility parameter for the sources (PRIVATE is normally best practice, | |||
| # although it doesn't really affect executable targets). Finally, we supply a list of source files | |||
| # that will be built into the target. This is a standard CMake command. | |||
| target_sources(AudioPluginExample PRIVATE | |||
| PluginEditor.cpp | |||
| PluginProcessor.cpp) | |||
| # `target_compile_definitions` adds some preprocessor definitions to our target. In a Projucer | |||
| # project, these might be passed in the 'Preprocessor Definitions' field. JUCE modules also make use | |||
| # of compile definitions to switch certain features on/off, so if there's a particular feature you | |||
| # need that's not on by default, check the module header for the correct flag to set here. These | |||
| # definitions will be visible both to your code, and also the JUCE module code, so for new | |||
| # definitions, pick unique names that are unlikely to collide! This is a standard CMake command. | |||
| target_compile_definitions(AudioPluginExample | |||
| PUBLIC | |||
| # JUCE_WEB_BROWSER and JUCE_USE_CURL would be on by default, but you might not need them. | |||
| JUCE_WEB_BROWSER=0 # If you remove this, add `NEEDS_WEB_BROWSER TRUE` to the `juce_add_plugin` call | |||
| JUCE_USE_CURL=0 # If you remove this, add `NEEDS_CURL TRUE` to the `juce_add_plugin` call | |||
| JUCE_VST3_CAN_REPLACE_VST2=0) | |||
| # If your target needs extra binary assets, you can add them here. The first argument is the name of | |||
| # a new static library target that will include all the binary resources. There is an optional | |||
| # `NAMESPACE` argument that can specify the namespace of the generated binary data class. Finally, | |||
| # the SOURCES argument should be followed by a list of source files that should be built into the | |||
| # static library. These source files can be of any kind (wav data, images, fonts, icons etc.). | |||
| # Conversion to binary-data will happen when your target is built. | |||
| # juce_add_binary_data(AudioPluginData SOURCES ...) | |||
| # `target_link_libraries` links libraries and JUCE modules to other libraries or executables. Here, | |||
| # we're linking our executable target to the `juce::juce_audio_utils` module. Inter-module | |||
| # dependencies are resolved automatically, so `juce_core`, `juce_events` and so on will also be | |||
| # linked automatically. If we'd generated a binary data target above, we would need to link to it | |||
| # here too. This is a standard CMake command. | |||
| target_link_libraries(AudioPluginExample PRIVATE | |||
| # AudioPluginData # If we'd created a binary data target, we'd link to it here | |||
| juce::juce_audio_utils) | |||
| @@ -0,0 +1,33 @@ | |||
| #include "PluginProcessor.h" | |||
| #include "PluginEditor.h" | |||
| //============================================================================== | |||
| AudioPluginAudioProcessorEditor::AudioPluginAudioProcessorEditor (AudioPluginAudioProcessor& p) | |||
| : AudioProcessorEditor (&p), processorRef (p) | |||
| { | |||
| juce::ignoreUnused (processorRef); | |||
| // Make sure that before the constructor has finished, you've set the | |||
| // editor's size to whatever you need it to be. | |||
| setSize (400, 300); | |||
| } | |||
| AudioPluginAudioProcessorEditor::~AudioPluginAudioProcessorEditor() | |||
| { | |||
| } | |||
| //============================================================================== | |||
| void AudioPluginAudioProcessorEditor::paint (juce::Graphics& g) | |||
| { | |||
| // (Our component is opaque, so we must completely fill the background with a solid colour) | |||
| g.fillAll (getLookAndFeel().findColour (juce::ResizableWindow::backgroundColourId)); | |||
| g.setColour (juce::Colours::white); | |||
| g.setFont (15.0f); | |||
| g.drawFittedText ("Hello World!", getLocalBounds(), juce::Justification::centred, 1); | |||
| } | |||
| void AudioPluginAudioProcessorEditor::resized() | |||
| { | |||
| // This is generally where you'll want to lay out the positions of any | |||
| // subcomponents in your editor.. | |||
| } | |||
| @@ -0,0 +1,22 @@ | |||
| #pragma once | |||
| #include "PluginProcessor.h" | |||
| //============================================================================== | |||
| class AudioPluginAudioProcessorEditor : public juce::AudioProcessorEditor | |||
| { | |||
| public: | |||
| explicit AudioPluginAudioProcessorEditor (AudioPluginAudioProcessor&); | |||
| ~AudioPluginAudioProcessorEditor() override; | |||
| //============================================================================== | |||
| void paint (juce::Graphics&) override; | |||
| void resized() override; | |||
| private: | |||
| // This reference is provided as a quick way for your editor to | |||
| // access the processor object that created it. | |||
| AudioPluginAudioProcessor& processorRef; | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioPluginAudioProcessorEditor) | |||
| }; | |||
| @@ -0,0 +1,186 @@ | |||
| #include "PluginProcessor.h" | |||
| #include "PluginEditor.h" | |||
| //============================================================================== | |||
| AudioPluginAudioProcessor::AudioPluginAudioProcessor() | |||
| : AudioProcessor (BusesProperties() | |||
| #if ! JucePlugin_IsMidiEffect | |||
| #if ! JucePlugin_IsSynth | |||
| .withInput ("Input", juce::AudioChannelSet::stereo(), true) | |||
| #endif | |||
| .withOutput ("Output", juce::AudioChannelSet::stereo(), true) | |||
| #endif | |||
| ) | |||
| { | |||
| } | |||
| AudioPluginAudioProcessor::~AudioPluginAudioProcessor() | |||
| { | |||
| } | |||
| //============================================================================== | |||
| const juce::String AudioPluginAudioProcessor::getName() const | |||
| { | |||
| return JucePlugin_Name; | |||
| } | |||
| bool AudioPluginAudioProcessor::acceptsMidi() const | |||
| { | |||
| #if JucePlugin_WantsMidiInput | |||
| return true; | |||
| #else | |||
| return false; | |||
| #endif | |||
| } | |||
| bool AudioPluginAudioProcessor::producesMidi() const | |||
| { | |||
| #if JucePlugin_ProducesMidiOutput | |||
| return true; | |||
| #else | |||
| return false; | |||
| #endif | |||
| } | |||
| bool AudioPluginAudioProcessor::isMidiEffect() const | |||
| { | |||
| #if JucePlugin_IsMidiEffect | |||
| return true; | |||
| #else | |||
| return false; | |||
| #endif | |||
| } | |||
| double AudioPluginAudioProcessor::getTailLengthSeconds() const | |||
| { | |||
| return 0.0; | |||
| } | |||
| int AudioPluginAudioProcessor::getNumPrograms() | |||
| { | |||
| return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, | |||
| // so this should be at least 1, even if you're not really implementing programs. | |||
| } | |||
| int AudioPluginAudioProcessor::getCurrentProgram() | |||
| { | |||
| return 0; | |||
| } | |||
| void AudioPluginAudioProcessor::setCurrentProgram (int index) | |||
| { | |||
| juce::ignoreUnused (index); | |||
| } | |||
| const juce::String AudioPluginAudioProcessor::getProgramName (int index) | |||
| { | |||
| juce::ignoreUnused (index); | |||
| return {}; | |||
| } | |||
| void AudioPluginAudioProcessor::changeProgramName (int index, const juce::String& newName) | |||
| { | |||
| juce::ignoreUnused (index, newName); | |||
| } | |||
| //============================================================================== | |||
| void AudioPluginAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) | |||
| { | |||
| // Use this method as the place to do any pre-playback | |||
| // initialisation that you need.. | |||
| juce::ignoreUnused (sampleRate, samplesPerBlock); | |||
| } | |||
| void AudioPluginAudioProcessor::releaseResources() | |||
| { | |||
| // When playback stops, you can use this as an opportunity to free up any | |||
| // spare memory, etc. | |||
| } | |||
| bool AudioPluginAudioProcessor::isBusesLayoutSupported (const BusesLayout& layouts) const | |||
| { | |||
| #if JucePlugin_IsMidiEffect | |||
| juce::ignoreUnused (layouts); | |||
| return true; | |||
| #else | |||
| // This is the place where you check if the layout is supported. | |||
| // In this template code we only support mono or stereo. | |||
| if (layouts.getMainOutputChannelSet() != juce::AudioChannelSet::mono() | |||
| && layouts.getMainOutputChannelSet() != juce::AudioChannelSet::stereo()) | |||
| return false; | |||
| // This checks if the input layout matches the output layout | |||
| #if ! JucePlugin_IsSynth | |||
| if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet()) | |||
| return false; | |||
| #endif | |||
| return true; | |||
| #endif | |||
| } | |||
| void AudioPluginAudioProcessor::processBlock (juce::AudioBuffer<float>& buffer, | |||
| juce::MidiBuffer& midiMessages) | |||
| { | |||
| juce::ignoreUnused (midiMessages); | |||
| juce::ScopedNoDenormals noDenormals; | |||
| auto totalNumInputChannels = getTotalNumInputChannels(); | |||
| auto totalNumOutputChannels = getTotalNumOutputChannels(); | |||
| // In case we have more outputs than inputs, this code clears any output | |||
| // channels that didn't contain input data, (because these aren't | |||
| // guaranteed to be empty - they may contain garbage). | |||
| // This is here to avoid people getting screaming feedback | |||
| // when they first compile a plugin, but obviously you don't need to keep | |||
| // this code if your algorithm always overwrites all the output channels. | |||
| for (auto i = totalNumInputChannels; i < totalNumOutputChannels; ++i) | |||
| buffer.clear (i, 0, buffer.getNumSamples()); | |||
| // This is the place where you'd normally do the guts of your plugin's | |||
| // audio processing... | |||
| // Make sure to reset the state if your inner loop is processing | |||
| // the samples and the outer loop is handling the channels. | |||
| // Alternatively, you can process the samples with the channels | |||
| // interleaved by keeping the same state. | |||
| for (int channel = 0; channel < totalNumInputChannels; ++channel) | |||
| { | |||
| auto* channelData = buffer.getWritePointer (channel); | |||
| juce::ignoreUnused (channelData); | |||
| // ..do something to the data... | |||
| } | |||
| } | |||
| //============================================================================== | |||
| bool AudioPluginAudioProcessor::hasEditor() const | |||
| { | |||
| return true; // (change this to false if you choose to not supply an editor) | |||
| } | |||
| juce::AudioProcessorEditor* AudioPluginAudioProcessor::createEditor() | |||
| { | |||
| return new AudioPluginAudioProcessorEditor (*this); | |||
| } | |||
| //============================================================================== | |||
| void AudioPluginAudioProcessor::getStateInformation (juce::MemoryBlock& destData) | |||
| { | |||
| // You should use this method to store your parameters in the memory block. | |||
| // You could do that either as raw data, or use the XML or ValueTree classes | |||
| // as intermediaries to make it easy to save and load complex data. | |||
| juce::ignoreUnused (destData); | |||
| } | |||
| void AudioPluginAudioProcessor::setStateInformation (const void* data, int sizeInBytes) | |||
| { | |||
| // You should use this method to restore your parameters from this memory block, | |||
| // whose contents will have been created by the getStateInformation() call. | |||
| juce::ignoreUnused (data, sizeInBytes); | |||
| } | |||
| //============================================================================== | |||
| // This creates new instances of the plugin.. | |||
| juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() | |||
| { | |||
| return new AudioPluginAudioProcessor(); | |||
| } | |||
| @@ -0,0 +1,47 @@ | |||
| #pragma once | |||
| #include <juce_audio_processors/juce_audio_processors.h> | |||
| //============================================================================== | |||
| class AudioPluginAudioProcessor : public juce::AudioProcessor | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| AudioPluginAudioProcessor(); | |||
| ~AudioPluginAudioProcessor() override; | |||
| //============================================================================== | |||
| void prepareToPlay (double sampleRate, int samplesPerBlock) override; | |||
| void releaseResources() override; | |||
| bool isBusesLayoutSupported (const BusesLayout& layouts) const override; | |||
| void processBlock (juce::AudioBuffer<float>&, juce::MidiBuffer&) override; | |||
| //============================================================================== | |||
| juce::AudioProcessorEditor* createEditor() override; | |||
| bool hasEditor() const override; | |||
| //============================================================================== | |||
| const juce::String getName() const override; | |||
| bool acceptsMidi() const override; | |||
| bool producesMidi() const override; | |||
| bool isMidiEffect() const override; | |||
| double getTailLengthSeconds() const override; | |||
| //============================================================================== | |||
| int getNumPrograms() override; | |||
| int getCurrentProgram() override; | |||
| void setCurrentProgram (int index) override; | |||
| const juce::String getProgramName (int index) override; | |||
| void changeProgramName (int index, const juce::String& newName) override; | |||
| //============================================================================== | |||
| void getStateInformation (juce::MemoryBlock& destData) override; | |||
| void setStateInformation (const void* data, int sizeInBytes) override; | |||
| private: | |||
| //============================================================================== | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioPluginAudioProcessor) | |||
| }; | |||
| @@ -0,0 +1,19 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| add_subdirectory(AudioPlugin) | |||
| add_subdirectory(ConsoleApp) | |||
| add_subdirectory(GuiApp) | |||
| @@ -0,0 +1,82 @@ | |||
| # Example Console App CMakeLists.txt | |||
| # To get started on a new console app, copy this entire folder (containing this file and C++ | |||
| # sources) to a convenient location, and then start making modifications. For other examples of | |||
| # CMakeLists for console apps, check `extras/BinaryBuilder` and `extras/UnitTestRunner` in the JUCE | |||
| # repo. | |||
| # The first line of any CMake project should be a call to `cmake_minimum_required`, which checks | |||
| # that the installed CMake will be able to understand the following CMakeLists, and ensures that | |||
| # CMake's behaviour is compatible with the named version. This is a standard CMake command, so more | |||
| # information can be found in the CMake docs. | |||
| cmake_minimum_required(VERSION 3.12) | |||
| # The top-level CMakeLists.txt file for a project must contain a literal, direct call to the | |||
| # `project()` command. `project()` sets up some helpful variables that describe source/binary | |||
| # directories, and the current project version. This is a standard CMake command. | |||
| project(CONSOLE_APP_EXAMPLE VERSION 0.0.1) | |||
| # If you've installed JUCE somehow (via a package manager, or directly using the CMake install | |||
| # target), you'll need to tell this project that it depends on the installed copy of JUCE. If you've | |||
| # included JUCE directly in your source tree (perhaps as a submodule), you'll need to tell CMake to | |||
| # include that subdirectory as part of the build. | |||
| # find_package(JUCE CONFIG REQUIRED) # If you've installed JUCE to your system | |||
| # or | |||
| # add_subdirectory(JUCE) # If you've put JUCE in a subdirectory called JUCE | |||
| # `juce_add_console_app` adds an executable target with the name passed as the first argument | |||
| # (ConsoleAppExample here). This target is a normal CMake target, but has a lot of extra properties | |||
| # set up by default. This function accepts many optional arguments. Check the readme at | |||
| # `examples/CMake/readme.md` in the JUCE repo for the full list. | |||
| juce_add_console_app(ConsoleAppExample | |||
| PRODUCT_NAME "Console App Example") # The name of the final executable, which can differ from the target name | |||
| # `juce_generate_juce_header` will create a JuceHeader.h for a given target, which will be generated | |||
| # into the build tree. This header should be included with `#include <JuceHeader.h>`. The include | |||
| # path for this header will be automatically added to the target. The main function of the | |||
| # JuceHeader is to include all the JUCE module headers for a particular target; if you're happy to | |||
| # include module headers directly, you probably don't need to call this. | |||
| # juce_generate_juce_header(ConsoleAppExample) | |||
| # `target_sources` adds source files to a target. We pass the target that needs the sources as the | |||
| # first argument, then a visibility parameter for the sources (PRIVATE is normally best practice, | |||
| # although it doesn't really affect executable targets). Finally, we supply a list of source files | |||
| # that will be built into the target. This is a standard CMake command. | |||
| target_sources(ConsoleAppExample PRIVATE | |||
| Main.cpp) | |||
| # `target_compile_definitions` adds some preprocessor definitions to our target. In a Projucer | |||
| # project, these might be passed in the 'Preprocessor Definitions' field. JUCE modules also make use | |||
| # of compile definitions to switch certain features on/off, so if there's a particular feature you | |||
| # need that's not on by default, check the module header for the correct flag to set here. These | |||
| # definitions will be visible both to your code, and also the JUCE module code, so for new | |||
| # definitions, pick unique names that are unlikely to collide! This is a standard CMake command. | |||
| target_compile_definitions(ConsoleAppExample PRIVATE | |||
| # JUCE_WEB_BROWSER and JUCE_USE_CURL would be on by default, but you might not need them. | |||
| JUCE_WEB_BROWSER=0 # If you remove this, add `NEEDS_WEB_BROWSER TRUE` to the `juce_add_console_app` call | |||
| JUCE_USE_CURL=0) # If you remove this, add `NEEDS_CURL TRUE` to the `juce_add_console_app` call | |||
| # If the target needs extra binary assets, they can be added here. The first argument is the name of | |||
| # a new static library target that will include all the binary resources. There is an optional | |||
| # `NAMESPACE` argument that can specify the namespace of the generated binary data class. Finally, | |||
| # the SOURCES argument should be followed by a list of source files that should be built into the | |||
| # static library. These source files can be of any kind (wav data, images, fonts, icons etc.). | |||
| # Conversion to binary-data will happen when the target is built. | |||
| # juce_add_binary_data(ConsoleAppData SOURCES ...) | |||
| # `target_link_libraries` links libraries and JUCE modules to other libraries or executables. Here, | |||
| # we're linking our executable target to the `juce::juce_core` module. Inter-module dependencies are | |||
| # resolved automatically. If you'd generated a binary data target above, you would need to link to | |||
| # it here too. This is a standard CMake command. | |||
| target_link_libraries(ConsoleAppExample PRIVATE | |||
| # ConsoleAppData # If you'd created a binary data target, you'd link to it here | |||
| juce::juce_core) | |||
| @@ -0,0 +1,10 @@ | |||
| #include <juce_core/juce_core.h> | |||
| int main (int argc, char* argv[]) | |||
| { | |||
| // Your code goes here! | |||
| juce::ignoreUnused (argc, argv); | |||
| return 0; | |||
| } | |||
| @@ -0,0 +1,95 @@ | |||
| # Example GUI App CMakeLists.txt | |||
| # To get started on a new GUI app, copy this entire folder (containing this file and C++ sources) to | |||
| # a convenient location, and then start making modifications. For other examples of CMakeLists for | |||
| # GUI apps, check `extras/Projucer` and `examples/DemoRunner` in the JUCE repo. | |||
| # The first line of any CMake project should be a call to `cmake_minimum_required`, which checks | |||
| # that the installed CMake will be able to understand the following CMakeLists, and ensures that | |||
| # CMake's behaviour is compatible with the named version. This is a standard CMake command, so more | |||
| # information can be found in the CMake docs. | |||
| cmake_minimum_required(VERSION 3.12) | |||
| # The top-level CMakeLists.txt file for a project must contain a literal, direct call to the | |||
| # `project()` command. `project()` sets up some helpful variables that describe source/binary | |||
| # directories, and the current project version. This is a standard CMake command. | |||
| project(GUI_APP_EXAMPLE VERSION 0.0.1) | |||
| # If you've installed JUCE somehow (via a package manager, or directly using the CMake install | |||
| # target), you'll need to tell this project that it depends on the installed copy of JUCE. If you've | |||
| # included JUCE directly in your source tree (perhaps as a submodule), you'll need to tell CMake to | |||
| # include that subdirectory as part of the build. | |||
| # find_package(JUCE CONFIG REQUIRED) # If you've installed JUCE to your system | |||
| # or | |||
| # add_subdirectory(JUCE) # If you've put JUCE in a subdirectory called JUCE | |||
| # If your app depends the VST2 SDK, perhaps to host VST2 plugins, CMake needs to be told where | |||
| # to find the SDK on your system. This setup should be done before calling `juce_add_gui_app`. | |||
| # juce_set_vst2_sdk_path(...) | |||
| # `juce_add_gui_app` adds an executable target with the name passed as the first argument | |||
| # (GuiAppExample here). This target is a normal CMake target, but has a lot of extra properties set | |||
| # up by default. This function accepts many optional arguments. Check the readme at `examples/CMake` | |||
| # in the JUCE repo for the full list. | |||
| juce_add_gui_app(GuiAppExample | |||
| # VERSION ... # Set this if the app version is different to the project version | |||
| # ICON_BIG ... # ICON_* arguments specify a path to an image file to use as an icon | |||
| # ICON_SMALL ... | |||
| # DOCUMENT_EXTENSIONS ... # Specify file extensions that should be associated with this app | |||
| # COMPANY_NAME ... # Specify the name of the app's author | |||
| PRODUCT_NAME "Gui App Example") # The name of the final executable, which can differ from the target name | |||
| # `juce_generate_juce_header` will create a JuceHeader.h for a given target, which will be generated | |||
| # into your build tree. This should be included with `#include <JuceHeader.h>`. The include path for | |||
| # this header will be automatically added to the target. The main function of the JuceHeader is to | |||
| # include all your JUCE module headers; if you're happy to include module headers directly, you | |||
| # probably don't need to call this. | |||
| # juce_generate_juce_header(GuiAppExample) | |||
| # `target_sources` adds source files to a target. We pass the target that needs the sources as the | |||
| # first argument, then a visibility parameter for the sources (PRIVATE is normally best practice, | |||
| # although it doesn't really affect executable targets). Finally, we supply a list of source files | |||
| # that will be built into the target. This is a standard CMake command. | |||
| target_sources(GuiAppExample PRIVATE | |||
| Main.cpp | |||
| MainComponent.cpp) | |||
| # `target_compile_definitions` adds some preprocessor definitions to our target. In a Projucer | |||
| # project, these might be passed in the 'Preprocessor Definitions' field. JUCE modules also make use | |||
| # of compile definitions to switch certain features on/off, so if there's a particular feature you | |||
| # need that's not on by default, check the module header for the correct flag to set here. These | |||
| # definitions will be visible both to your code, and also the JUCE module code, so for new | |||
| # definitions, pick unique names that are unlikely to collide! This is a standard CMake command. | |||
| target_compile_definitions(GuiAppExample PRIVATE | |||
| # JUCE_WEB_BROWSER and JUCE_USE_CURL would be on by default, but you might not need them. | |||
| JUCE_WEB_BROWSER=0 # If you remove this, add `NEEDS_WEB_BROWSER TRUE` to the `juce_add_gui_app` call | |||
| JUCE_USE_CURL=0 # If you remove this, add `NEEDS_CURL TRUE` to the `juce_add_gui_app` call | |||
| JUCE_APPLICATION_NAME_STRING="$<TARGET_PROPERTY:GuiAppExample,JUCE_PROJECT_NAME>" | |||
| JUCE_APPLICATION_VERSION_STRING="$<TARGET_PROPERTY:GuiAppExample,JUCE_VERSION>") | |||
| # If your target needs extra binary assets, you can add them here. The first argument is the name of | |||
| # a new static library target that will include all the binary resources. There is an optional | |||
| # `NAMESPACE` argument that can specify the namespace of the generated binary data class. Finally, | |||
| # the SOURCES argument should be followed by a list of source files that should be built into the | |||
| # static library. These source files can be of any kind (wav data, images, fonts, icons etc.). | |||
| # Conversion to binary-data will happen when your target is built. | |||
| # juce_add_binary_data(GuiAppData SOURCES ...) | |||
| # `target_link_libraries` links libraries and JUCE modules to other libraries or executables. Here, | |||
| # we're linking our executable target to the `juce::juce_gui_extra` module. Inter-module | |||
| # dependencies are resolved automatically, so `juce_core`, `juce_events` and so on will also be | |||
| # linked automatically. If we'd generated a binary data target above, we would need to link to it | |||
| # here too. This is a standard CMake command. | |||
| target_link_libraries(GuiAppExample PRIVATE | |||
| # GuiAppData # If we'd created a binary data target, we'd link to it here | |||
| juce::juce_gui_extra) | |||
| @@ -0,0 +1,101 @@ | |||
| #include "MainComponent.h" | |||
| //============================================================================== | |||
| class GuiAppApplication : public juce::JUCEApplication | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| GuiAppApplication() {} | |||
| // We inject these as compile definitions from the CMakeLists.txt | |||
| // If you've enabled the juce header with `juce_generate_juce_header(<thisTarget>)` | |||
| // you could `#include <JuceHeader.h>` and use `ProjectInfo::projectName` etc. instead. | |||
| const juce::String getApplicationName() override { return JUCE_APPLICATION_NAME_STRING; } | |||
| const juce::String getApplicationVersion() override { return JUCE_APPLICATION_VERSION_STRING; } | |||
| bool moreThanOneInstanceAllowed() override { return true; } | |||
| //============================================================================== | |||
| void initialise (const juce::String& commandLine) override | |||
| { | |||
| // This method is where you should put your application's initialisation code.. | |||
| juce::ignoreUnused (commandLine); | |||
| mainWindow.reset (new MainWindow (getApplicationName())); | |||
| } | |||
| void shutdown() override | |||
| { | |||
| // Add your application's shutdown code here.. | |||
| mainWindow = nullptr; // (deletes our window) | |||
| } | |||
| //============================================================================== | |||
| void systemRequestedQuit() override | |||
| { | |||
| // This is called when the app is being asked to quit: you can ignore this | |||
| // request and let the app carry on running, or call quit() to allow the app to close. | |||
| quit(); | |||
| } | |||
| void anotherInstanceStarted (const juce::String& commandLine) override | |||
| { | |||
| // When another instance of the app is launched while this one is running, | |||
| // this method is invoked, and the commandLine parameter tells you what | |||
| // the other instance's command-line arguments were. | |||
| juce::ignoreUnused (commandLine); | |||
| } | |||
| //============================================================================== | |||
| /* | |||
| This class implements the desktop window that contains an instance of | |||
| our MainComponent class. | |||
| */ | |||
| class MainWindow : public juce::DocumentWindow | |||
| { | |||
| public: | |||
| explicit MainWindow (juce::String name) | |||
| : DocumentWindow (name, | |||
| juce::Desktop::getInstance().getDefaultLookAndFeel() | |||
| .findColour (ResizableWindow::backgroundColourId), | |||
| DocumentWindow::allButtons) | |||
| { | |||
| setUsingNativeTitleBar (true); | |||
| setContentOwned (new MainComponent(), true); | |||
| #if JUCE_IOS || JUCE_ANDROID | |||
| setFullScreen (true); | |||
| #else | |||
| setResizable (true, true); | |||
| centreWithSize (getWidth(), getHeight()); | |||
| #endif | |||
| setVisible (true); | |||
| } | |||
| void closeButtonPressed() override | |||
| { | |||
| // This is called when the user tries to close this window. Here, we'll just | |||
| // ask the app to quit when this happens, but you can change this to do | |||
| // whatever you need. | |||
| JUCEApplication::getInstance()->systemRequestedQuit(); | |||
| } | |||
| /* Note: Be careful if you override any DocumentWindow methods - the base | |||
| class uses a lot of them, so by overriding you might break its functionality. | |||
| It's best to do all your work in your content component instead, but if | |||
| you really have to override any DocumentWindow methods, make sure your | |||
| subclass also calls the superclass's method. | |||
| */ | |||
| private: | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow) | |||
| }; | |||
| private: | |||
| std::unique_ptr<MainWindow> mainWindow; | |||
| }; | |||
| //============================================================================== | |||
| // This macro generates the main() routine that launches the app. | |||
| START_JUCE_APPLICATION (GuiAppApplication) | |||
| @@ -0,0 +1,25 @@ | |||
| #include "MainComponent.h" | |||
| //============================================================================== | |||
| MainComponent::MainComponent() | |||
| { | |||
| setSize (600, 400); | |||
| } | |||
| //============================================================================== | |||
| void MainComponent::paint (juce::Graphics& g) | |||
| { | |||
| // (Our component is opaque, so we must completely fill the background with a solid colour) | |||
| g.fillAll (getLookAndFeel().findColour (juce::ResizableWindow::backgroundColourId)); | |||
| g.setFont (juce::Font (16.0f)); | |||
| g.setColour (juce::Colours::white); | |||
| g.drawText ("Hello World!", getLocalBounds(), juce::Justification::centred, true); | |||
| } | |||
| void MainComponent::resized() | |||
| { | |||
| // This is called when the MainComponent is resized. | |||
| // If you add any child components, this is where you should | |||
| // update their positions. | |||
| } | |||
| @@ -0,0 +1,29 @@ | |||
| #pragma once | |||
| // CMake builds don't use an AppConfig.h, so it's safe to include juce module headers | |||
| // directly. If you need to remain compatible with Projucer-generated builds, and | |||
| // have called `juce_generate_juce_header(<thisTarget>)` in your CMakeLists.txt, | |||
| // you could `#include <JuceHeader.h>` here instead, to make all your module headers visible. | |||
| #include <juce_gui_extra/juce_gui_extra.h> | |||
| //============================================================================== | |||
| /* | |||
| This component lives inside our window, and this is where you should put all | |||
| your controls and content. | |||
| */ | |||
| class MainComponent : public juce::Component | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| MainComponent(); | |||
| //============================================================================== | |||
| void paint (juce::Graphics&) override; | |||
| void resized() override; | |||
| private: | |||
| //============================================================================== | |||
| // Your private member variables go here... | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent) | |||
| }; | |||
| @@ -0,0 +1,513 @@ | |||
| # CMake Template Projects | |||
| This directory contains project templates which should help you get started using JUCE's CMake | |||
| support. | |||
| ## System Requirements | |||
| - Console and GUI projects require CMake 3.12 or higher. | |||
| - Plugin projects require CMake 3.15 or higher. | |||
| - All iOS targets require CMake 3.14 or higher (3.15 or higher for plugins targeting iOS). | |||
| - Android targets are not currently supported. | |||
| Most system package managers have packages for CMake, but we recommend using the most recent release | |||
| from https://cmake.org/download. You should always use a CMake that's newer than your build | |||
| toolchain, so that CMake can identify your build tools and understand how to invoke them. | |||
| In addition to CMake you'll need a build toolchain for your platform, such as Xcode or MSVC. | |||
| ## Getting Started | |||
| In this directory, you'll find example projects for a GUI app, a console app, and an audio plugin. | |||
| You can simply copy one of these subdirectories out of the JUCE repo, add JUCE as a submodule, and | |||
| uncomment the call to `add_subdirectory` where indicated in the CMakeLists.txt. Alternatively, if | |||
| you've installed JUCE using a package manager or the CMake install target, you can uncomment the | |||
| call to `find_package`. | |||
| Once your project is set up, you can generate a build tree for it in the normal way. To get started, | |||
| you might invoke CMake like this, from the new directory you created. | |||
| ``` | |||
| cmake -Bbuild (-GgeneratorName) (-DJUCE_BUILD_EXTRAS=ON) (-DJUCE_BUILD_EXAMPLES=ON) | |||
| ``` | |||
| This will create a build tree in a directory named 'build', using the CMakeLists in the current | |||
| working directory, using the default generator (makefiles on mac/linux, and the most recent Visual | |||
| Studio on Windows). You can choose a specific generator to use with the `-G` flag (call `cmake -G` | |||
| to see a full list of generators on your platform). If you included JUCE as a subdirectory, you can | |||
| enable the Extras and Examples targets by including the last two arguments (they're off by default). | |||
| There's quite a lot of example projects, and generating project files might take a bit longer when | |||
| these options are on, so you probably won't want to include them most of the time. | |||
| Then, to build the project: | |||
| ``` | |||
| cmake --build build (--target targetNameFromCMakeLists) (--config Release/Debug/...) | |||
| ``` | |||
| This tells cmake to build the target named `targetNameFromCMakeLists`, in the specified | |||
| configuration, using the appropriate tool. Of course, if you generated makefiles or ninja files, you | |||
| could call `make` or `ninja` in the build directory. If you generated an IDE project, like an Xcode | |||
| or Visual Studio project, then you could open the generated project in your IDE. | |||
| ### Building for iOS | |||
| To build for iOS, you'll need CMake 3.14 or higher. Using the Xcode generator is highly recommended, | |||
| as other generators may not automatically find the correct SDK for the iPhone simulator, and may | |||
| fail to run certain parts of the build, such as compiling icons and processing the app's plist. By | |||
| default, CMake will build for the same system that originally configured the project, so to enable | |||
| cross-compilation for iOS, a few extra flags must be passed to the initial CMake invocation: | |||
| ``` | |||
| cmake -Bbuild-ios -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=9.3 | |||
| ``` | |||
| Here we create a build tree in the directory named 'build-ios', using the Xcode generator. The | |||
| `-DCMAKE_SYSTEM_NAME=iOS` option tells CMake to enable cross-compiling for iOS. The | |||
| `-DCMAKE_OSX_DEPLOYMENT_TARGET=9.3` option sets the minimum deployment target (it applies to iOS | |||
| despite the 'OSX' in the variable name!). | |||
| Once the project has generated, we can open it as normal in Xcode (look for the project file in the | |||
| build directory). Alternatively, to build from the command-line, we could run this command: | |||
| ``` | |||
| cmake --build build-ios --target <targetName> -- -sdk iphonesimulator | |||
| ``` | |||
| Here, we're building the target named `<targetName>` from the build tree in the directory | |||
| `build-ios`. All the arguments after `--` are ignored by CMake, and are passed through to the | |||
| underlying build tool. In this case, the build tool will be `xcodebuild` because we used the Xcode | |||
| generator above. We tell xcodebuild that we're building the app for the iOS simulator, which doesn't | |||
| require special code signing. | |||
| If we wanted to build for a real device, we would need to pass some extra signing details to the | |||
| initial CMake configuration command: | |||
| ``` | |||
| cmake -Bbuild-ios -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=9.3 \ | |||
| -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY="iPhone Developer" | |||
| -DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM=<10 character id> | |||
| ``` | |||
| The `CODE_SIGN_IDENTITY` is the kind of certificate you want to use (iPhone Developer is appropriate | |||
| for development) and `DEVELOPMENT_TEAM` is the 10-character ID that can be found by opening the | |||
| Keychain Access app, finding your development certificate, and checking its 'Organizational Unit' | |||
| info field. | |||
| When building the target, you may also need to tell Xcode that it can automatically update | |||
| provisioning profiles, which is achieved by passing the `-allowProvisioningUpdates` flag: | |||
| ``` | |||
| cmake --build build-ios --target <targetName> -- -allowProvisioningUpdates | |||
| ``` | |||
| ## API Reference | |||
| ### `juce_add_<target>` | |||
| ``` | |||
| juce_add_gui_app(<target> [KEY value]...) | |||
| juce_add_console_app(<target> [KEY value]...) | |||
| juce_add_plugin(<target> [KEY value]...) | |||
| ``` | |||
| `juce_add_gui_app` and `juce_add_console_app` add an executable target with name `<target>`. | |||
| `juce_add_plugin` adds a 'shared code' static library target with name `<target>`, along with extra | |||
| targets for each of the specified plugin formats. Each of these functions also takes a number of | |||
| optional arguments in the form of a `KEY` followed by one or more `value`s which can be used to set | |||
| additional attributes of the target. If these optional arguments aren't specified, their values will | |||
| fall back to sensible defaults. | |||
| Each of these arguments adds a property to the resulting target in the form `JUCE_paramName`, where | |||
| `paramName` is one of the parameter keys below. For example, after a call to | |||
| `juce_add_gui_app(my_target PRODUCT_NAME "Target")`, the target `my_target` will have a property | |||
| named `JUCE_PRODUCT_NAME` with the value `"Target"`. After creating a target with one of these | |||
| commands, properties beginning with `JUCE_` can be _queried_, but changing their values might not | |||
| have any effect (or might even break things in unexpected ways!), so always pass JUCE target | |||
| attributes directly to these creation functions, rather than adding them later. | |||
| - `PRODUCT_NAME` | |||
| - The name of the output built by this target, similar to CMake's `OUTPUT_NAME` property. If not | |||
| specified, this will default to the target name. | |||
| - `VERSION` | |||
| - A version number string in the format "major.minor.bugfix". If not specified, the `VERSION` of | |||
| the project containing the target will be used instead. | |||
| - `BUNDLE_ID` | |||
| - An identifier string in the form "com.yourcompany.productname" which should uniquely identify | |||
| this target. Mainly used for macOS builds. If not specified, a default will be generated using | |||
| the target's `COMPANY_NAME` and `PRODUCT_NAME`. | |||
| - `MICROPHONE_PERMISSION_ENABLED` | |||
| - May be either TRUE or FALSE. Adds the appropriate entries to an app's Info.plist. | |||
| - `MICROPHONE_PERMISSION_TEXT` | |||
| - The text your app will display when it requests microphone permissions. | |||
| - `CAMERA_PERMISSION_ENABLED` | |||
| - May be either TRUE or FALSE. Adds the appropriate entries to an app's Info.plist. | |||
| - `CAMERA_PERMISSION_TEXT` | |||
| - The text your app will display when it requests camera permissions. | |||
| - `BLUETOOTH_PERMISSION_ENABLED` | |||
| - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist. | |||
| - `BLUETOOTH_PERMISSION_TEXT` | |||
| - The text your iOS app will display when it requests bluetooth permissions. | |||
| - `SEND_APPLE_EVENTS_PERMISSION_ENABLED` | |||
| - May be either TRUE or FALSE. Enable this to allow your app to send Apple events. | |||
| - `SEND_APPLE_EVENTS_PERMISSION_TEXT` | |||
| - The text your app will display when it requests permission to send Apple events. | |||
| - `FILE_SHARING_ENABLED` | |||
| - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist. | |||
| - `DOCUMENT_BROWSER_ENABLED` | |||
| - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist. | |||
| - `STATUS_BAR_HIDDEN` | |||
| - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist. | |||
| - `BACKGROUND_AUDIO_ENABLED` | |||
| - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist. | |||
| - `BACKGROUND_BLE_ENABLED` | |||
| - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist. | |||
| - `APP_GROUPS_ENABLED` | |||
| - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's entitlements. | |||
| - `APP_GROUP_IDS` | |||
| - The app groups to which your iOS app belongs. These will be added to your app's entitlements. | |||
| - `ICLOUD_PERMISSIONS_ENABLED` | |||
| - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's entitlements. | |||
| - `IPHONE_SCREEN_ORIENTATIONS` | |||
| - May be, `portrait`, `landscape`, or both (separated by a space). Adds the appropriate entries to | |||
| an iPhone app's Info.plist. | |||
| - `IPAD_SCREEN_ORIENTATIONS` | |||
| - May be, `portrait`, `landscape`, or both (separated by a space). Adds the appropriate entries to | |||
| an iPad app's Info.plist. | |||
| - `LAUNCH_STORYBOARD_FILE` | |||
| - A custom launch storyboard file to use on iOS. If not supplied, a default storyboard will be | |||
| used. | |||
| - `CUSTOM_XCASSETS_FOLDER` | |||
| - A path to an xcassets directory, containing icons and/or launch images for this target. If this | |||
| is specified, the ICON_BIG and ICON_SMALL arguments will not have an effect on iOS, and a launch | |||
| storyboard will not be used. | |||
| - `ICON_BIG`, `ICON_SMALL` | |||
| - Paths to image files that will be used to generate app icons. If only one of these parameters | |||
| is specified, then that image will be used for all icon resolutions. If both arguments are | |||
| specified, then the appropriate image will be picked for each icon resolution. | |||
| - `COMPANY_COPYRIGHT` | |||
| - Copyright text which will be added to the app/plugin's Info.plist. The value of this argument | |||
| will be inherited from the `JUCE_COMPANY_COPYRIGHT` property, so if you want to use the same | |||
| `COMPANY_COPYRIGHT` for several targets in a build tree, you can call | |||
| `set_directory_properties(PROPERTIES JUCE_COMPANY_COPYRIGHT ...)` after including JUCE but | |||
| before adding the targets, and then omit the `COMPANY_COPYRIGHT` argument when creating the | |||
| individual targets. | |||
| - `COMPANY_NAME` | |||
| - The name of this target's author. Will be added to the app/plugin's Info.plist, and may be used | |||
| to generate part of the `BUNDLE_ID` if no ID was given explicitly. The value of this argument | |||
| will be inherited from the `JUCE_COMPANY_NAME` property, so if you want to use the same | |||
| `COMPANY_NAME` for several targets in a build tree, you can call | |||
| `set_directory_properties(PROPERTIES JUCE_COMPANY_NAME ...)` after including JUCE but before | |||
| adding the targets, and then omit the `COMPANY_NAME` argument when creating the individual | |||
| targets. | |||
| - `COMPANY_WEBSITE` | |||
| - The address of a website related to this target in some way. The value of this argument will be | |||
| inherited from the `JUCE_COMPANY_WEBSITE` property, so if you want to use the same | |||
| `COMPANY_WEBSITE` for several targets in a build tree, you can call | |||
| `set_directory_properties(PROPERTIES JUCE_COMPANY_WEBSITE ...)` after including JUCE but before | |||
| adding the targets, and then omit the `COMPANY_WEBSITE` argument when creating the individual | |||
| targets. | |||
| - `COMPANY_EMAIL` | |||
| - An email address for this target's author. The value of this argument will be inherited from the | |||
| `JUCE_COMPANY_EMAIL` property, so if you want to use the same `COMPANY_EMAIL` for several | |||
| targets in a build tree, you can call `set_directory_properties(PROPERTIES JUCE_COMPANY_EMAIL | |||
| ...)` after including JUCE but before adding the targets, and then omit the `COMPANY_EMAIL` | |||
| argument when creating the individual targets. | |||
| - `DOCUMENT_EXTENSIONS` | |||
| - File extensions that should be associated with this target. For example, the Projucer passes | |||
| the string `jucer` because it wants to open `.jucer` files. If your target has several different | |||
| document types, you can pass them as multiple arguments, e.g. `DOCUMENT_EXTENSIONS wav mp3 aif`. | |||
| - `NEEDS_CURL` | |||
| - On Linux, JUCE may or may not need to link to Curl depending on the compile definitions that are | |||
| set on a JUCE target. By default, we don't link Curl because you might not need it, but if you | |||
| get linker or include errors that reference Curl, just set this argument to `TRUE`. | |||
| - `NEEDS_WEB_BROWSER` | |||
| - On Linux, JUCE may or may not need to link to Webkit depending on the compile definitions that | |||
| are set on a JUCE target. By default, we don't link Webkit because you might not need it, but | |||
| if you get linker or include errors that reference Webkit, just set this argument to `TRUE`. | |||
| - `NEEDS_STORE_KIT` | |||
| - On macOS, JUCE may or may not need to link to StoreKit depending on the compile definitions that | |||
| are set on a JUCE target. By default, we don't link StoreKit because you might not need it, but | |||
| if you get linker or include errors that reference StoreKit, just set this argument to `TRUE`. | |||
| - `PUSH_NOTIFICATIONS_ENABLED` | |||
| - Sets app entitlements to allow push notifications. False by default. | |||
| - `HARDENED_RUNTIME_ENABLED` | |||
| - Enables macOS' hardened runtime for this target. Required for notarisation. False by default. | |||
| - `HARDENED_RUNTIME_OPTIONS` | |||
| - A set of space-separated entitlement keys that will be added to this target's entitlements | |||
| plist if `HARDENED_RUNTIME_ENABLED` is `TRUE`. Each key should be in the form | |||
| `com.apple.security.*` where `*` is a specific entitlement. | |||
| - `APP_SANDBOX_ENABLED` | |||
| - Enables macOS' app sandbox for this target. False by default. | |||
| - `APP_SANDBOX_INHERIT` | |||
| - Allows child processes to inherit the static entitlements of their parent process. If this | |||
| is set to `TRUE`, no other app sandbox entitlements will be set on this target. | |||
| - `APP_SANDBOX_OPTIONS` | |||
| - A set of space-separated entitlement keys that will be added to this target's entitlements | |||
| plist if `APP_SANDBOX_ENABLED` is `TRUE`. Each key should be in the form `com.apple.security.*` | |||
| where `*` is a specific entitlement. | |||
| - `PLIST_TO_MERGE` | |||
| - A string to insert into an app/plugin's Info.plist. | |||
| - `FORMATS` | |||
| - For plugin targets, specifies the plugin targets to build. Should be provided as a | |||
| space-separated list. Valid values are `Standalone Unity VST3 AU AUv3 AAX VST`. `AU` and `AUv3` | |||
| plugins will only be enabled when building on macOS. It is an error to pass `AAX` or `VST` | |||
| without first calling `juce_set_aax_sdk_path` or `juce_set_vst2_sdk_path` respectively. | |||
| - `PLUGIN_MANUFACTURER_CODE` | |||
| - A four-character unique ID for your company. For AU compatibility, this must contain at least | |||
| one upper-case letter. | |||
| - `PLUGIN_CODE` | |||
| - A four-character unique ID for your plugin. For AU compatibility, this must contain at least | |||
| one upper-case letter. | |||
| - `DESCRIPTION` | |||
| - A short description of your plugin. | |||
| - `IS_SYNTH` | |||
| - Whether the plugin is a synth. Will be used to set sensible plugin category values if they | |||
| are not provided explicitly. | |||
| - `NEEDS_MIDI_INPUT` | |||
| - Whether the plugin should provide a midi input. | |||
| - `NEEDS_MIDI_OUTPUT` | |||
| - Whether the plugin should provide a midi output. | |||
| - `IS_MIDI_EFFECT` | |||
| - Whether the plugin is a MIDI effect (some hosts provide a special channel-strip location for | |||
| MIDI effect plugins). | |||
| - `EDITOR_WANTS_KEYBOARD_FOCUS` | |||
| - Whether the plugin requires keyboard focus, or should defer all keyboard handling to the host. | |||
| - `DISABLE_AAX_BYPASS` | |||
| - Whether the AAX bypass function should be disabled. | |||
| - `DISABLE_AAX_MULTI_MONO` | |||
| - Whether the AAX multi mono bus layout should be disabled. | |||
| - `AAX_IDENTIFIER` | |||
| - The bundle ID for the AAX plugin target. Matches the `BUNDLE_ID` by default. | |||
| - `VST_NUM_MIDI_INS` | |||
| - For VST2 and VST3 plugins that accept midi, this allows you to configure the number of inputs. | |||
| - `VST_NUM_MIDI_OUTS` | |||
| - For VST2 and VST3 plugins that produce midi, this allows you to configure the number of outputs. | |||
| - `VST2_CATEGORY` | |||
| - Should be one of: `kPlugCategUnknown`, `kPlugCategEffect`, `kPlugCategSynth`, | |||
| `kPlugCategAnalysis`, `kPlugCategMatering`, `kPlugCategSpacializer`, `kPlugCategRoomFx`, | |||
| `kPlugSurroundFx`, `kPlugCategRestoration`, `kPlugCategOfflineProcess`, `kPlugCategShell`, | |||
| `kPlugCategGenerator`. | |||
| - `VST3_CATEGORIES` | |||
| - Should be one or more, separated by spaces, of the following: `Fx`, `Instrument`, `Analyzer`, | |||
| `Delay`, `Distortion`, `Drum`, `Dynamics`, `EQ`, `External`, `Filter`, `Generator`, `Mastering`, | |||
| `Modulation`, `Mono`, `Network`, `NoOfflineProcess`, `OnlyOfflineProcess`, `OnlyRT`, | |||
| `Pitch Shift`, `Restoration`, `Reverb`, `Sampler`, `Spatial`, `Stereo`, `Surround`, `Synth`, | |||
| `Tools`, `Up-Downmix` | |||
| - `AU_MAIN_TYPE` | |||
| - Should be one of: `kAudioUnitType_Effect`, `kAudioUnitType_FormatConverter`, | |||
| `kAudioUnitType_Generator`, `kAudioUnitType_MIDIProcessor`, `kAudioUnitType_Mixer`, | |||
| `kAudioUnitType_MusicDevice`, `kAudioUnitType_MusicEffect`, `kAudioUnitType_OfflineEffect`, | |||
| `kAudioUnitType_Output`, `kAudioUnitType_Panner` | |||
| - `AU_EXPORT_PREFIX` | |||
| - A prefix for the names of entry-point functions that your component exposes. Typically this | |||
| will be a version of your plugin's name that can be used as part of a C++ token. Defaults | |||
| to your plugin's name with the suffix 'AU'. | |||
| - `AU_SANDBOX_SAFE` | |||
| - May be either TRUE or FALSE. Adds the appropriate entries to an AU plugin's Info.plist. | |||
| - `AAX_CATEGORY` | |||
| - Should be one of: `AAX_ePlugInCategory_None`, `AAX_ePlugInCategory_EQ`, | |||
| `AAX_ePlugInCategory_Dynamics`, `AAX_ePlugInCategory_PitchShift`, `AAX_ePlugInCategory_Reverb`, | |||
| `AAX_ePlugInCategory_Delay`, `AAX_ePlugInCategory_Modulation`, `AAX_ePlugInCategory_Harmonic`, | |||
| `AAX_ePlugInCategory_NoiseReduction`, `AAX_ePlugInCategory_Dither`, | |||
| `AAX_ePlugInCategory_SoundField`, `AAX_ePlugInCategory_HWGenerators`, | |||
| `AAX_ePlugInCategory_SWGenerators`, `AAX_ePlugInCategory_WrappedPlugin`, | |||
| `AAX_ePlugInCategory_Effect` | |||
| - `COPY_PLUGIN_AFTER_BUILD` | |||
| - Whether or not to install the plugin to the current system after building. False by default. | |||
| If you want all of the plugins in a subdirectory to be installed automatically after building, | |||
| you can set the property `JUCE_COPY_PLUGIN_AFTER_BUILD` on the directory before adding the | |||
| plugins, rather than setting this argument on each individual target. Note that on Windows, | |||
| the default install locations may not be writable by normal user accounts. | |||
| - `VST_COPY_DIR` | |||
| - The location to which VST2 (legacy) plugins will be copied after building if | |||
| `COPY_PLUGIN_AFTER_BUILD` is set on this target. If you want to install all of the VST2 plugins | |||
| in a subdirectory to a non-default location, you can set the `JUCE_VST_COPY_DIR` property on | |||
| the directory before adding the plugin targets, rather than setting this argument on each | |||
| individual target. | |||
| - `VST3_COPY_DIR` | |||
| - The location to which VST3 plugins will be copied after building if `COPY_PLUGIN_AFTER_BUILD` | |||
| is set on this target. If you want to install all of the VST3 plugins in a subdirectory to a | |||
| non-default location, you can set the `JUCE_VST3_COPY_DIR` property on the directory before | |||
| adding the plugin targets, rather than setting this argument on each individual target. | |||
| - `AAX_COPY_DIR` | |||
| - The location to which AAX plugins will be copied after building if `COPY_PLUGIN_AFTER_BUILD` | |||
| is set on this target. If you want to install all of the AAX plugins in a subdirectory to a | |||
| non-default location, you can set the `JUCE_AAX_COPY_DIR` property on the directory before | |||
| adding the plugin targets, rather than setting this argument on each individual target. | |||
| - `AU_COPY_DIR` | |||
| - The location to which AU plugins will be copied after building if `COPY_PLUGIN_AFTER_BUILD` | |||
| is set on this target. If you want to install all of the AU plugins in a subdirectory to a | |||
| non-default location, you can set the `JUCE_AU_COPY_DIR` property on the directory before | |||
| adding the plugin targets, rather than setting this argument on each individual target. | |||
| - `UNITY_COPY_DIR` | |||
| - The location to which Unity plugins will be copied after building if `COPY_PLUGIN_AFTER_BUILD` | |||
| is set on this target. If you want to install all of the Unity plugins in a subdirectory to a | |||
| non-default location, you can set the `JUCE_UNITY_COPY_DIR` property on the directory before | |||
| adding the plugin targets, rather than setting this argument on each individual target. | |||
| Unlike the other `COPY_DIR` arguments, this argument does not have a default value so be sure | |||
| to set it if you have enabled `COPY_PLUGIN_AFTER_BUILD` and the `Unity` format. | |||
| ### `juce_add_binary_data` | |||
| ``` | |||
| juce_add_binary_data(<name> | |||
| [NAMESPACE ...] | |||
| SOURCES ...) | |||
| ``` | |||
| Create a static library that embeds the contents of the files passed as arguments to this function. | |||
| Adds a library target called `<name>` which can be linked into other targets using | |||
| `target_link_libraries`. The `NAMESPACE` argument is optional. If not provided, the generated files | |||
| will use the default namespace `BinaryData`. Each of the files located at the paths following | |||
| `SOURCES` will be encoded and embedded in the resulting static library. This library can be linked | |||
| as normal using `target_link_libraries(<otherTarget> PRIVATE <name>)`, and the header can be | |||
| included using `#include <BinaryData.h>`. | |||
| ### `juce_add_bundle_resources_directory` | |||
| ``` | |||
| juce_add_bundle_resources_directory(<target> <folder>) | |||
| ``` | |||
| Copy the entire directory at the location `<folder>` into an Apple bundle's resource directory, i.e. | |||
| the `Resources` directory for a macOS bundle, and the top-level directory of an iOS bundle. | |||
| ### `juce_generate_juce_header` | |||
| ``` | |||
| juce_generate_juce_header(<target>) | |||
| ``` | |||
| Introspects the JUCE modules that have been linked to `<target>` and generates a `JuceHeader.h` | |||
| which contains `#include` statements for each of the module headers. This header also contains an | |||
| optional `using namespace juce` statement, and an optional `ProjectInfo` block, each of which can be | |||
| disabled by setting the compile definitions `DONT_SET_USING_JUCE_NAMESPACE` and | |||
| `JUCE_DONT_DECLARE_PROJECTINFO` respectively. The resulting header can be included with `#include | |||
| <JuceHeader.h>`. In plain CMake projects which don't require Projucer compatibility, the use of | |||
| JuceHeader.h is optional. Instead, module headers can be included directly in source files that | |||
| require them. | |||
| ### `juce_set_<kind>_sdk_path` | |||
| ``` | |||
| juce_set_aax_sdk_path(<absolute path>) | |||
| juce_set_vst2_sdk_path(<absolute path>) | |||
| ``` | |||
| Call these functions from your CMakeLists to set up your local AAX and/or VST2 SDKs. These functions | |||
| should be called *before* adding any targets that may depend on the AAX/VST2 SDKs (plugin | |||
| hosts, VST2/AAX plugins etc.). | |||
| ### `juce_add_module` | |||
| ``` | |||
| juce_add_module(<path to module>) | |||
| juce_add_modules(<names of module>...) | |||
| ``` | |||
| `juce_add_module` adds a library target for the JUCE module located at the provided path. `<path>` | |||
| must be the path to a module directory (e.g. /Users/me/JUCE/modules/juce_core). This will add an | |||
| interface library with a name matching the directory name of the module. The resulting library can | |||
| be linked to other targets as normal, using `target_link_libraries`. | |||
| Due to the way that `INTERFACE` libraries work in CMake, linking to a module added in this way | |||
| *must* be done using `PRIVATE` visibility. Using `PUBLIC` will cause the module sources to be added | |||
| both to the target's `SOURCES` and `INTERFACE_SOURCES`, which may result in many copies of the | |||
| module being built into a single target, which would cause build failures in the best case and | |||
| silent ODR violations in the worst case. Scary stuff! | |||
| This command has a few optional arguments: `INSTALL_PATH` and `INSTALL_EXPORT` should be provided if | |||
| you want the module to be installable through the CMake installation mechanism. `INSTALL_PATH` is a | |||
| path, relative to the install prefix, to which the module sources will be copied. `INSTALL_EXPORT` | |||
| specifies the CMake export group for the installed module. ALIAS_NAMESPACE will add an alias for the | |||
| target(s) with the provided namespace. For example, the following invocation will add a module | |||
| target named `my_module`, along with an alias named `company::my_module`. | |||
| ``` | |||
| juce_add_module(my_module ALIAS_NAMESPACE company)` | |||
| ``` | |||
| `juce_add_modules` is a convenience function that can be used to add multiple JUCE modules at once. | |||
| This version accepts many module paths, rather than just one. For an example of usage, see the | |||
| CMakeLists in the `modules` directory. | |||
| ### `juce_add_pip` | |||
| ``` | |||
| juce_add_pip(<header>) | |||
| ``` | |||
| This function parses the PIP metadata block in the provided header, and adds appropriate build | |||
| targets for a console app, GUI app, or audio plugin. For audio plugin targets, it builds as many | |||
| plugin formats as possible. To build AAX or VST2 targets, call `juce_set_aax_sdk_path` and/or | |||
| `juce_set_vst2_sdk_path` *before* calling `juce_add_pip`. | |||
| This is mainly provided to build the built-in example projects in the JUCE repo, and for building | |||
| quick proof-of-concept demo apps with minimal set-up. For any use-case more complex than a | |||
| proof-of-concept, you should prefer the `juce_add_gui_app`, `juce_add_plugin`, or | |||
| `juce_add_console_app` functions, which provide more fine-grained control over the properties of | |||
| your target. | |||
| @@ -0,0 +1,35 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| add_subdirectory(CMake) | |||
| add_subdirectory(DemoRunner) | |||
| function(_juce_add_pips) | |||
| file(GLOB_RECURSE headers | |||
| CONFIGURE_DEPENDS LIST_DIRECTORIES false | |||
| "${CMAKE_CURRENT_SOURCE_DIR}/*.h") | |||
| foreach(header IN ITEMS ${headers}) | |||
| juce_add_pip(${header}) | |||
| endforeach() | |||
| endfunction() | |||
| add_subdirectory(Audio) | |||
| add_subdirectory(BLOCKS) | |||
| add_subdirectory(DSP) | |||
| add_subdirectory(GUI) | |||
| add_subdirectory(Plugins) | |||
| add_subdirectory(Utilities) | |||
| @@ -0,0 +1,17 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| _juce_add_pips() | |||
| @@ -58,6 +58,8 @@ inline File getExamplesDirectory() noexcept | |||
| jassert (success); | |||
| return mo.toString(); | |||
| #elif defined PIP_JUCE_EXAMPLES_DIRECTORY_STRING | |||
| return File { PIP_JUCE_EXAMPLES_DIRECTORY_STRING }; | |||
| #else | |||
| auto currentFile = File::getSpecialLocation (File::SpecialLocationType::currentApplicationFile); | |||
| auto exampleDir = currentFile.getParentDirectory().getChildFile ("examples"); | |||
| @@ -0,0 +1,64 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| juce_add_gui_app(DemoRunner | |||
| BUNDLE_ID com.juce.demorunner | |||
| ICON_BIG ${CMAKE_CURRENT_SOURCE_DIR}/Source/JUCEAppIcon.png | |||
| NEEDS_CURL TRUE | |||
| NEEDS_WEB_BROWSER TRUE | |||
| MICROPHONE_PERMISSION_ENABLED TRUE | |||
| CAMERA_PERMISSION_ENABLED TRUE | |||
| BLUETOOTH_PERMISSION_ENABLED TRUE | |||
| FILE_SHARING_ENABLED TRUE | |||
| DOCUMENT_BROWSER_ENABLED TRUE | |||
| IPHONE_SCREEN_ORIENTATIONS portrait landscape | |||
| IPAD_SCREEN_ORIENTATIONS portrait landscape) | |||
| juce_generate_juce_header(DemoRunner) | |||
| target_sources(DemoRunner PRIVATE | |||
| Source/Demos/DemoPIPs1.cpp | |||
| Source/Demos/DemoPIPs2.cpp | |||
| Source/Demos/JUCEDemos.cpp | |||
| Source/Main.cpp | |||
| Source/UI/DemoContentComponent.cpp | |||
| Source/UI/MainComponent.cpp) | |||
| target_compile_definitions(DemoRunner PRIVATE | |||
| PIP_JUCE_EXAMPLES_DIRECTORY_STRING="${JUCE_SOURCE_DIR}/examples" | |||
| JUCE_ALLOW_STATIC_NULL_VARIABLES=0 | |||
| JUCE_DEMO_RUNNER=1 | |||
| JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| JUCE_UNIT_TESTS=1 | |||
| JUCE_USE_CAMERA=1 | |||
| JUCE_USE_CURL=1 | |||
| JUCE_USE_MP3AUDIOFORMAT=1 | |||
| JUCE_WEB_BROWSER=1) | |||
| target_link_libraries(DemoRunner PRIVATE | |||
| juce::juce_analytics | |||
| juce::juce_audio_utils | |||
| juce::juce_blocks_basics | |||
| juce::juce_box2d | |||
| juce::juce_dsp | |||
| juce::juce_opengl | |||
| juce::juce_osc | |||
| juce::juce_product_unlocking | |||
| juce::juce_video) | |||
| if(CMAKE_SYSTEM_NAME STREQUAL "iOS") | |||
| juce_add_bundle_resources_directory(DemoRunner ../Assets) | |||
| endif() | |||
| @@ -0,0 +1,17 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| _juce_add_pips() | |||
| @@ -23,24 +23,27 @@ | |||
| BEGIN_JUCE_PIP_METADATA | |||
| name: AUv3SynthPlugin | |||
| version: 1.0.0 | |||
| vendor: JUCE | |||
| website: http://juce.com | |||
| description: AUv3 synthesiser audio plugin. | |||
| name: AUv3SynthPlugin | |||
| version: 1.0.0 | |||
| vendor: JUCE | |||
| website: http://juce.com | |||
| description: AUv3 synthesiser audio plugin. | |||
| dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, | |||
| juce_audio_plugin_client, juce_audio_processors, | |||
| juce_audio_utils, juce_core, juce_data_structures, | |||
| juce_events, juce_graphics, juce_gui_basics, juce_gui_extra | |||
| exporters: xcode_mac, xcode_iphone | |||
| dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, | |||
| juce_audio_plugin_client, juce_audio_processors, | |||
| juce_audio_utils, juce_core, juce_data_structures, | |||
| juce_events, juce_graphics, juce_gui_basics, juce_gui_extra | |||
| exporters: xcode_mac, xcode_iphone | |||
| moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| type: AudioProcessor | |||
| mainClass: AUv3SynthProcessor | |||
| type: AudioProcessor | |||
| mainClass: AUv3SynthProcessor | |||
| useLocalCopy: 1 | |||
| useLocalCopy: 1 | |||
| pluginCharacteristics: pluginIsSynth, pluginWantsMidiIn | |||
| extraPluginFormats: AUv3 | |||
| END_JUCE_PIP_METADATA | |||
| @@ -23,24 +23,26 @@ | |||
| BEGIN_JUCE_PIP_METADATA | |||
| name: ArpeggiatorPlugin | |||
| version: 1.0.0 | |||
| vendor: JUCE | |||
| website: http://juce.com | |||
| description: Arpeggiator audio plugin. | |||
| name: ArpeggiatorPlugin | |||
| version: 1.0.0 | |||
| vendor: JUCE | |||
| website: http://juce.com | |||
| description: Arpeggiator audio plugin. | |||
| dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, | |||
| juce_audio_plugin_client, juce_audio_processors, | |||
| juce_audio_utils, juce_core, juce_data_structures, | |||
| juce_events, juce_graphics, juce_gui_basics, juce_gui_extra | |||
| exporters: xcode_mac, vs2019 | |||
| dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, | |||
| juce_audio_plugin_client, juce_audio_processors, | |||
| juce_audio_utils, juce_core, juce_data_structures, | |||
| juce_events, juce_graphics, juce_gui_basics, juce_gui_extra | |||
| exporters: xcode_mac, vs2019 | |||
| moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| type: AudioProcessor | |||
| mainClass: Arpeggiator | |||
| type: AudioProcessor | |||
| mainClass: Arpeggiator | |||
| useLocalCopy: 1 | |||
| useLocalCopy: 1 | |||
| pluginCharacteristics: pluginWantsMidiIn, pluginProducesMidiOut, pluginIsMidiEffectPlugin | |||
| END_JUCE_PIP_METADATA | |||
| @@ -23,24 +23,28 @@ | |||
| BEGIN_JUCE_PIP_METADATA | |||
| name: AudioPluginDemo | |||
| version: 1.0.0 | |||
| vendor: JUCE | |||
| website: http://juce.com | |||
| description: Synthesiser audio plugin. | |||
| name: AudioPluginDemo | |||
| version: 1.0.0 | |||
| vendor: JUCE | |||
| website: http://juce.com | |||
| description: Synthesiser audio plugin. | |||
| dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, | |||
| juce_audio_plugin_client, juce_audio_processors, | |||
| juce_audio_utils, juce_core, juce_data_structures, | |||
| juce_events, juce_graphics, juce_gui_basics, juce_gui_extra | |||
| exporters: xcode_mac, vs2017, vs2019, linux_make, xcode_iphone, androidstudio | |||
| dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, | |||
| juce_audio_plugin_client, juce_audio_processors, | |||
| juce_audio_utils, juce_core, juce_data_structures, | |||
| juce_events, juce_graphics, juce_gui_basics, juce_gui_extra | |||
| exporters: xcode_mac, vs2017, vs2019, linux_make, xcode_iphone, androidstudio | |||
| moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| type: AudioProcessor | |||
| mainClass: JuceDemoPluginAudioProcessor | |||
| type: AudioProcessor | |||
| mainClass: JuceDemoPluginAudioProcessor | |||
| useLocalCopy: 1 | |||
| useLocalCopy: 1 | |||
| pluginCharacteristics: pluginIsSynth, pluginWantsMidiIn, pluginProducesMidiOut, | |||
| pluginEditorRequiresKeys | |||
| extraPluginFormats: AUv3 | |||
| END_JUCE_PIP_METADATA | |||
| @@ -0,0 +1,17 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| _juce_add_pips() | |||
| @@ -23,24 +23,26 @@ | |||
| BEGIN_JUCE_PIP_METADATA | |||
| name: InterAppAudioEffectPlugin | |||
| version: 1.0.0 | |||
| vendor: JUCE | |||
| website: http://juce.com | |||
| description: Inter-app audio effect plugin. | |||
| name: InterAppAudioEffectPlugin | |||
| version: 1.0.0 | |||
| vendor: JUCE | |||
| website: http://juce.com | |||
| description: Inter-app audio effect plugin. | |||
| dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, | |||
| juce_audio_plugin_client, juce_audio_processors, | |||
| juce_audio_utils, juce_core, juce_data_structures, | |||
| juce_events, juce_graphics, juce_gui_basics, juce_gui_extra | |||
| exporters: xcode_iphone | |||
| dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, | |||
| juce_audio_plugin_client, juce_audio_processors, | |||
| juce_audio_utils, juce_core, juce_data_structures, | |||
| juce_events, juce_graphics, juce_gui_basics, juce_gui_extra | |||
| exporters: xcode_iphone | |||
| moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| type: AudioProcessor | |||
| mainClass: IAAEffectProcessor | |||
| type: AudioProcessor | |||
| mainClass: IAAEffectProcessor | |||
| useLocalCopy: 1 | |||
| useLocalCopy: 1 | |||
| extraPluginFormats: IAA | |||
| END_JUCE_PIP_METADATA | |||
| @@ -23,24 +23,26 @@ | |||
| BEGIN_JUCE_PIP_METADATA | |||
| name: MultiOutSynthPlugin | |||
| version: 1.0.0 | |||
| vendor: JUCE | |||
| website: http://juce.com | |||
| description: Multi-out synthesiser audio plugin. | |||
| name: MultiOutSynthPlugin | |||
| version: 1.0.0 | |||
| vendor: JUCE | |||
| website: http://juce.com | |||
| description: Multi-out synthesiser audio plugin. | |||
| dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, | |||
| juce_audio_plugin_client, juce_audio_processors, | |||
| juce_audio_utils, juce_core, juce_data_structures, | |||
| juce_events, juce_graphics, juce_gui_basics, juce_gui_extra | |||
| exporters: xcode_mac, vs2019 | |||
| dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, | |||
| juce_audio_plugin_client, juce_audio_processors, | |||
| juce_audio_utils, juce_core, juce_data_structures, | |||
| juce_events, juce_graphics, juce_gui_basics, juce_gui_extra | |||
| exporters: xcode_mac, vs2019 | |||
| moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| type: AudioProcessor | |||
| mainClass: MultiOutSynth | |||
| type: AudioProcessor | |||
| mainClass: MultiOutSynth | |||
| useLocalCopy: 1 | |||
| useLocalCopy: 1 | |||
| pluginCharacteristics: pluginIsSynth, pluginWantsMidiIn | |||
| END_JUCE_PIP_METADATA | |||
| @@ -0,0 +1,17 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| _juce_add_pips() | |||
| @@ -38,6 +38,7 @@ | |||
| exporters: xcode_mac, xcode_iphone, androidstudio | |||
| moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| JUCE_IN_APP_PURCHASES=1 | |||
| type: Component | |||
| mainClass: InAppPurchasesDemo | |||
| @@ -37,6 +37,7 @@ | |||
| exporters: xcode_mac, vs2019, xcode_iphone, androidstudio | |||
| moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| JUCE_PUSH_NOTIFICATIONS=1 | |||
| type: Component | |||
| mainClass: PushNotificationsDemo | |||
| @@ -0,0 +1,27 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| juce_add_gui_app(AudioPerformanceTest BUNDLE_ID com.juce.AudioPerformanceTest) | |||
| juce_generate_juce_header(AudioPerformanceTest) | |||
| target_sources(AudioPerformanceTest PRIVATE | |||
| Source/Main.cpp) | |||
| target_compile_definitions(AudioPerformanceTest PRIVATE | |||
| JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0) | |||
| target_link_libraries(AudioPerformanceTest PRIVATE juce::juce_audio_utils) | |||
| @@ -0,0 +1,52 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| juce_add_gui_app(AudioPluginHost | |||
| BUNDLE_ID com.juce.pluginhost | |||
| ICON_BIG "${CMAKE_CURRENT_SOURCE_DIR}/Source/JUCEAppIcon.png" | |||
| MICROPHONE_PERMISSION_ENABLED TRUE) | |||
| juce_generate_juce_header(AudioPluginHost) | |||
| target_sources(AudioPluginHost PRIVATE | |||
| Source/HostStartup.cpp | |||
| Source/Plugins/IOConfigurationWindow.cpp | |||
| Source/Plugins/InternalPlugins.cpp | |||
| Source/Plugins/PluginGraph.cpp | |||
| Source/UI/GraphEditorPanel.cpp | |||
| Source/UI/MainHostWindow.cpp) | |||
| target_compile_definitions(AudioPluginHost PRIVATE | |||
| JUCE_ALSA=1 | |||
| JUCE_DIRECTSOUND=1 | |||
| JUCE_PLUGINHOST_AU=1 | |||
| JUCE_PLUGINHOST_LADSPA=1 | |||
| JUCE_PLUGINHOST_VST=0 | |||
| JUCE_PLUGINHOST_VST3=1 | |||
| JUCE_USE_CAMERA=0 | |||
| JUCE_USE_CDBURNER=0 | |||
| JUCE_USE_CDREADER=0 | |||
| JUCE_USE_CURL=0 | |||
| JUCE_USE_FLAC=0 | |||
| JUCE_USE_OGGVORBIS=0 | |||
| JUCE_WASAPI=1 | |||
| JUCE_WEB_BROWSER=0) | |||
| target_link_libraries(AudioPluginHost PRIVATE | |||
| juce::juce_audio_utils | |||
| juce::juce_cryptography | |||
| juce::juce_opengl | |||
| juce::juce_video) | |||
| @@ -0,0 +1,25 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| juce_add_console_app(BinaryBuilder) | |||
| juce_generate_juce_header(BinaryBuilder) | |||
| target_sources(BinaryBuilder PRIVATE Source/Main.cpp) | |||
| target_compile_definitions(BinaryBuilder PRIVATE JUCE_USE_CURL=0) | |||
| target_link_libraries(BinaryBuilder PRIVATE juce::juce_core) | |||
| @@ -0,0 +1,41 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE library. | |||
| # Copyright (c) 2017 - ROLI Ltd. | |||
| # | |||
| # JUCE is an open source library subject to commercial or open-source | |||
| # licensing. | |||
| # | |||
| # The code included in this file is provided under the terms of the ISC license | |||
| # http://www.isc.org/downloads/software-support-policy/isc-license. Permission | |||
| # To use, copy, modify, and/or distribute this software for any purpose with or | |||
| # without fee is hereby granted provided that the above copyright notice and | |||
| # this permission notice appear in all copies. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| @PACKAGE_INIT@ | |||
| include("${CMAKE_CURRENT_LIST_DIR}/JUCE.cmake") | |||
| get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) | |||
| get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) | |||
| get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) | |||
| get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) | |||
| if(_IMPORT_PREFIX STREQUAL "/") | |||
| set(_IMPORT_PREFIX "") | |||
| endif() | |||
| add_executable(juce::juceaide IMPORTED) | |||
| set_target_properties(juce::juceaide PROPERTIES | |||
| IMPORTED_LOCATION "${_IMPORT_PREFIX}/@JUCE_CMAKE_BINARY_BUILDER_NAME@") | |||
| set(_IMPORT_PREFIX) | |||
| check_required_components("@PROJECT_NAME@") | |||
| include("${CMAKE_CURRENT_LIST_DIR}/JUCEUtils.cmake") | |||
| @@ -0,0 +1,16 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> | |||
| <scenes> | |||
| <scene sceneID="EHf-IW-A2E"> | |||
| <objects> | |||
| <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="" sceneMemberID="firstResponder"/> | |||
| <viewController id="01J-lp-oVM" sceneMemberID="viewController"> | |||
| <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> | |||
| <autoresizingMask key="autoresizingMask"/> | |||
| <color key="backgroundColor" red="0" green="0" blue="0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |||
| </view> | |||
| </viewController> | |||
| </objects> | |||
| </scene> | |||
| </scenes> | |||
| </document> | |||
| @@ -0,0 +1,16 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file was auto-generated and contains the startup code for a PIP. | |||
| ============================================================================== | |||
| */ | |||
| #include <JuceHeader.h> | |||
| #include "${JUCE_PIP_HEADER}" | |||
| //============================================================================== | |||
| AudioProcessor* JUCE_CALLTYPE createPluginFilter() | |||
| { | |||
| return new ${JUCE_PIP_MAIN_CLASS}(); | |||
| } | |||
| @@ -1,77 +1,68 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file was auto-generated and contains the startup code for a PIP. | |||
| ============================================================================== | |||
| */ | |||
| %%include_juce%% | |||
| #include "%%filename%%" | |||
| %%component_begin%% | |||
| class Application : public JUCEApplication | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| Application() {} | |||
| const String getApplicationName() override { return "%%project_name%%"; } | |||
| const String getApplicationVersion() override { return "%%project_version%%"; } | |||
| void initialise (const String&) override { %%startup%% } | |||
| void shutdown() override { %%shutdown%% } | |||
| private: | |||
| class MainWindow : public DocumentWindow | |||
| { | |||
| public: | |||
| MainWindow (const String& name, Component* c, JUCEApplication& a) | |||
| : DocumentWindow (name, Desktop::getInstance().getDefaultLookAndFeel() | |||
| .findColour (ResizableWindow::backgroundColourId), | |||
| DocumentWindow::allButtons), | |||
| app (a) | |||
| { | |||
| setUsingNativeTitleBar (true); | |||
| setContentOwned (c, true); | |||
| #if JUCE_ANDROID || JUCE_IOS | |||
| setFullScreen (true); | |||
| #else | |||
| setResizable (true, false); | |||
| setResizeLimits (300, 250, 10000, 10000); | |||
| centreWithSize (getWidth(), getHeight()); | |||
| #endif | |||
| setVisible (true); | |||
| } | |||
| void closeButtonPressed() override | |||
| { | |||
| app.systemRequestedQuit(); | |||
| } | |||
| private: | |||
| JUCEApplication& app; | |||
| //============================================================================== | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow) | |||
| }; | |||
| std::unique_ptr<MainWindow> mainWindow; | |||
| }; | |||
| //============================================================================== | |||
| START_JUCE_APPLICATION (Application) | |||
| %%component_end%% | |||
| %%audioprocessor_begin%% | |||
| //============================================================================== | |||
| AudioProcessor* JUCE_CALLTYPE createPluginFilter() | |||
| { | |||
| return new %%class_name%%(); | |||
| } | |||
| %%audioprocessor_end%% | |||
| %%console_begin%% | |||
| %%console_end%% | |||
| /* | |||
| ============================================================================== | |||
| This file was auto-generated and contains the startup code for a PIP. | |||
| ============================================================================== | |||
| */ | |||
| #include <JuceHeader.h> | |||
| #include "${JUCE_PIP_HEADER}" | |||
| class Application : public JUCEApplication | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| Application() {} | |||
| const String getApplicationName() override { return "${JUCE_PIP_NAME}"; } | |||
| const String getApplicationVersion() override { return "${PROJECT_VERSION}"; } | |||
| void initialise (const String&) override | |||
| { | |||
| mainWindow.reset (new MainWindow ("${JUCE_PIP_NAME}", new ${JUCE_PIP_MAIN_CLASS}, *this)); | |||
| } | |||
| void shutdown() override { mainWindow = nullptr; } | |||
| private: | |||
| class MainWindow : public DocumentWindow | |||
| { | |||
| public: | |||
| MainWindow (const String& name, Component* c, JUCEApplication& a) | |||
| : DocumentWindow (name, Desktop::getInstance().getDefaultLookAndFeel() | |||
| .findColour (ResizableWindow::backgroundColourId), | |||
| DocumentWindow::allButtons), | |||
| app (a) | |||
| { | |||
| setUsingNativeTitleBar (true); | |||
| setContentOwned (c, true); | |||
| #if JUCE_ANDROID || JUCE_IOS | |||
| setFullScreen (true); | |||
| #else | |||
| setResizable (true, false); | |||
| setResizeLimits (300, 250, 10000, 10000); | |||
| centreWithSize (getWidth(), getHeight()); | |||
| #endif | |||
| setVisible (true); | |||
| } | |||
| void closeButtonPressed() override | |||
| { | |||
| app.systemRequestedQuit(); | |||
| } | |||
| private: | |||
| JUCEApplication& app; | |||
| //============================================================================== | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow) | |||
| }; | |||
| std::unique_ptr<MainWindow> mainWindow; | |||
| }; | |||
| //============================================================================== | |||
| START_JUCE_APPLICATION (Application) | |||
| @@ -0,0 +1,10 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file was auto-generated and contains the startup code for a PIP. | |||
| ============================================================================== | |||
| */ | |||
| #include <JuceHeader.h> | |||
| #include "${JUCE_PIP_HEADER}" | |||
| @@ -6,24 +6,24 @@ using UnityEngine; | |||
| using System.Collections.Generic; | |||
| using System.Runtime.InteropServices; | |||
| public class %%plugin_class_name%%GUI : IAudioEffectPluginGUI | |||
| public class ${plugin_class_name}GUI : IAudioEffectPluginGUI | |||
| { | |||
| public override string Name { get { return "%%plugin_name%%"; } } | |||
| public override string Description { get { return "%%plugin_description%%"; } } | |||
| public override string Vendor { get { return "%%plugin_vendor%%"; } } | |||
| public override string Name { get { return "${plugin_name}"; } } | |||
| public override string Description { get { return "${plugin_description}"; } } | |||
| public override string Vendor { get { return "${plugin_vendor}"; } } | |||
| //============================================================================== | |||
| [DllImport("%%plugin_name%%")] static extern System.IntPtr getRenderCallback(); | |||
| [DllImport("${plugin_name}")] static extern System.IntPtr getRenderCallback(); | |||
| [DllImport("%%plugin_name%%")] static extern void unityInitialiseTexture (int id, System.IntPtr texture, int width, int height); | |||
| [DllImport("${plugin_name}")] static extern void unityInitialiseTexture (int id, System.IntPtr texture, int width, int height); | |||
| [DllImport("%%plugin_name%%")] static extern void unityMouseDown (int id, float x, float y, EventModifiers mods, int button); | |||
| [DllImport("%%plugin_name%%")] static extern void unityMouseDrag (int id, float x, float y, EventModifiers mods, int button); | |||
| [DllImport("%%plugin_name%%")] static extern void unityMouseUp (int id, float x, float y, EventModifiers mods); | |||
| [DllImport("${plugin_name}")] static extern void unityMouseDown (int id, float x, float y, EventModifiers mods, int button); | |||
| [DllImport("${plugin_name}")] static extern void unityMouseDrag (int id, float x, float y, EventModifiers mods, int button); | |||
| [DllImport("${plugin_name}")] static extern void unityMouseUp (int id, float x, float y, EventModifiers mods); | |||
| [DllImport("%%plugin_name%%")] static extern void unityKeyEvent (int id, KeyCode code, EventModifiers mods, string name); | |||
| [DllImport("${plugin_name}")] static extern void unityKeyEvent (int id, KeyCode code, EventModifiers mods, string name); | |||
| [DllImport("%%plugin_name%%")] static extern void unitySetScreenBounds (int id, float x, float y, float w, float h); | |||
| [DllImport("${plugin_name}")] static extern void unitySetScreenBounds (int id, float x, float y, float w, float h); | |||
| //============================================================================== | |||
| private class PluginGUIInstance | |||
| @@ -38,10 +38,10 @@ public class %%plugin_class_name%%GUI : IAudioEffectPluginGUI | |||
| } | |||
| public void repaint (Rect r) | |||
| { | |||
| { | |||
| Vector2 newScreenPosition = GUIUtility.GUIToScreenPoint (r.position); | |||
| if (bounds != r | |||
| if (bounds != r | |||
| || screenPosition != newScreenPosition) | |||
| { | |||
| screenPosition = newScreenPosition; | |||
| @@ -51,7 +51,7 @@ public class %%plugin_class_name%%GUI : IAudioEffectPluginGUI | |||
| setupTexture(); | |||
| } | |||
| GL.IssuePluginEvent (getRenderCallback(), instanceID); | |||
| GL.IssuePluginEvent (getRenderCallback(), instanceID); | |||
| texture.SetPixels32 (pixels); | |||
| texture.Apply(); | |||
| @@ -69,7 +69,7 @@ public class %%plugin_class_name%%GUI : IAudioEffectPluginGUI | |||
| Vector2 relativePos = new Vector2 (mousePos.x - bounds.x, mousePos.y - bounds.y); | |||
| if (eventType == EventType.MouseDown) | |||
| if (eventType == EventType.MouseDown) | |||
| { | |||
| unityMouseDown (instanceID, relativePos.x, relativePos.y, mods, Event.current.button); | |||
| GUIUtility.hotControl = GUIUtility.GetControlID (FocusType.Passive); | |||
| @@ -79,7 +79,7 @@ public class %%plugin_class_name%%GUI : IAudioEffectPluginGUI | |||
| unityMouseUp (instanceID, relativePos.x, relativePos.y, mods); | |||
| GUIUtility.hotControl = 0; | |||
| } | |||
| else if (eventType == EventType.MouseDrag) | |||
| else if (eventType == EventType.MouseDrag) | |||
| { | |||
| unityMouseDrag (instanceID, relativePos.x, relativePos.y, mods, Event.current.button); | |||
| } | |||
| @@ -0,0 +1,17 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| file(INSTALL ${src} DESTINATION ${dest}) | |||
| @@ -0,0 +1,20 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| juce_add_module(juce_build_tools ALIAS_NAMESPACE juce) | |||
| add_subdirectory(juceaide) | |||
| @@ -0,0 +1,40 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| #ifdef JUCE_BUILD_TOOLS_H_INCLUDED | |||
| /* When you add this cpp file to your project, you mustn't include it in a file where you've | |||
| already included any other headers - just put it inside a file on its own, possibly with your config | |||
| flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix | |||
| header files that the compiler may be using. | |||
| */ | |||
| #error "Incorrect use of JUCE cpp file" | |||
| #endif | |||
| #include "juce_build_tools.h" | |||
| #include <numeric> | |||
| #include "utils/juce_CppTokeniserFunctions.cpp" | |||
| #include "utils/juce_BuildHelperFunctions.cpp" | |||
| #include "utils/juce_BinaryResourceFile.cpp" | |||
| #include "utils/juce_Icons.cpp" | |||
| #include "utils/juce_PlistOptions.cpp" | |||
| #include "utils/juce_ResourceFileHelpers.cpp" | |||
| #include "utils/juce_ResourceRc.cpp" | |||
| #include "utils/juce_VersionNumbers.cpp" | |||
| #include "utils/juce_Entitlements.cpp" | |||
| @@ -0,0 +1,60 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| /******************************************************************************* | |||
| The block below describes the properties of this module, and is read by | |||
| the Projucer to automatically generate project code that uses it. | |||
| For details about the syntax and how to create or use a module, see the | |||
| JUCE Module Format.txt file. | |||
| BEGIN_JUCE_MODULE_DECLARATION | |||
| ID: juce_build_tools | |||
| vendor: juce | |||
| version: 6.0.0 | |||
| name: JUCE Build Tools | |||
| description: Classes for generating intermediate files for JUCE projects. | |||
| website: http://www.juce.com/juce | |||
| license: GPL/Commercial | |||
| dependencies: juce_gui_basics | |||
| END_JUCE_MODULE_DECLARATION | |||
| *******************************************************************************/ | |||
| // This module is shared by juceaide and the Projucer, but should not be | |||
| // considered 'public'. That is, its API, functionality, and contents (and | |||
| // existence!) may change between releases without warning. | |||
| #pragma once | |||
| #define JUCE_BUILD_TOOLS_H_INCLUDED | |||
| #include <juce_gui_basics/juce_gui_basics.h> | |||
| #include "utils/juce_ProjectType.h" | |||
| #include "utils/juce_BuildHelperFunctions.h" | |||
| #include "utils/juce_BinaryResourceFile.h" | |||
| #include "utils/juce_RelativePath.h" | |||
| #include "utils/juce_Icons.h" | |||
| #include "utils/juce_PlistOptions.h" | |||
| #include "utils/juce_ResourceFileHelpers.h" | |||
| #include "utils/juce_ResourceRc.h" | |||
| #include "utils/juce_VersionNumbers.h" | |||
| #include "utils/juce_Entitlements.h" | |||
| @@ -0,0 +1,280 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| static const char* resourceFileIdentifierString = "JUCER_BINARY_RESOURCE"; | |||
| //============================================================================== | |||
| void ResourceFile::setClassName (const String& name) | |||
| { | |||
| className = name; | |||
| } | |||
| void ResourceFile::addFile (const File& file) | |||
| { | |||
| files.add (file); | |||
| auto variableNameRoot = makeBinaryDataIdentifierName (file); | |||
| auto variableName = variableNameRoot; | |||
| int suffix = 2; | |||
| while (variableNames.contains (variableName)) | |||
| variableName = variableNameRoot + String (suffix++); | |||
| variableNames.add (variableName); | |||
| } | |||
| String ResourceFile::getDataVariableFor (const File& file) const | |||
| { | |||
| const auto index = files.indexOf (file); | |||
| jassert (index >= 0); | |||
| return variableNames[index]; | |||
| } | |||
| String ResourceFile::getSizeVariableFor (const File& file) const | |||
| { | |||
| return getDataVariableFor (file) + "Size"; | |||
| } | |||
| int64 ResourceFile::getTotalDataSize() const | |||
| { | |||
| return std::accumulate (files.begin(), | |||
| files.end(), | |||
| int64 { 0 }, | |||
| [] (int64 acc, const File& f) { return acc + f.getSize(); }); | |||
| } | |||
| static void writeComment (MemoryOutputStream& mo) | |||
| { | |||
| mo << newLine << newLine | |||
| << " This is an auto-generated file: Any edits you make may be overwritten!" << newLine | |||
| << newLine | |||
| << "*/" << newLine | |||
| << newLine; | |||
| } | |||
| Result ResourceFile::writeHeader (MemoryOutputStream& header) | |||
| { | |||
| header << "/* ========================================================================================="; | |||
| writeComment (header); | |||
| header << "#pragma once" << newLine | |||
| << newLine | |||
| << "namespace " << className << newLine | |||
| << "{" << newLine; | |||
| for (int i = 0; i < files.size(); ++i) | |||
| { | |||
| auto& file = files.getReference(i); | |||
| if (! file.existsAsFile()) | |||
| return Result::fail ("Can't open resource file: " + file.getFullPathName()); | |||
| auto dataSize = file.getSize(); | |||
| auto variableName = variableNames[i]; | |||
| FileInputStream fileStream (file); | |||
| if (fileStream.openedOk()) | |||
| { | |||
| header << " extern const char* " << variableName << ";" << newLine; | |||
| header << " const int " << variableName << "Size = " << (int) dataSize << ";" << newLine << newLine; | |||
| } | |||
| } | |||
| header << " // Number of elements in the namedResourceList and originalFileNames arrays." << newLine | |||
| << " const int namedResourceListSize = " << files.size() << ";" << newLine | |||
| << newLine | |||
| << " // Points to the start of a list of resource names." << newLine | |||
| << " extern const char* namedResourceList[];" << newLine | |||
| << newLine | |||
| << " // Points to the start of a list of resource filenames." << newLine | |||
| << " extern const char* originalFilenames[];" << newLine | |||
| << newLine | |||
| << " // If you provide the name of one of the binary resource variables above, this function will" << newLine | |||
| << " // return the corresponding data and its size (or a null pointer if the name isn't found)." << newLine | |||
| << " const char* getNamedResource (const char* resourceNameUTF8, int& dataSizeInBytes);" << newLine | |||
| << newLine | |||
| << " // If you provide the name of one of the binary resource variables above, this function will" << newLine | |||
| << " // return the corresponding original, non-mangled filename (or a null pointer if the name isn't found)." << newLine | |||
| << " const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8);" << newLine | |||
| << "}" << newLine; | |||
| return Result::ok(); | |||
| } | |||
| Result ResourceFile::writeCpp (MemoryOutputStream& cpp, const File& headerFile, int& i, const int maxFileSize) | |||
| { | |||
| bool isFirstFile = (i == 0); | |||
| cpp << "/* ==================================== " << resourceFileIdentifierString << " ===================================="; | |||
| writeComment (cpp); | |||
| cpp << "namespace " << className << newLine | |||
| << "{" << newLine; | |||
| while (i < files.size()) | |||
| { | |||
| auto& file = files.getReference(i); | |||
| auto variableName = variableNames[i]; | |||
| FileInputStream fileStream (file); | |||
| if (fileStream.openedOk()) | |||
| { | |||
| auto tempVariable = "temp_binary_data_" + String (i); | |||
| cpp << newLine << "//================== " << file.getFileName() << " ==================" << newLine | |||
| << "static const unsigned char " << tempVariable << "[] =" << newLine; | |||
| { | |||
| MemoryBlock data; | |||
| fileStream.readIntoMemoryBlock (data); | |||
| writeDataAsCppLiteral (data, cpp, true, true); | |||
| } | |||
| cpp << newLine << newLine | |||
| << "const char* " << variableName << " = (const char*) " << tempVariable << ";" << newLine; | |||
| } | |||
| ++i; | |||
| if (cpp.getPosition() > maxFileSize) | |||
| break; | |||
| } | |||
| if (isFirstFile) | |||
| { | |||
| if (i < files.size()) | |||
| { | |||
| cpp << newLine | |||
| << "}" << newLine | |||
| << newLine | |||
| << "#include \"" << headerFile.getFileName() << "\"" << newLine | |||
| << newLine | |||
| << "namespace " << className << newLine | |||
| << "{"; | |||
| } | |||
| cpp << newLine | |||
| << newLine | |||
| << "const char* getNamedResource (const char* resourceNameUTF8, int& numBytes)" << newLine | |||
| << "{" << newLine; | |||
| StringArray returnCodes; | |||
| for (auto& file : files) | |||
| { | |||
| auto dataSize = file.getSize(); | |||
| returnCodes.add ("numBytes = " + String (dataSize) + "; return " + variableNames[files.indexOf (file)] + ";"); | |||
| } | |||
| createStringMatcher (cpp, "resourceNameUTF8", variableNames, returnCodes, 4); | |||
| cpp << " numBytes = 0;" << newLine | |||
| << " return nullptr;" << newLine | |||
| << "}" << newLine | |||
| << newLine; | |||
| cpp << "const char* namedResourceList[] =" << newLine | |||
| << "{" << newLine; | |||
| for (int j = 0; j < files.size(); ++j) | |||
| cpp << " " << variableNames[j].quoted() << (j < files.size() - 1 ? "," : "") << newLine; | |||
| cpp << "};" << newLine << newLine; | |||
| cpp << "const char* originalFilenames[] =" << newLine | |||
| << "{" << newLine; | |||
| for (auto& f : files) | |||
| cpp << " " << f.getFileName().quoted() << (files.indexOf (f) < files.size() - 1 ? "," : "") << newLine; | |||
| cpp << "};" << newLine << newLine; | |||
| cpp << "const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8)" << newLine | |||
| << "{" << newLine | |||
| << " for (unsigned int i = 0; i < (sizeof (namedResourceList) / sizeof (namedResourceList[0])); ++i)" << newLine | |||
| << " {" << newLine | |||
| << " if (namedResourceList[i] == resourceNameUTF8)" << newLine | |||
| << " return originalFilenames[i];" << newLine | |||
| << " }" << newLine | |||
| << newLine | |||
| << " return nullptr;" << newLine | |||
| << "}" << newLine | |||
| << newLine; | |||
| } | |||
| cpp << "}" << newLine; | |||
| return Result::ok(); | |||
| } | |||
| ResourceFile::WriteResult ResourceFile::write (int maxFileSize, | |||
| String projectLineFeed, | |||
| File headerFile, | |||
| std::function<File (int)> getCppFile) | |||
| { | |||
| Array<File> filesCreated; | |||
| { | |||
| MemoryOutputStream mo; | |||
| mo.setNewLineString (projectLineFeed); | |||
| auto r = writeHeader (mo); | |||
| if (r.failed()) | |||
| return { r }; | |||
| if (! overwriteFileWithNewDataIfDifferent (headerFile, mo)) | |||
| return { Result::fail ("Can't write to file: " + headerFile.getFullPathName()) }; | |||
| filesCreated.add (headerFile); | |||
| } | |||
| int i = 0; | |||
| int fileIndex = 0; | |||
| for (;;) | |||
| { | |||
| auto cpp = getCppFile (fileIndex); | |||
| MemoryOutputStream mo; | |||
| mo.setNewLineString (projectLineFeed); | |||
| auto r = writeCpp (mo, headerFile, i, maxFileSize); | |||
| if (r.failed()) | |||
| return { r, std::move (filesCreated) }; | |||
| if (! overwriteFileWithNewDataIfDifferent (cpp, mo)) | |||
| return { Result::fail ("Can't write to file: " + cpp.getFullPathName()), std::move (filesCreated) }; | |||
| filesCreated.add (cpp); | |||
| ++fileIndex; | |||
| if (i >= files.size()) | |||
| break; | |||
| } | |||
| return { Result::ok(), std::move (filesCreated) }; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,67 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| class ResourceFile | |||
| { | |||
| public: | |||
| ResourceFile() = default; | |||
| void setClassName (const String& className); | |||
| String getClassName() const { return className; } | |||
| void addFile (const File& file); | |||
| String getDataVariableFor (const File& file) const; | |||
| String getSizeVariableFor (const File& file) const; | |||
| int getNumFiles() const { return files.size (); } | |||
| const File& getFile (int index) const { return files.getReference (index); } | |||
| int64 getTotalDataSize() const; | |||
| struct WriteResult | |||
| { | |||
| Result result; | |||
| Array<File> filesCreated; | |||
| }; | |||
| WriteResult write (int maxFileSize, | |||
| String projectLineFeed, | |||
| File headerFile, | |||
| std::function<File (int)> getCppFile); | |||
| private: | |||
| Array<File> files; | |||
| StringArray variableNames; | |||
| String className { "BinaryData" }; | |||
| Result writeHeader (MemoryOutputStream&); | |||
| Result writeCpp (MemoryOutputStream&, const File&, int&, int); | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ResourceFile) | |||
| }; | |||
| } | |||
| } | |||
| @@ -0,0 +1,344 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| void overwriteFileIfDifferentOrThrow (const File& file, const MemoryOutputStream& newData) | |||
| { | |||
| if (! overwriteFileWithNewDataIfDifferent (file, newData)) | |||
| throw SaveError (file); | |||
| } | |||
| void overwriteFileIfDifferentOrThrow (const File& file, const String& newData) | |||
| { | |||
| if (! overwriteFileWithNewDataIfDifferent (file, newData)) | |||
| throw SaveError (file); | |||
| } | |||
| String replacePreprocessorDefs (const StringPairArray& definitions, String sourceString) | |||
| { | |||
| for (int i = 0; i < definitions.size(); ++i) | |||
| { | |||
| const String key (definitions.getAllKeys()[i]); | |||
| const String value (definitions.getAllValues()[i]); | |||
| sourceString = sourceString.replace ("${" + key + "}", value); | |||
| } | |||
| return sourceString; | |||
| } | |||
| String getXcodePackageType (ProjectType::Target::Type type) | |||
| { | |||
| switch (type) | |||
| { | |||
| case ProjectType::Target::Type::GUIApp: | |||
| case ProjectType::Target::Type::StandalonePlugIn: | |||
| return "APPL"; | |||
| case ProjectType::Target::Type::VSTPlugIn: | |||
| case ProjectType::Target::Type::VST3PlugIn: | |||
| case ProjectType::Target::Type::AudioUnitPlugIn: | |||
| case ProjectType::Target::Type::UnityPlugIn: | |||
| return "BNDL"; | |||
| case ProjectType::Target::Type::AudioUnitv3PlugIn: | |||
| return "XPC!"; | |||
| case ProjectType::Target::Type::AAXPlugIn: | |||
| case ProjectType::Target::Type::RTASPlugIn: | |||
| return "TDMw"; | |||
| case ProjectType::Target::Type::ConsoleApp: | |||
| case ProjectType::Target::Type::StaticLibrary: | |||
| case ProjectType::Target::Type::DynamicLibrary: | |||
| case ProjectType::Target::Type::SharedCodeTarget: | |||
| case ProjectType::Target::Type::AggregateTarget: | |||
| case ProjectType::Target::Type::unspecified: | |||
| default: | |||
| return {}; | |||
| } | |||
| } | |||
| String getXcodeBundleSignature (ProjectType::Target::Type type) | |||
| { | |||
| switch (type) | |||
| { | |||
| case ProjectType::Target::Type::GUIApp: | |||
| case ProjectType::Target::Type::VSTPlugIn: | |||
| case ProjectType::Target::Type::VST3PlugIn: | |||
| case ProjectType::Target::Type::AudioUnitPlugIn: | |||
| case ProjectType::Target::Type::StandalonePlugIn: | |||
| case ProjectType::Target::Type::AudioUnitv3PlugIn: | |||
| case ProjectType::Target::Type::UnityPlugIn: | |||
| return "????"; | |||
| case ProjectType::Target::Type::AAXPlugIn: | |||
| case ProjectType::Target::Type::RTASPlugIn: | |||
| return "PTul"; | |||
| case ProjectType::Target::Type::ConsoleApp: | |||
| case ProjectType::Target::Type::StaticLibrary: | |||
| case ProjectType::Target::Type::DynamicLibrary: | |||
| case ProjectType::Target::Type::SharedCodeTarget: | |||
| case ProjectType::Target::Type::AggregateTarget: | |||
| case ProjectType::Target::Type::unspecified: | |||
| default: | |||
| return {}; | |||
| } | |||
| } | |||
| static unsigned int calculateHash (const String& s, const unsigned int hashMultiplier) | |||
| { | |||
| auto t = s.toUTF8(); | |||
| unsigned int hash = 0; | |||
| while (*t != 0) | |||
| hash = hashMultiplier * hash + (unsigned int) *t++; | |||
| return hash; | |||
| } | |||
| static unsigned int findBestHashMultiplier (const StringArray& strings) | |||
| { | |||
| unsigned int v = 31; | |||
| for (;;) | |||
| { | |||
| SortedSet<unsigned int> hashes; | |||
| bool collision = false; | |||
| for (int i = strings.size(); --i >= 0;) | |||
| { | |||
| auto hash = calculateHash (strings[i], v); | |||
| if (hashes.contains (hash)) | |||
| { | |||
| collision = true; | |||
| break; | |||
| } | |||
| hashes.add (hash); | |||
| } | |||
| if (! collision) | |||
| break; | |||
| v += 2; | |||
| } | |||
| return v; | |||
| } | |||
| String makeValidIdentifier (String s, bool capitalise, bool removeColons, bool allowTemplates, bool allowAsterisks) | |||
| { | |||
| if (s.isEmpty()) | |||
| return "unknown"; | |||
| if (removeColons) | |||
| s = s.replaceCharacters (".,;:/@", "______"); | |||
| else | |||
| s = s.replaceCharacters (".,;/@", "_____"); | |||
| for (int i = s.length(); --i > 0;) | |||
| if (CharacterFunctions::isLetter (s[i]) | |||
| && CharacterFunctions::isLetter (s[i - 1]) | |||
| && CharacterFunctions::isUpperCase (s[i]) | |||
| && ! CharacterFunctions::isUpperCase (s[i - 1])) | |||
| s = s.substring (0, i) + " " + s.substring (i); | |||
| String allowedChars ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ 0123456789"); | |||
| if (allowTemplates) | |||
| allowedChars += "<>"; | |||
| if (! removeColons) | |||
| allowedChars += ":"; | |||
| if (allowAsterisks) | |||
| allowedChars += "*"; | |||
| StringArray words; | |||
| words.addTokens (s.retainCharacters (allowedChars), false); | |||
| words.trim(); | |||
| auto n = words[0]; | |||
| if (capitalise) | |||
| n = n.toLowerCase(); | |||
| for (int i = 1; i < words.size(); ++i) | |||
| { | |||
| if (capitalise && words[i].length() > 1) | |||
| n << words[i].substring (0, 1).toUpperCase() | |||
| << words[i].substring (1).toLowerCase(); | |||
| else | |||
| n << words[i]; | |||
| } | |||
| if (CharacterFunctions::isDigit (n[0])) | |||
| n = "_" + n; | |||
| if (isReservedKeyword (n)) | |||
| n << '_'; | |||
| return n; | |||
| } | |||
| String makeBinaryDataIdentifierName (const File& file) | |||
| { | |||
| return makeValidIdentifier (file.getFileName() | |||
| .replaceCharacters (" .", "__") | |||
| .retainCharacters ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789"), | |||
| false, true, false); | |||
| } | |||
| void writeDataAsCppLiteral (const MemoryBlock& mb, OutputStream& out, | |||
| bool breakAtNewLines, bool allowStringBreaks) | |||
| { | |||
| const int maxCharsOnLine = 250; | |||
| auto data = (const unsigned char*) mb.getData(); | |||
| int charsOnLine = 0; | |||
| bool canUseStringLiteral = mb.getSize() < 32768; // MS compilers can't handle big string literals.. | |||
| if (canUseStringLiteral) | |||
| { | |||
| unsigned int numEscaped = 0; | |||
| for (size_t i = 0; i < mb.getSize(); ++i) | |||
| { | |||
| auto num = (unsigned int) data[i]; | |||
| if (! ((num >= 32 && num < 127) || num == '\t' || num == '\r' || num == '\n')) | |||
| { | |||
| if (++numEscaped > mb.getSize() / 4) | |||
| { | |||
| canUseStringLiteral = false; | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| if (! canUseStringLiteral) | |||
| { | |||
| out << "{ "; | |||
| for (size_t i = 0; i < mb.getSize(); ++i) | |||
| { | |||
| auto num = (int) (unsigned int) data[i]; | |||
| out << num << ','; | |||
| charsOnLine += 2; | |||
| if (num >= 10) | |||
| { | |||
| ++charsOnLine; | |||
| if (num >= 100) | |||
| ++charsOnLine; | |||
| } | |||
| if (charsOnLine >= maxCharsOnLine) | |||
| { | |||
| charsOnLine = 0; | |||
| out << newLine; | |||
| } | |||
| } | |||
| out << "0,0 };"; | |||
| } | |||
| else | |||
| { | |||
| out << "\""; | |||
| writeEscapeChars (out, (const char*) data, (int) mb.getSize(), | |||
| maxCharsOnLine, breakAtNewLines, false, allowStringBreaks); | |||
| out << "\";"; | |||
| } | |||
| } | |||
| void createStringMatcher (OutputStream& out, const String& utf8PointerVariable, | |||
| const StringArray& strings, const StringArray& codeToExecute, const int indentLevel) | |||
| { | |||
| jassert (strings.size() == codeToExecute.size()); | |||
| auto indent = String::repeatedString (" ", indentLevel); | |||
| auto hashMultiplier = findBestHashMultiplier (strings); | |||
| out << indent << "unsigned int hash = 0;" << newLine | |||
| << newLine | |||
| << indent << "if (" << utf8PointerVariable << " != nullptr)" << newLine | |||
| << indent << " while (*" << utf8PointerVariable << " != 0)" << newLine | |||
| << indent << " hash = " << (int) hashMultiplier << " * hash + (unsigned int) *" << utf8PointerVariable << "++;" << newLine | |||
| << newLine | |||
| << indent << "switch (hash)" << newLine | |||
| << indent << "{" << newLine; | |||
| for (int i = 0; i < strings.size(); ++i) | |||
| { | |||
| out << indent << " case 0x" << hexString8Digits ((int) calculateHash (strings[i], hashMultiplier)) | |||
| << ": " << codeToExecute[i] << newLine; | |||
| } | |||
| out << indent << " default: break;" << newLine | |||
| << indent << "}" << newLine << newLine; | |||
| } | |||
| String unixStylePath (const String& path) { return path.replaceCharacter ('\\', '/'); } | |||
| String windowsStylePath (const String& path) { return path.replaceCharacter ('/', '\\'); } | |||
| String currentOSStylePath (const String& path) | |||
| { | |||
| #if JUCE_WINDOWS | |||
| return windowsStylePath (path); | |||
| #else | |||
| return unixStylePath (path); | |||
| #endif | |||
| } | |||
| bool isAbsolutePath (const String& path) | |||
| { | |||
| return File::isAbsolutePath (path) | |||
| || path.startsWithChar ('/') // (needed because File::isAbsolutePath will ignore forward-slashes on Windows) | |||
| || path.startsWithChar ('$') | |||
| || path.startsWithChar ('~') | |||
| || (CharacterFunctions::isLetter (path[0]) && path[1] == ':') | |||
| || path.startsWithIgnoreCase ("smb:"); | |||
| } | |||
| String getRelativePathFrom (const File& file, const File& sourceFolder) | |||
| { | |||
| #if ! JUCE_WINDOWS | |||
| // On a non-windows machine, we can't know if a drive-letter path may be relative or not. | |||
| if (CharacterFunctions::isLetter (file.getFullPathName()[0]) && file.getFullPathName()[1] == ':') | |||
| return file.getFullPathName(); | |||
| #endif | |||
| return file.getRelativePathFrom (sourceFolder); | |||
| } | |||
| void writeStreamToFile (const File& file, const std::function<void (MemoryOutputStream&)>& writer) | |||
| { | |||
| MemoryOutputStream mo; | |||
| writer (mo); | |||
| overwriteFileIfDifferentOrThrow (file, mo); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,79 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| void overwriteFileIfDifferentOrThrow (const File& file, const MemoryOutputStream& newData); | |||
| void overwriteFileIfDifferentOrThrow (const File& file, const String& newData); | |||
| class SaveError | |||
| { | |||
| public: | |||
| SaveError (const String& error) : message (error) | |||
| {} | |||
| SaveError (const File& fileThatFailedToWrite) | |||
| : message ("Can't write to the file: " + fileThatFailedToWrite.getFullPathName()) | |||
| {} | |||
| String message; | |||
| }; | |||
| String replacePreprocessorDefs (const StringPairArray& definitions, String sourceString); | |||
| String getXcodePackageType (ProjectType::Target::Type); | |||
| String getXcodeBundleSignature (ProjectType::Target::Type); | |||
| inline String hexString8Digits (int value) | |||
| { | |||
| return String::toHexString (value).paddedLeft ('0', 8); | |||
| } | |||
| String makeValidIdentifier (String s, | |||
| bool capitalise, | |||
| bool removeColons, | |||
| bool allowTemplates, | |||
| bool allowAsterisks = false); | |||
| String makeBinaryDataIdentifierName (const File& file); | |||
| void writeDataAsCppLiteral (const MemoryBlock& mb, | |||
| OutputStream& out, | |||
| bool breakAtNewLines, | |||
| bool allowStringBreaks); | |||
| void createStringMatcher (OutputStream& out, | |||
| const String& utf8PointerVariable, | |||
| const StringArray& strings, | |||
| const StringArray& codeToExecute, | |||
| const int indentLevel); | |||
| String unixStylePath (const String& path); | |||
| String windowsStylePath (const String& path); | |||
| String currentOSStylePath (const String& path); | |||
| bool isAbsolutePath (const String& path); | |||
| // A windows-aware version of File::getRelativePath() | |||
| String getRelativePathFrom (const File& file, const File& sourceFolder); | |||
| void writeStreamToFile (const File& file, const std::function<void (MemoryOutputStream&)>& writer); | |||
| } | |||
| } | |||
| @@ -0,0 +1,214 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| static bool isReservedKeyword (String::CharPointerType token, const int tokenLength) noexcept | |||
| { | |||
| static const char* const keywords2Char[] = | |||
| { "do", "if", "or", nullptr }; | |||
| static const char* const keywords3Char[] = | |||
| { "and", "asm", "for", "int", "new", "not", "try", "xor", nullptr }; | |||
| static const char* const keywords4Char[] = | |||
| { "auto", "bool", "case", "char", "else", "enum", "goto", | |||
| "long", "this", "true", "void", nullptr }; | |||
| static const char* const keywords5Char[] = | |||
| { "bitor", "break", "catch", "class", "compl", "const", "false", "final", | |||
| "float", "or_eq", "short", "throw", "union", "using", "while", nullptr }; | |||
| static const char* const keywords6Char[] = | |||
| { "and_eq", "bitand", "delete", "double", "export", "extern", "friend", | |||
| "import", "inline", "module", "not_eq", "public", "return", "signed", | |||
| "sizeof", "static", "struct", "switch", "typeid", "xor_eq", nullptr }; | |||
| static const char* const keywords7Char[] = | |||
| { "__cdecl", "_Pragma", "alignas", "alignof", "concept", "default", | |||
| "mutable", "nullptr", "private", "typedef", "uint8_t", "virtual", | |||
| "wchar_t", nullptr }; | |||
| static const char* const keywordsOther[] = | |||
| { "@class", "@dynamic", "@end", "@implementation", "@interface", "@public", | |||
| "@private", "@protected", "@property", "@synthesize", "__fastcall", "__stdcall", | |||
| "atomic_cancel", "atomic_commit", "atomic_noexcept", "char16_t", "char32_t", | |||
| "co_await", "co_return", "co_yield", "const_cast", "constexpr", "continue", | |||
| "decltype", "dynamic_cast", "explicit", "namespace", "noexcept", "operator", "override", | |||
| "protected", "register", "reinterpret_cast", "requires", "static_assert", | |||
| "static_cast", "synchronized", "template", "thread_local", "typename", "unsigned", | |||
| "volatile", nullptr }; | |||
| const char* const* k; | |||
| switch (tokenLength) | |||
| { | |||
| case 2: k = keywords2Char; break; | |||
| case 3: k = keywords3Char; break; | |||
| case 4: k = keywords4Char; break; | |||
| case 5: k = keywords5Char; break; | |||
| case 6: k = keywords6Char; break; | |||
| case 7: k = keywords7Char; break; | |||
| default: | |||
| if (tokenLength < 2 || tokenLength > 16) | |||
| return false; | |||
| k = keywordsOther; | |||
| break; | |||
| } | |||
| for (int i = 0; k[i] != nullptr; ++i) | |||
| if (token.compare (CharPointer_ASCII (k[i])) == 0) | |||
| return true; | |||
| return false; | |||
| } | |||
| static bool isReservedKeyword (const String& token) noexcept | |||
| { | |||
| return isReservedKeyword (token.getCharPointer(), token.length()); | |||
| } | |||
| //============================================================================== | |||
| /** Takes a UTF8 string and writes it to a stream using standard C++ escape sequences for any | |||
| non-ascii bytes. | |||
| Although not strictly a tokenising function, this is still a function that often comes in | |||
| handy when working with C++ code! | |||
| Note that addEscapeChars() is easier to use than this function if you're working with Strings. | |||
| @see addEscapeChars | |||
| */ | |||
| static void writeEscapeChars (OutputStream& out, const char* utf8, const int numBytesToRead, | |||
| const int maxCharsOnLine, const bool breakAtNewLines, | |||
| const bool replaceSingleQuotes, const bool allowStringBreaks) | |||
| { | |||
| int charsOnLine = 0; | |||
| bool lastWasHexEscapeCode = false; | |||
| bool trigraphDetected = false; | |||
| for (int i = 0; i < numBytesToRead || numBytesToRead < 0; ++i) | |||
| { | |||
| auto c = (unsigned char) utf8[i]; | |||
| bool startNewLine = false; | |||
| switch (c) | |||
| { | |||
| case '\t': out << "\\t"; trigraphDetected = false; lastWasHexEscapeCode = false; charsOnLine += 2; break; | |||
| case '\r': out << "\\r"; trigraphDetected = false; lastWasHexEscapeCode = false; charsOnLine += 2; break; | |||
| case '\n': out << "\\n"; trigraphDetected = false; lastWasHexEscapeCode = false; charsOnLine += 2; startNewLine = breakAtNewLines; break; | |||
| case '\\': out << "\\\\"; trigraphDetected = false; lastWasHexEscapeCode = false; charsOnLine += 2; break; | |||
| case '\"': out << "\\\""; trigraphDetected = false; lastWasHexEscapeCode = false; charsOnLine += 2; break; | |||
| case '?': | |||
| if (trigraphDetected) | |||
| { | |||
| out << "\\?"; | |||
| charsOnLine++; | |||
| trigraphDetected = false; | |||
| } | |||
| else | |||
| { | |||
| out << "?"; | |||
| trigraphDetected = true; | |||
| } | |||
| lastWasHexEscapeCode = false; | |||
| charsOnLine++; | |||
| break; | |||
| case 0: | |||
| if (numBytesToRead < 0) | |||
| return; | |||
| out << "\\0"; | |||
| lastWasHexEscapeCode = true; | |||
| trigraphDetected = false; | |||
| charsOnLine += 2; | |||
| break; | |||
| case '\'': | |||
| if (replaceSingleQuotes) | |||
| { | |||
| out << "\\\'"; | |||
| lastWasHexEscapeCode = false; | |||
| trigraphDetected = false; | |||
| charsOnLine += 2; | |||
| break; | |||
| } | |||
| // deliberate fall-through... | |||
| default: | |||
| if (c >= 32 && c < 127 && ! (lastWasHexEscapeCode // (have to avoid following a hex escape sequence with a valid hex digit) | |||
| && CharacterFunctions::getHexDigitValue (c) >= 0)) | |||
| { | |||
| out << (char) c; | |||
| lastWasHexEscapeCode = false; | |||
| trigraphDetected = false; | |||
| ++charsOnLine; | |||
| } | |||
| else if (allowStringBreaks && lastWasHexEscapeCode && c >= 32 && c < 127) | |||
| { | |||
| out << "\"\"" << (char) c; | |||
| lastWasHexEscapeCode = false; | |||
| trigraphDetected = false; | |||
| charsOnLine += 3; | |||
| } | |||
| else | |||
| { | |||
| out << (c < 16 ? "\\x0" : "\\x") << String::toHexString ((int) c); | |||
| lastWasHexEscapeCode = true; | |||
| trigraphDetected = false; | |||
| charsOnLine += 4; | |||
| } | |||
| break; | |||
| } | |||
| if ((startNewLine || (maxCharsOnLine > 0 && charsOnLine >= maxCharsOnLine)) | |||
| && (numBytesToRead < 0 || i < numBytesToRead - 1)) | |||
| { | |||
| charsOnLine = 0; | |||
| out << "\"" << newLine << "\""; | |||
| lastWasHexEscapeCode = false; | |||
| } | |||
| } | |||
| } | |||
| /** Takes a string and returns a version of it where standard C++ escape sequences have been | |||
| used to replace any non-ascii bytes. | |||
| Although not strictly a tokenising function, this is still a function that often comes in | |||
| handy when working with C++ code! | |||
| @see writeEscapeChars | |||
| */ | |||
| static String addEscapeChars (const String& s) | |||
| { | |||
| MemoryOutputStream mo; | |||
| writeEscapeChars (mo, s.toRawUTF8(), -1, -1, false, true, true); | |||
| return mo.toString(); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,109 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| String EntitlementOptions::getEntitlementsFileContent() const | |||
| { | |||
| String content = | |||
| "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" | |||
| "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" | |||
| "<plist version=\"1.0\">\n" | |||
| "<dict>\n"; | |||
| const auto entitlements = getEntitlements(); | |||
| for (auto& key : entitlements.getAllKeys()) | |||
| content += "\t<key>" + key + "</key>\n\t" + entitlements[key] + "\n"; | |||
| return content + "</dict>\n</plist>\n"; | |||
| } | |||
| StringPairArray EntitlementOptions::getEntitlements() const | |||
| { | |||
| StringPairArray entitlements; | |||
| if (isiOS) | |||
| { | |||
| if (isAudioPluginProject && shouldEnableIAA) | |||
| entitlements.set ("inter-app-audio", "<true/>"); | |||
| if (isiCloudPermissionsEnabled) | |||
| { | |||
| entitlements.set ("com.apple.developer.icloud-container-identifiers", | |||
| "<array>\n" | |||
| " <string>iCloud.$(CFBundleIdentifier)</string>\n" | |||
| " </array>"); | |||
| entitlements.set ("com.apple.developer.icloud-services", | |||
| "<array>\n" | |||
| " <string>CloudDocuments</string>\n" | |||
| " </array>"); | |||
| entitlements.set ("com.apple.developer.ubiquity-container-identifiers", | |||
| "<array>\n" | |||
| " <string>iCloud.$(CFBundleIdentifier)</string>\n" | |||
| " </array>"); | |||
| } | |||
| } | |||
| if (isPushNotificationsEnabled) | |||
| entitlements.set (isiOS ? "aps-environment" | |||
| : "com.apple.developer.aps-environment", | |||
| "<string>development</string>"); | |||
| if (isAppGroupsEnabled) | |||
| { | |||
| auto appGroups = StringArray::fromTokens (appGroupIdString, ";", {}); | |||
| auto groups = String ("<array>"); | |||
| for (auto group : appGroups) | |||
| groups += "\n\t\t<string>" + group.trim() + "</string>"; | |||
| groups += "\n\t</array>"; | |||
| entitlements.set ("com.apple.security.application-groups", groups); | |||
| } | |||
| if (isHardenedRuntimeEnabled) | |||
| for (auto& option : hardenedRuntimeOptions) | |||
| entitlements.set (option, "<true/>"); | |||
| if (isAppSandboxEnabled || (! isiOS && isAudioPluginProject && type == ProjectType::Target::AudioUnitv3PlugIn)) | |||
| { | |||
| entitlements.set ("com.apple.security.app-sandbox", "<true/>"); | |||
| if (isAppSandboxInhertianceEnabled) | |||
| { | |||
| // no other sandbox options can be specified if sandbox inheritance is enabled! | |||
| jassert (appSandboxOptions.isEmpty()); | |||
| entitlements.set ("com.apple.security.inherit", "<true/>"); | |||
| } | |||
| if (isAppSandboxEnabled) | |||
| for (auto& option : appSandboxOptions) | |||
| entitlements.set (option, "<true/>"); | |||
| } | |||
| return entitlements; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,48 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| struct EntitlementOptions final | |||
| { | |||
| String getEntitlementsFileContent() const; | |||
| ProjectType::Target::Type type = ProjectType::Target::GUIApp; | |||
| bool isiOS = false; | |||
| bool isAudioPluginProject = false; | |||
| bool shouldEnableIAA = false; | |||
| bool isiCloudPermissionsEnabled = false; | |||
| bool isPushNotificationsEnabled = false; | |||
| bool isAppGroupsEnabled = false; | |||
| bool isHardenedRuntimeEnabled = false; | |||
| bool isAppSandboxEnabled = false; | |||
| bool isAppSandboxInhertianceEnabled = false; | |||
| String appGroupIdString; | |||
| StringArray hardenedRuntimeOptions; | |||
| StringArray appSandboxOptions; | |||
| private: | |||
| StringPairArray getEntitlements() const; | |||
| }; | |||
| } | |||
| } | |||
| @@ -0,0 +1,497 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| Array<Drawable*> asArray (const Icons& icons) | |||
| { | |||
| Array<Drawable*> result; | |||
| if (icons.small != nullptr) | |||
| result.add (icons.small.get()); | |||
| if (icons.big != nullptr) | |||
| result.add (icons.big.get()); | |||
| return result; | |||
| } | |||
| namespace mac | |||
| { | |||
| static Image fixIconImageSize (Drawable& image) | |||
| { | |||
| const int validSizes[] = { 16, 32, 64, 128, 256, 512, 1024 }; | |||
| auto w = image.getWidth(); | |||
| auto h = image.getHeight(); | |||
| int bestSize = 16; | |||
| for (int size : validSizes) | |||
| { | |||
| if (w == h && w == size) | |||
| { | |||
| bestSize = w; | |||
| break; | |||
| } | |||
| if (jmax (w, h) > size) | |||
| bestSize = size; | |||
| } | |||
| return rescaleImageForIcon (image, bestSize); | |||
| } | |||
| static void writeIconData (MemoryOutputStream& out, const Image& image, const char* type) | |||
| { | |||
| MemoryOutputStream pngData; | |||
| PNGImageFormat pngFormat; | |||
| pngFormat.writeImageToStream (image, pngData); | |||
| out.write (type, 4); | |||
| out.writeIntBigEndian (8 + (int) pngData.getDataSize()); | |||
| out << pngData; | |||
| } | |||
| } // namespace mac | |||
| void writeMacIcon (const Icons& icons, OutputStream& out) | |||
| { | |||
| MemoryOutputStream data; | |||
| auto smallest = std::numeric_limits<int>::max(); | |||
| Drawable* smallestImage = nullptr; | |||
| const auto images = asArray (icons); | |||
| for (int i = 0; i < images.size(); ++i) | |||
| { | |||
| auto image = mac::fixIconImageSize (*images[i]); | |||
| jassert (image.getWidth() == image.getHeight()); | |||
| if (image.getWidth() < smallest) | |||
| { | |||
| smallest = image.getWidth(); | |||
| smallestImage = images[i]; | |||
| } | |||
| switch (image.getWidth()) | |||
| { | |||
| case 16: mac::writeIconData (data, image, "icp4"); break; | |||
| case 32: mac::writeIconData (data, image, "icp5"); break; | |||
| case 64: mac::writeIconData (data, image, "icp6"); break; | |||
| case 128: mac::writeIconData (data, image, "ic07"); break; | |||
| case 256: mac::writeIconData (data, image, "ic08"); break; | |||
| case 512: mac::writeIconData (data, image, "ic09"); break; | |||
| case 1024: mac::writeIconData (data, image, "ic10"); break; | |||
| default: break; | |||
| } | |||
| } | |||
| jassert (data.getDataSize() > 0); // no suitable sized images? | |||
| // If you only supply a 1024 image, the file doesn't work on 10.8, so we need | |||
| // to force a smaller one in there too.. | |||
| if (smallest > 512 && smallestImage != nullptr) | |||
| mac::writeIconData (data, rescaleImageForIcon (*smallestImage, 512), "ic09"); | |||
| out.write ("icns", 4); | |||
| out.writeIntBigEndian ((int) data.getDataSize() + 8); | |||
| out << data; | |||
| } | |||
| Image getBestIconForSize (const Icons& icons, | |||
| int size, | |||
| bool returnNullIfNothingBigEnough) | |||
| { | |||
| auto* const im = [&]() -> Drawable* | |||
| { | |||
| if ((icons.small != nullptr) != (icons.big != nullptr)) | |||
| return icons.small != nullptr ? icons.small.get() : icons.big.get(); | |||
| if (icons.small != nullptr && icons.big != nullptr) | |||
| { | |||
| if (icons.small->getWidth() >= size && icons.big->getWidth() >= size) | |||
| return icons.small->getWidth() < icons.big->getWidth() ? icons.small.get() : icons.big.get(); | |||
| if (icons.small->getWidth() >= size) | |||
| return icons.small.get(); | |||
| if (icons.big->getWidth() >= size) | |||
| return icons.big.get(); | |||
| } | |||
| return nullptr; | |||
| }(); | |||
| if (im == nullptr) | |||
| return {}; | |||
| if (returnNullIfNothingBigEnough && im->getWidth() < size && im->getHeight() < size) | |||
| return {}; | |||
| return rescaleImageForIcon (*im, size); | |||
| } | |||
| namespace win | |||
| { | |||
| static void writeBMPImage (const Image& image, const int w, const int h, MemoryOutputStream& out) | |||
| { | |||
| int maskStride = (w / 8 + 3) & ~3; | |||
| out.writeInt (40); // bitmapinfoheader size | |||
| out.writeInt (w); | |||
| out.writeInt (h * 2); | |||
| out.writeShort (1); // planes | |||
| out.writeShort (32); // bits | |||
| out.writeInt (0); // compression | |||
| out.writeInt ((h * w * 4) + (h * maskStride)); // size image | |||
| out.writeInt (0); // x pixels per meter | |||
| out.writeInt (0); // y pixels per meter | |||
| out.writeInt (0); // clr used | |||
| out.writeInt (0); // clr important | |||
| Image::BitmapData bitmap (image, Image::BitmapData::readOnly); | |||
| int alphaThreshold = 5; | |||
| int y; | |||
| for (y = h; --y >= 0;) | |||
| { | |||
| for (int x = 0; x < w; ++x) | |||
| { | |||
| auto pixel = bitmap.getPixelColour (x, y); | |||
| if (pixel.getAlpha() <= alphaThreshold) | |||
| { | |||
| out.writeInt (0); | |||
| } | |||
| else | |||
| { | |||
| out.writeByte ((char) pixel.getBlue()); | |||
| out.writeByte ((char) pixel.getGreen()); | |||
| out.writeByte ((char) pixel.getRed()); | |||
| out.writeByte ((char) pixel.getAlpha()); | |||
| } | |||
| } | |||
| } | |||
| for (y = h; --y >= 0;) | |||
| { | |||
| int mask = 0, count = 0; | |||
| for (int x = 0; x < w; ++x) | |||
| { | |||
| auto pixel = bitmap.getPixelColour (x, y); | |||
| mask <<= 1; | |||
| if (pixel.getAlpha() <= alphaThreshold) | |||
| mask |= 1; | |||
| if (++count == 8) | |||
| { | |||
| out.writeByte ((char) mask); | |||
| count = 0; | |||
| mask = 0; | |||
| } | |||
| } | |||
| if (mask != 0) | |||
| out.writeByte ((char) mask); | |||
| for (int i = maskStride - w / 8; --i >= 0;) | |||
| out.writeByte (0); | |||
| } | |||
| } | |||
| static void writeIcon (const Array<Image>& images, OutputStream& out) | |||
| { | |||
| out.writeShort (0); // reserved | |||
| out.writeShort (1); // .ico tag | |||
| out.writeShort ((short) images.size()); | |||
| MemoryOutputStream dataBlock; | |||
| int imageDirEntrySize = 16; | |||
| int dataBlockStart = 6 + images.size() * imageDirEntrySize; | |||
| for (int i = 0; i < images.size(); ++i) | |||
| { | |||
| auto oldDataSize = dataBlock.getDataSize(); | |||
| auto& image = images.getReference (i); | |||
| auto w = image.getWidth(); | |||
| auto h = image.getHeight(); | |||
| if (w >= 256 || h >= 256) | |||
| { | |||
| PNGImageFormat pngFormat; | |||
| pngFormat.writeImageToStream (image, dataBlock); | |||
| } | |||
| else | |||
| { | |||
| writeBMPImage (image, w, h, dataBlock); | |||
| } | |||
| out.writeByte ((char) w); | |||
| out.writeByte ((char) h); | |||
| out.writeByte (0); | |||
| out.writeByte (0); | |||
| out.writeShort (1); // colour planes | |||
| out.writeShort (32); // bits per pixel | |||
| out.writeInt ((int) (dataBlock.getDataSize() - oldDataSize)); | |||
| out.writeInt (dataBlockStart + (int) oldDataSize); | |||
| } | |||
| jassert (out.getPosition() == dataBlockStart); | |||
| out << dataBlock; | |||
| } | |||
| } // namespace win | |||
| void writeWinIcon (const Icons& icons, OutputStream& os) | |||
| { | |||
| Array<Image> images; | |||
| int sizes[] = { 16, 32, 48, 256 }; | |||
| for (int size : sizes) | |||
| { | |||
| auto im = getBestIconForSize (icons, size, true); | |||
| if (im.isValid()) | |||
| images.add (im); | |||
| } | |||
| if (images.size() > 0) | |||
| win::writeIcon (images, os); | |||
| } | |||
| void writeMacIcon (const Icons& icons, const File& file) | |||
| { | |||
| writeStreamToFile (file, [&] (juce::MemoryOutputStream& mo) { writeMacIcon (icons, mo); }); | |||
| } | |||
| void writeWinIcon (const Icons& icons, const File& file) | |||
| { | |||
| writeStreamToFile (file, [&] (juce::MemoryOutputStream& mo) { writeWinIcon (icons, mo); }); | |||
| } | |||
| Image rescaleImageForIcon (Drawable& d, const int size) | |||
| { | |||
| if (auto* drawableImage = dynamic_cast<DrawableImage*> (&d)) | |||
| { | |||
| auto im = SoftwareImageType().convert (drawableImage->getImage()); | |||
| if (im.getWidth() == size && im.getHeight() == size) | |||
| return im; | |||
| // (scale it down in stages for better resampling) | |||
| while (im.getWidth() > 2 * size && im.getHeight() > 2 * size) | |||
| im = im.rescaled (im.getWidth() / 2, | |||
| im.getHeight() / 2); | |||
| Image newIm (Image::ARGB, size, size, true, SoftwareImageType()); | |||
| Graphics g (newIm); | |||
| g.drawImageWithin (im, 0, 0, size, size, | |||
| RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize, false); | |||
| return newIm; | |||
| } | |||
| Image im (Image::ARGB, size, size, true, SoftwareImageType()); | |||
| Graphics g (im); | |||
| d.drawWithin (g, im.getBounds().toFloat(), RectanglePlacement::centred, 1.0f); | |||
| return im; | |||
| } | |||
| struct AppIconType | |||
| { | |||
| const char* idiom; | |||
| const char* sizeString; | |||
| const char* filename; | |||
| const char* scale; | |||
| int size; | |||
| }; | |||
| static const AppIconType iOSAppIconTypes[] | |||
| { | |||
| { "iphone", "20x20", "Icon-Notification-20@2x.png", "2x", 40 }, | |||
| { "iphone", "20x20", "Icon-Notification-20@3x.png", "3x", 60 }, | |||
| { "iphone", "29x29", "Icon-29.png", "1x", 29 }, | |||
| { "iphone", "29x29", "Icon-29@2x.png", "2x", 58 }, | |||
| { "iphone", "29x29", "Icon-29@3x.png", "3x", 87 }, | |||
| { "iphone", "40x40", "Icon-Spotlight-40@2x.png", "2x", 80 }, | |||
| { "iphone", "40x40", "Icon-Spotlight-40@3x.png", "3x", 120 }, | |||
| { "iphone", "57x57", "Icon.png", "1x", 57 }, | |||
| { "iphone", "57x57", "Icon@2x.png", "2x", 114 }, | |||
| { "iphone", "60x60", "Icon-60@2x.png", "2x", 120 }, | |||
| { "iphone", "60x60", "Icon-@3x.png", "3x", 180 }, | |||
| { "ipad", "20x20", "Icon-Notifications-20.png", "1x", 20 }, | |||
| { "ipad", "20x20", "Icon-Notifications-20@2x.png", "2x", 40 }, | |||
| { "ipad", "29x29", "Icon-Small-1.png", "1x", 29 }, | |||
| { "ipad", "29x29", "Icon-Small@2x-1.png", "2x", 58 }, | |||
| { "ipad", "40x40", "Icon-Spotlight-40.png", "1x", 40 }, | |||
| { "ipad", "40x40", "Icon-Spotlight-40@2x-1.png", "2x", 80 }, | |||
| { "ipad", "50x50", "Icon-Small-50.png", "1x", 50 }, | |||
| { "ipad", "50x50", "Icon-Small-50@2x.png", "2x", 100 }, | |||
| { "ipad", "72x72", "Icon-72.png", "1x", 72 }, | |||
| { "ipad", "72x72", "Icon-72@2x.png", "2x", 144 }, | |||
| { "ipad", "76x76", "Icon-76.png", "1x", 76 }, | |||
| { "ipad", "76x76", "Icon-76@2x.png", "2x", 152 }, | |||
| { "ipad", "83.5x83.5", "Icon-83.5@2x.png", "2x", 167 }, | |||
| { "ios-marketing", "1024x1024", "Icon-AppStore-1024.png", "1x", 1024 } | |||
| }; | |||
| static void createiOSIconFiles (const Icons& icons, File appIconSet) | |||
| { | |||
| const auto images = asArray (icons); | |||
| if (! images.isEmpty()) | |||
| { | |||
| for (auto& type : iOSAppIconTypes) | |||
| { | |||
| auto image = rescaleImageForIcon (*images.getFirst(), type.size); | |||
| if (image.hasAlphaChannel()) | |||
| { | |||
| Image background (Image::RGB, image.getWidth(), image.getHeight(), false); | |||
| Graphics g (background); | |||
| g.fillAll (Colours::white); | |||
| g.drawImageWithin (image, 0, 0, image.getWidth(), image.getHeight(), | |||
| RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize); | |||
| image = background; | |||
| } | |||
| MemoryOutputStream pngData; | |||
| PNGImageFormat pngFormat; | |||
| pngFormat.writeImageToStream (image, pngData); | |||
| overwriteFileIfDifferentOrThrow (appIconSet.getChildFile (type.filename), pngData); | |||
| } | |||
| } | |||
| } | |||
| static String getiOSAssetContents (var images) | |||
| { | |||
| DynamicObject::Ptr v (new DynamicObject()); | |||
| var info (new DynamicObject()); | |||
| info.getDynamicObject()->setProperty ("version", 1); | |||
| info.getDynamicObject()->setProperty ("author", "xcode"); | |||
| v->setProperty ("images", images); | |||
| v->setProperty ("info", info); | |||
| return JSON::toString (var (v.get())); | |||
| } | |||
| //============================================================================== | |||
| static String getiOSAppIconContents() | |||
| { | |||
| var images; | |||
| for (auto& type : iOSAppIconTypes) | |||
| { | |||
| DynamicObject::Ptr d (new DynamicObject()); | |||
| d->setProperty ("idiom", type.idiom); | |||
| d->setProperty ("size", type.sizeString); | |||
| d->setProperty ("filename", type.filename); | |||
| d->setProperty ("scale", type.scale); | |||
| images.append (var (d.get())); | |||
| } | |||
| return getiOSAssetContents (images); | |||
| } | |||
| struct ImageType | |||
| { | |||
| const char* orientation; | |||
| const char* idiom; | |||
| const char* subtype; | |||
| const char* extent; | |||
| const char* scale; | |||
| const char* filename; | |||
| int width; | |||
| int height; | |||
| }; | |||
| static const ImageType iOSLaunchImageTypes[] | |||
| { | |||
| { "portrait", "iphone", nullptr, "full-screen", "2x", "LaunchImage-iphone-2x.png", 640, 960 }, | |||
| { "portrait", "iphone", "retina4", "full-screen", "2x", "LaunchImage-iphone-retina4.png", 640, 1136 }, | |||
| { "portrait", "ipad", nullptr, "full-screen", "1x", "LaunchImage-ipad-portrait-1x.png", 768, 1024 }, | |||
| { "landscape","ipad", nullptr, "full-screen", "1x", "LaunchImage-ipad-landscape-1x.png", 1024, 768 }, | |||
| { "portrait", "ipad", nullptr, "full-screen", "2x", "LaunchImage-ipad-portrait-2x.png", 1536, 2048 }, | |||
| { "landscape","ipad", nullptr, "full-screen", "2x", "LaunchImage-ipad-landscape-2x.png", 2048, 1536 } | |||
| }; | |||
| static void createiOSLaunchImageFiles (const File& launchImageSet) | |||
| { | |||
| for (auto& type : iOSLaunchImageTypes) | |||
| { | |||
| Image image (Image::ARGB, type.width, type.height, true); // (empty black image) | |||
| image.clear (image.getBounds(), Colours::black); | |||
| MemoryOutputStream pngData; | |||
| PNGImageFormat pngFormat; | |||
| pngFormat.writeImageToStream (image, pngData); | |||
| build_tools::overwriteFileIfDifferentOrThrow (launchImageSet.getChildFile (type.filename), pngData); | |||
| } | |||
| } | |||
| static String getiOSLaunchImageContents() | |||
| { | |||
| var images; | |||
| for (auto& type : iOSLaunchImageTypes) | |||
| { | |||
| DynamicObject::Ptr d (new DynamicObject()); | |||
| d->setProperty ("orientation", type.orientation); | |||
| d->setProperty ("idiom", type.idiom); | |||
| d->setProperty ("extent", type.extent); | |||
| d->setProperty ("minimum-system-version", "7.0"); | |||
| d->setProperty ("scale", type.scale); | |||
| d->setProperty ("filename", type.filename); | |||
| if (type.subtype != nullptr) | |||
| d->setProperty ("subtype", type.subtype); | |||
| images.append (var (d.get())); | |||
| } | |||
| return getiOSAssetContents (images); | |||
| } | |||
| RelativePath createXcassetsFolderFromIcons (const Icons& icons, | |||
| const File& targetFolder, | |||
| String projectFilenameRootString) | |||
| { | |||
| const auto assets = targetFolder.getChildFile (projectFilenameRootString) | |||
| .getChildFile ("Images.xcassets"); | |||
| const auto iconSet = assets.getChildFile ("AppIcon.appiconset"); | |||
| const auto launchImage = assets.getChildFile ("LaunchImage.launchimage"); | |||
| overwriteFileIfDifferentOrThrow (iconSet.getChildFile ("Contents.json"), getiOSAppIconContents()); | |||
| createiOSIconFiles (icons, iconSet); | |||
| overwriteFileIfDifferentOrThrow (launchImage.getChildFile ("Contents.json"), getiOSLaunchImageContents()); | |||
| createiOSLaunchImageFiles (launchImage); | |||
| return { assets, targetFolder, RelativePath::buildTargetFolder }; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,42 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| struct Icons | |||
| { | |||
| std::unique_ptr<Drawable> small; | |||
| std::unique_ptr<Drawable> big; | |||
| }; | |||
| Array<Drawable*> asArray (const Icons&); | |||
| void writeMacIcon (const Icons&, const File&); | |||
| void writeWinIcon (const Icons&, const File&); | |||
| Image getBestIconForSize (const Icons& icons, | |||
| int size, | |||
| bool returnNullIfNothingBigEnough); | |||
| Image rescaleImageForIcon (Drawable& d, const int size); | |||
| RelativePath createXcassetsFolderFromIcons (const Icons& icons, | |||
| const File& targetFolder, | |||
| String projectFilenameRootString); | |||
| } | |||
| } | |||
| @@ -0,0 +1,354 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| //============================================================================== | |||
| static bool keyFoundAndNotSequentialDuplicate (XmlElement& xml, const String& key) | |||
| { | |||
| forEachXmlChildElementWithTagName (xml, element, "key") | |||
| { | |||
| if (element->getAllSubText().trim().equalsIgnoreCase (key)) | |||
| { | |||
| if (element->getNextElement() != nullptr && element->getNextElement()->hasTagName ("key")) | |||
| { | |||
| // found broken plist format (sequential duplicate), fix by removing | |||
| xml.removeChildElement (element, true); | |||
| return false; | |||
| } | |||
| // key found (not sequential duplicate) | |||
| return true; | |||
| } | |||
| } | |||
| // key not found | |||
| return false; | |||
| } | |||
| static bool addKeyIfNotFound (XmlElement& xml, const String& key) | |||
| { | |||
| if (! keyFoundAndNotSequentialDuplicate (xml, key)) | |||
| { | |||
| xml.createNewChildElement ("key")->addTextElement (key); | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| static void addPlistDictionaryKey (XmlElement& xml, const String& key, const String& value) | |||
| { | |||
| if (addKeyIfNotFound (xml, key)) | |||
| xml.createNewChildElement ("string")->addTextElement (value); | |||
| } | |||
| template <size_t N> | |||
| static void addPlistDictionaryKey (XmlElement& xml, const String& key, const char (&value) [N]) | |||
| { | |||
| addPlistDictionaryKey (xml, key, String { value }); | |||
| } | |||
| static void addPlistDictionaryKey (XmlElement& xml, const String& key, const bool value) | |||
| { | |||
| if (addKeyIfNotFound (xml, key)) | |||
| xml.createNewChildElement (value ? "true" : "false"); | |||
| } | |||
| static void addPlistDictionaryKey (XmlElement& xml, const String& key, int value) | |||
| { | |||
| if (addKeyIfNotFound (xml, key)) | |||
| xml.createNewChildElement ("integer")->addTextElement (String (value)); | |||
| } | |||
| //============================================================================== | |||
| static void addArrayToPlist (XmlElement& dict, String arrayKey, const StringArray& arrayElements) | |||
| { | |||
| dict.createNewChildElement ("key")->addTextElement (arrayKey); | |||
| auto* plistStringArray = dict.createNewChildElement ("array"); | |||
| for (auto& e : arrayElements) | |||
| plistStringArray->createNewChildElement ("string")->addTextElement (e); | |||
| } | |||
| void PlistOptions::write (const File& infoPlistFile) const | |||
| { | |||
| writeStreamToFile (infoPlistFile, [&] (MemoryOutputStream& mo) { write (mo); }); | |||
| } | |||
| void PlistOptions::write (MemoryOutputStream& mo) const | |||
| { | |||
| XmlElement::TextFormat format; | |||
| format.dtd = "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">"; | |||
| createXML()->writeTo (mo, format); | |||
| } | |||
| std::unique_ptr<XmlElement> PlistOptions::createXML() const | |||
| { | |||
| auto plist = parseXML (plistToMerge); | |||
| if (plist == nullptr || ! plist->hasTagName ("plist")) | |||
| plist.reset (new XmlElement ("plist")); | |||
| auto* dict = plist->getChildByName ("dict"); | |||
| if (dict == nullptr) | |||
| dict = plist->createNewChildElement ("dict"); | |||
| if (microphonePermissionEnabled) | |||
| addPlistDictionaryKey (*dict, "NSMicrophoneUsageDescription", microphonePermissionText); | |||
| if (cameraPermissionEnabled) | |||
| addPlistDictionaryKey (*dict, "NSCameraUsageDescription", cameraPermissionText); | |||
| if (iOS) | |||
| { | |||
| if (bluetoothPermissionEnabled) | |||
| { | |||
| addPlistDictionaryKey (*dict, "NSBluetoothAlwaysUsageDescription", bluetoothPermissionText); | |||
| addPlistDictionaryKey (*dict, "NSBluetoothPeripheralUsageDescription", bluetoothPermissionText); // needed for pre iOS 13.0 | |||
| } | |||
| addPlistDictionaryKey (*dict, "LSRequiresIPhoneOS", true); | |||
| if (type != ProjectType::Target::AudioUnitv3PlugIn) | |||
| addPlistDictionaryKey (*dict, "UIViewControllerBasedStatusBarAppearance", false); | |||
| if (shouldAddStoryboardToProject) | |||
| addPlistDictionaryKey (*dict, "UILaunchStoryboardName", storyboardName); | |||
| } | |||
| else | |||
| { | |||
| if (sendAppleEventsPermissionEnabled) | |||
| addPlistDictionaryKey (*dict, "NSAppleEventsUsageDescription", sendAppleEventsPermissionText); | |||
| } | |||
| addPlistDictionaryKey (*dict, "CFBundleExecutable", executableName); | |||
| if (! iOS) // (NB: on iOS this causes error ITMS-90032 during publishing) | |||
| addPlistDictionaryKey (*dict, "CFBundleIconFile", iconFile.exists() ? iconFile.getFileName() : String()); | |||
| addPlistDictionaryKey (*dict, "CFBundleIdentifier", bundleIdentifier); | |||
| addPlistDictionaryKey (*dict, "CFBundleName", projectName); | |||
| // needed by NSExtension on iOS | |||
| addPlistDictionaryKey (*dict, "CFBundleDisplayName", projectName); | |||
| addPlistDictionaryKey (*dict, "CFBundlePackageType", getXcodePackageType (type)); | |||
| addPlistDictionaryKey (*dict, "CFBundleSignature", getXcodeBundleSignature (type)); | |||
| addPlistDictionaryKey (*dict, "CFBundleShortVersionString", version); | |||
| addPlistDictionaryKey (*dict, "CFBundleVersion", version); | |||
| addPlistDictionaryKey (*dict, "NSHumanReadableCopyright", companyCopyright); | |||
| addPlistDictionaryKey (*dict, "NSHighResolutionCapable", true); | |||
| auto replacedDocExtensions = StringArray::fromTokens (replacePreprocessorDefs (allPreprocessorDefs, | |||
| documentExtensions), ",", {}); | |||
| replacedDocExtensions.trim(); | |||
| replacedDocExtensions.removeEmptyStrings (true); | |||
| if (! replacedDocExtensions.isEmpty() && type != ProjectType::Target::AudioUnitv3PlugIn) | |||
| { | |||
| dict->createNewChildElement ("key")->addTextElement ("CFBundleDocumentTypes"); | |||
| auto* dict2 = dict->createNewChildElement ("array")->createNewChildElement ("dict"); | |||
| XmlElement* arrayTag = nullptr; | |||
| for (auto ex : replacedDocExtensions) | |||
| { | |||
| if (ex.startsWithChar ('.')) | |||
| ex = ex.substring (1); | |||
| if (arrayTag == nullptr) | |||
| { | |||
| dict2->createNewChildElement ("key")->addTextElement ("CFBundleTypeExtensions"); | |||
| arrayTag = dict2->createNewChildElement ("array"); | |||
| addPlistDictionaryKey (*dict2, "CFBundleTypeName", ex); | |||
| addPlistDictionaryKey (*dict2, "CFBundleTypeRole", "Editor"); | |||
| addPlistDictionaryKey (*dict2, "CFBundleTypeIconFile", "Icon"); | |||
| addPlistDictionaryKey (*dict2, "NSPersistentStoreTypeKey", "XML"); | |||
| } | |||
| arrayTag->createNewChildElement ("string")->addTextElement (ex); | |||
| } | |||
| } | |||
| if (fileSharingEnabled && type != ProjectType::Target::AudioUnitv3PlugIn) | |||
| addPlistDictionaryKey (*dict, "UIFileSharingEnabled", true); | |||
| if (documentBrowserEnabled) | |||
| addPlistDictionaryKey (*dict, "UISupportsDocumentBrowser", true); | |||
| if (statusBarHidden && type != ProjectType::Target::AudioUnitv3PlugIn) | |||
| addPlistDictionaryKey (*dict, "UIStatusBarHidden", true); | |||
| if (iOS) | |||
| { | |||
| if (type != ProjectType::Target::AudioUnitv3PlugIn) | |||
| { | |||
| // Forcing full screen disables the split screen feature and prevents error ITMS-90475 | |||
| addPlistDictionaryKey (*dict, "UIRequiresFullScreen", true); | |||
| addPlistDictionaryKey (*dict, "UIStatusBarHidden", true); | |||
| addIosScreenOrientations (*dict); | |||
| addIosBackgroundModes (*dict); | |||
| } | |||
| if (type == ProjectType::Target::StandalonePlugIn && enableIAA) | |||
| { | |||
| XmlElement audioComponentsPlistKey ("key"); | |||
| audioComponentsPlistKey.addTextElement ("AudioComponents"); | |||
| dict->addChildElement (new XmlElement (audioComponentsPlistKey)); | |||
| XmlElement audioComponentsPlistEntry ("array"); | |||
| auto* audioComponentsDict = audioComponentsPlistEntry.createNewChildElement ("dict"); | |||
| addPlistDictionaryKey (*audioComponentsDict, "name", IAAPluginName); | |||
| addPlistDictionaryKey (*audioComponentsDict, "manufacturer", pluginManufacturerCode.substring (0, 4)); | |||
| addPlistDictionaryKey (*audioComponentsDict, "type", IAATypeCode); | |||
| addPlistDictionaryKey (*audioComponentsDict, "subtype", pluginCode.substring (0, 4)); | |||
| addPlistDictionaryKey (*audioComponentsDict, "version", versionAsHex); | |||
| dict->addChildElement (new XmlElement (audioComponentsPlistEntry)); | |||
| } | |||
| } | |||
| const auto extraOptions = [&]() -> Array<XmlElement> | |||
| { | |||
| if (type == ProjectType::Target::Type::AudioUnitPlugIn) | |||
| return createExtraAudioUnitTargetPlistOptions(); | |||
| if (type == ProjectType::Target::Type::AudioUnitv3PlugIn) | |||
| return createExtraAudioUnitV3TargetPlistOptions(); | |||
| return {}; | |||
| }(); | |||
| for (auto& e : extraOptions) | |||
| dict->addChildElement (new XmlElement (e)); | |||
| return plist; | |||
| } | |||
| void PlistOptions::addIosScreenOrientations (XmlElement& dict) const | |||
| { | |||
| String screenOrientations[] = { iPhoneScreenOrientations, iPadScreenOrientations }; | |||
| String plistSuffix[] = { "", "~ipad" }; | |||
| auto orientationsAreTheSame = screenOrientations[0] == screenOrientations[1]; | |||
| for (int i = 0; i < (orientationsAreTheSame ? 1 : 2); ++i) | |||
| { | |||
| StringArray iOSOrientations; | |||
| if (screenOrientations[i].contains ("portrait")) { iOSOrientations.add ("UIInterfaceOrientationPortrait"); } | |||
| if (screenOrientations[i].contains ("landscape")) { iOSOrientations.add ("UIInterfaceOrientationLandscapeLeft"); iOSOrientations.add ("UIInterfaceOrientationLandscapeRight"); } | |||
| addArrayToPlist (dict, String ("UISupportedInterfaceOrientations") + plistSuffix[i], iOSOrientations); | |||
| } | |||
| } | |||
| void PlistOptions::addIosBackgroundModes (XmlElement& dict) const | |||
| { | |||
| StringArray iosBackgroundModes; | |||
| if (backgroundAudioEnabled) iosBackgroundModes.add ("audio"); | |||
| if (backgroundBleEnabled) iosBackgroundModes.add ("bluetooth-central"); | |||
| if (pushNotificationsEnabled) iosBackgroundModes.add ("remote-notification"); | |||
| addArrayToPlist (dict, "UIBackgroundModes", iosBackgroundModes); | |||
| } | |||
| Array<XmlElement> PlistOptions::createExtraAudioUnitTargetPlistOptions() const | |||
| { | |||
| XmlElement plistKey ("key"); | |||
| plistKey.addTextElement ("AudioComponents"); | |||
| XmlElement plistEntry ("array"); | |||
| auto* dict = plistEntry.createNewChildElement ("dict"); | |||
| auto truncatedCode = pluginManufacturerCode.substring (0, 4); | |||
| auto pluginSubType = pluginCode.substring (0, 4); | |||
| if (truncatedCode.toLowerCase() == truncatedCode) | |||
| { | |||
| throw SaveError ("AudioUnit plugin code identifiers invalid!\n\n" | |||
| "You have used only lower case letters in your AU plugin manufacturer identifier. " | |||
| "You must have at least one uppercase letter in your AU plugin manufacturer " | |||
| "identifier code."); | |||
| } | |||
| addPlistDictionaryKey (*dict, "name", pluginManufacturer + ": " + pluginName); | |||
| addPlistDictionaryKey (*dict, "description", pluginDescription); | |||
| addPlistDictionaryKey (*dict, "factoryFunction", pluginAUExportPrefix + "Factory"); | |||
| addPlistDictionaryKey (*dict, "manufacturer", truncatedCode); | |||
| addPlistDictionaryKey (*dict, "type", auMainType.removeCharacters ("'")); | |||
| addPlistDictionaryKey (*dict, "subtype", pluginSubType); | |||
| addPlistDictionaryKey (*dict, "version", versionAsHex); | |||
| if (isAuSandboxSafe) | |||
| { | |||
| addPlistDictionaryKey (*dict, "sandboxSafe", true); | |||
| } | |||
| else | |||
| { | |||
| dict->createNewChildElement ("key")->addTextElement ("resourceUsage"); | |||
| auto* resourceUsageDict = dict->createNewChildElement ("dict"); | |||
| addPlistDictionaryKey (*resourceUsageDict, "network.client", true); | |||
| addPlistDictionaryKey (*resourceUsageDict, "temporary-exception.files.all.read-write", true); | |||
| } | |||
| return { plistKey, plistEntry }; | |||
| } | |||
| Array<XmlElement> PlistOptions::createExtraAudioUnitV3TargetPlistOptions() const | |||
| { | |||
| XmlElement plistKey ("key"); | |||
| plistKey.addTextElement ("NSExtension"); | |||
| XmlElement plistEntry ("dict"); | |||
| addPlistDictionaryKey (plistEntry, "NSExtensionPrincipalClass", pluginAUExportPrefix + "FactoryAUv3"); | |||
| addPlistDictionaryKey (plistEntry, "NSExtensionPointIdentifier", "com.apple.AudioUnit-UI"); | |||
| plistEntry.createNewChildElement ("key")->addTextElement ("NSExtensionAttributes"); | |||
| auto* dict = plistEntry.createNewChildElement ("dict"); | |||
| dict->createNewChildElement ("key")->addTextElement ("AudioComponents"); | |||
| auto* componentArray = dict->createNewChildElement ("array"); | |||
| auto* componentDict = componentArray->createNewChildElement ("dict"); | |||
| addPlistDictionaryKey (*componentDict, "name", pluginManufacturer + ": " + pluginName); | |||
| addPlistDictionaryKey (*componentDict, "description", pluginDescription); | |||
| addPlistDictionaryKey (*componentDict, "factoryFunction", pluginAUExportPrefix + "FactoryAUv3"); | |||
| addPlistDictionaryKey (*componentDict, "manufacturer", pluginManufacturerCode.substring (0, 4)); | |||
| addPlistDictionaryKey (*componentDict, "type", auMainType.removeCharacters ("'")); | |||
| addPlistDictionaryKey (*componentDict, "subtype", pluginCode.substring (0, 4)); | |||
| addPlistDictionaryKey (*componentDict, "version", versionAsHex); | |||
| addPlistDictionaryKey (*componentDict, "sandboxSafe", true); | |||
| componentDict->createNewChildElement ("key")->addTextElement ("tags"); | |||
| auto* tagsArray = componentDict->createNewChildElement ("array"); | |||
| tagsArray->createNewChildElement ("string") | |||
| ->addTextElement (isPluginSynth ? "Synth" : "Effects"); | |||
| return { plistKey, plistEntry }; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,95 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| class PlistOptions final | |||
| { | |||
| public: | |||
| void write (const File& infoPlistFile) const; | |||
| //============================================================================== | |||
| ProjectType::Target::Type type = ProjectType::Target::Type::GUIApp; | |||
| String executableName; | |||
| String bundleIdentifier; | |||
| String plistToMerge; | |||
| bool iOS = false; | |||
| bool microphonePermissionEnabled = false; | |||
| String microphonePermissionText; | |||
| bool cameraPermissionEnabled = false; | |||
| String cameraPermissionText; | |||
| bool bluetoothPermissionEnabled = false; | |||
| String bluetoothPermissionText; | |||
| bool sendAppleEventsPermissionEnabled = false; | |||
| String sendAppleEventsPermissionText; | |||
| bool shouldAddStoryboardToProject = false; | |||
| String storyboardName; | |||
| File iconFile; | |||
| String projectName; | |||
| String version; | |||
| String companyCopyright; | |||
| StringPairArray allPreprocessorDefs; | |||
| String documentExtensions; | |||
| bool fileSharingEnabled = false; | |||
| bool documentBrowserEnabled = false; | |||
| bool statusBarHidden = false; | |||
| bool backgroundAudioEnabled = false; | |||
| bool backgroundBleEnabled = false; | |||
| bool pushNotificationsEnabled = false; | |||
| bool enableIAA = false; | |||
| String IAAPluginName; | |||
| String pluginManufacturerCode; | |||
| String IAATypeCode; | |||
| String pluginCode; | |||
| int versionAsHex = 0; | |||
| String iPhoneScreenOrientations; | |||
| String iPadScreenOrientations; | |||
| String pluginName; | |||
| String pluginManufacturer; | |||
| String pluginDescription; | |||
| String pluginAUExportPrefix; | |||
| String auMainType; | |||
| bool isAuSandboxSafe = false; | |||
| bool isPluginSynth = false; | |||
| private: | |||
| void write (MemoryOutputStream&) const; | |||
| std::unique_ptr<XmlElement> createXML() const; | |||
| void addIosScreenOrientations (XmlElement&) const; | |||
| void addIosBackgroundModes (XmlElement&) const; | |||
| Array<XmlElement> createExtraAudioUnitTargetPlistOptions() const; | |||
| Array<XmlElement> createExtraAudioUnitV3TargetPlistOptions() const; | |||
| }; | |||
| } | |||
| } | |||
| @@ -0,0 +1,268 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| //============================================================================== | |||
| class ProjectType | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| virtual ~ProjectType() { getAllTypes().removeFirstMatchingValue (this); } | |||
| const String& getType() const noexcept { return type; } | |||
| const String& getDescription() const noexcept { return desc; } | |||
| //============================================================================== | |||
| static Array<ProjectType*> getAllTypes(); | |||
| static const ProjectType* findType (const String& typeCode) | |||
| { | |||
| const auto& types = getAllTypes(); | |||
| for (auto i = types.size(); --i >= 0;) | |||
| if (types.getUnchecked(i)->getType() == typeCode) | |||
| return types.getUnchecked(i); | |||
| jassertfalse; | |||
| return nullptr; | |||
| } | |||
| //============================================================================== | |||
| virtual bool isStaticLibrary() const { return false; } | |||
| virtual bool isDynamicLibrary() const { return false; } | |||
| virtual bool isGUIApplication() const { return false; } | |||
| virtual bool isCommandLineApp() const { return false; } | |||
| virtual bool isAudioPlugin() const { return false; } | |||
| //============================================================================== | |||
| struct Target | |||
| { | |||
| enum Type | |||
| { | |||
| GUIApp = 0, | |||
| ConsoleApp = 1, | |||
| StaticLibrary = 2, | |||
| DynamicLibrary = 3, | |||
| VSTPlugIn = 10, | |||
| VST3PlugIn = 11, | |||
| AAXPlugIn = 12, | |||
| RTASPlugIn = 13, | |||
| AudioUnitPlugIn = 14, | |||
| AudioUnitv3PlugIn = 15, | |||
| StandalonePlugIn = 16, | |||
| UnityPlugIn = 17, | |||
| SharedCodeTarget = 20, // internal | |||
| AggregateTarget = 21, | |||
| unspecified = 30 | |||
| }; | |||
| enum TargetFileType | |||
| { | |||
| executable = 0, | |||
| staticLibrary = 1, | |||
| sharedLibraryOrDLL = 2, | |||
| pluginBundle = 3, | |||
| macOSAppex = 4, | |||
| unknown = 5 | |||
| }; | |||
| //============================================================================== | |||
| explicit Target (Type targetType) : type (targetType) {} | |||
| const char* getName() const noexcept | |||
| { | |||
| switch (type) | |||
| { | |||
| case GUIApp: return "App"; | |||
| case ConsoleApp: return "ConsoleApp"; | |||
| case StaticLibrary: return "Static Library"; | |||
| case DynamicLibrary: return "Dynamic Library"; | |||
| case VSTPlugIn: return "VST"; | |||
| case VST3PlugIn: return "VST3"; | |||
| case AudioUnitPlugIn: return "AU"; | |||
| case StandalonePlugIn: return "Standalone Plugin"; | |||
| case AudioUnitv3PlugIn: return "AUv3 AppExtension"; | |||
| case AAXPlugIn: return "AAX"; | |||
| case RTASPlugIn: return "RTAS"; | |||
| case UnityPlugIn: return "Unity Plugin"; | |||
| case SharedCodeTarget: return "Shared Code"; | |||
| case AggregateTarget: return "All"; | |||
| case unspecified: | |||
| default: break; | |||
| } | |||
| return "undefined"; | |||
| } | |||
| static Type typeFromName (const juce::String& name) | |||
| { | |||
| if (name == "App") return Type::GUIApp; | |||
| if (name == "ConsoleApp") return Type::ConsoleApp; | |||
| if (name == "Static Library") return Type::StaticLibrary; | |||
| if (name == "Dynamic Library") return Type::DynamicLibrary; | |||
| if (name == "VST") return Type::VSTPlugIn; | |||
| if (name == "VST3") return Type::VST3PlugIn; | |||
| if (name == "AU") return Type::AudioUnitPlugIn; | |||
| if (name == "Standalone Plugin") return Type::StandalonePlugIn; | |||
| if (name == "AUv3 AppExtension") return Type::AudioUnitv3PlugIn; | |||
| if (name == "AAX") return Type::AAXPlugIn; | |||
| if (name == "RTAS") return Type::RTASPlugIn; | |||
| if (name == "Unity Plugin") return Type::UnityPlugIn; | |||
| if (name == "Shared Code") return Type::SharedCodeTarget; | |||
| if (name == "All") return Type::AggregateTarget; | |||
| jassertfalse; | |||
| return Type::ConsoleApp; | |||
| } | |||
| TargetFileType getTargetFileType() const noexcept | |||
| { | |||
| switch (type) | |||
| { | |||
| case GUIApp: return executable; | |||
| case ConsoleApp: return executable; | |||
| case StaticLibrary: return staticLibrary; | |||
| case DynamicLibrary: return sharedLibraryOrDLL; | |||
| case VSTPlugIn: return pluginBundle; | |||
| case VST3PlugIn: return pluginBundle; | |||
| case AudioUnitPlugIn: return pluginBundle; | |||
| case StandalonePlugIn: return executable; | |||
| case AudioUnitv3PlugIn: return macOSAppex; | |||
| case AAXPlugIn: return pluginBundle; | |||
| case RTASPlugIn: return pluginBundle; | |||
| case UnityPlugIn: return pluginBundle; | |||
| case SharedCodeTarget: return staticLibrary; | |||
| case AggregateTarget: | |||
| case unspecified: | |||
| default: break; | |||
| } | |||
| return unknown; | |||
| } | |||
| const Type type; | |||
| private: | |||
| //============================================================================== | |||
| Target& operator= (const Target&) = delete; | |||
| }; | |||
| virtual bool supportsTargetType (Target::Type /*targetType*/) const { return false; } | |||
| protected: | |||
| ProjectType (const String& t, const String& d) | |||
| : type (t), desc (d) | |||
| {} | |||
| private: | |||
| const String type, desc; | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjectType) | |||
| }; | |||
| //============================================================================== | |||
| struct ProjectType_GUIApp : public ProjectType | |||
| { | |||
| ProjectType_GUIApp() : ProjectType (getTypeName(), "GUI Application") {} | |||
| static const char* getTypeName() noexcept { return "guiapp"; } | |||
| bool isGUIApplication() const override { return true; } | |||
| bool supportsTargetType (Target::Type targetType) const override { return (targetType == Target::GUIApp); } | |||
| }; | |||
| struct ProjectType_ConsoleApp : public ProjectType | |||
| { | |||
| ProjectType_ConsoleApp() : ProjectType (getTypeName(), "Console Application") {} | |||
| static const char* getTypeName() noexcept { return "consoleapp"; } | |||
| bool isCommandLineApp() const override { return true; } | |||
| bool supportsTargetType (Target::Type targetType) const override { return (targetType == Target::ConsoleApp); } | |||
| }; | |||
| struct ProjectType_StaticLibrary : public ProjectType | |||
| { | |||
| ProjectType_StaticLibrary() : ProjectType (getTypeName(), "Static Library") {} | |||
| static const char* getTypeName() noexcept { return "library"; } | |||
| bool isStaticLibrary() const override { return true; } | |||
| bool supportsTargetType (Target::Type targetType) const override { return (targetType == Target::StaticLibrary); } | |||
| }; | |||
| struct ProjectType_DLL : public ProjectType | |||
| { | |||
| ProjectType_DLL() : ProjectType (getTypeName(), "Dynamic Library") {} | |||
| static const char* getTypeName() noexcept { return "dll"; } | |||
| bool isDynamicLibrary() const override { return true; } | |||
| bool supportsTargetType (Target::Type targetType) const override { return (targetType == Target::DynamicLibrary); } | |||
| }; | |||
| struct ProjectType_AudioPlugin : public ProjectType | |||
| { | |||
| ProjectType_AudioPlugin() : ProjectType (getTypeName(), "Audio Plug-in") {} | |||
| static const char* getTypeName() noexcept { return "audioplug"; } | |||
| bool isAudioPlugin() const override { return true; } | |||
| bool supportsTargetType (Target::Type targetType) const override | |||
| { | |||
| switch (targetType) | |||
| { | |||
| case Target::VSTPlugIn: | |||
| case Target::VST3PlugIn: | |||
| case Target::AAXPlugIn: | |||
| case Target::RTASPlugIn: | |||
| case Target::AudioUnitPlugIn: | |||
| case Target::AudioUnitv3PlugIn: | |||
| case Target::StandalonePlugIn: | |||
| case Target::UnityPlugIn: | |||
| case Target::SharedCodeTarget: | |||
| case Target::AggregateTarget: | |||
| return true; | |||
| case Target::GUIApp: | |||
| case Target::ConsoleApp: | |||
| case Target::StaticLibrary: | |||
| case Target::DynamicLibrary: | |||
| case Target::unspecified: | |||
| default: | |||
| break; | |||
| } | |||
| return false; | |||
| } | |||
| }; | |||
| //============================================================================== | |||
| inline Array<ProjectType*> ProjectType::getAllTypes() | |||
| { | |||
| static ProjectType_GUIApp guiApp; | |||
| static ProjectType_ConsoleApp consoleApp; | |||
| static ProjectType_StaticLibrary staticLib; | |||
| static ProjectType_DLL dll; | |||
| static ProjectType_AudioPlugin plugin; | |||
| return Array<ProjectType*>(&guiApp, &consoleApp, &staticLib, &dll, &plugin); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,122 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| //============================================================================== | |||
| /** Manipulates a cross-platform partial file path. (Needed because File is designed | |||
| for absolute paths on the active OS) | |||
| */ | |||
| class RelativePath | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| enum RootFolder | |||
| { | |||
| unknown, | |||
| projectFolder, | |||
| buildTargetFolder | |||
| }; | |||
| //============================================================================== | |||
| RelativePath() | |||
| : root (unknown) | |||
| {} | |||
| RelativePath (const String& relPath, const RootFolder rootType) | |||
| : path (unixStylePath (relPath)), root (rootType) | |||
| {} | |||
| RelativePath (const File& file, const File& rootFolder, const RootFolder rootType) | |||
| : path (unixStylePath (getRelativePathFrom (file, rootFolder))), root (rootType) | |||
| {} | |||
| RootFolder getRoot() const { return root; } | |||
| String toUnixStyle() const { return unixStylePath (path); } | |||
| String toWindowsStyle() const { return windowsStylePath (path); } | |||
| String getFileName() const { return getFakeFile().getFileName(); } | |||
| String getFileNameWithoutExtension() const { return getFakeFile().getFileNameWithoutExtension(); } | |||
| String getFileExtension() const { return getFakeFile().getFileExtension(); } | |||
| bool hasFileExtension (juce::StringRef extension) const { return getFakeFile().hasFileExtension (extension); } | |||
| bool isAbsolute() const { return isAbsolutePath (path); } | |||
| RelativePath withFileExtension (const String& extension) const | |||
| { | |||
| return RelativePath (path.upToLastOccurrenceOf (".", ! extension.startsWithChar ('.'), false) + extension, root); | |||
| } | |||
| RelativePath getParentDirectory() const | |||
| { | |||
| String p (path); | |||
| if (path.endsWithChar ('/')) | |||
| p = p.dropLastCharacters (1); | |||
| return RelativePath (p.upToLastOccurrenceOf ("/", false, false), root); | |||
| } | |||
| RelativePath getChildFile (const String& subpath) const | |||
| { | |||
| if (isAbsolutePath (subpath)) | |||
| return RelativePath (subpath, root); | |||
| String p (toUnixStyle()); | |||
| if (! p.endsWithChar ('/')) | |||
| p << '/'; | |||
| return RelativePath (p + subpath, root); | |||
| } | |||
| RelativePath rebased (const File& originalRoot, const File& newRoot, const RootFolder newRootType) const | |||
| { | |||
| if (isAbsolute()) | |||
| return RelativePath (path, newRootType); | |||
| return RelativePath (getRelativePathFrom (originalRoot.getChildFile (toUnixStyle()), newRoot), newRootType); | |||
| } | |||
| private: | |||
| //============================================================================== | |||
| String path; | |||
| RootFolder root; | |||
| File getFakeFile() const | |||
| { | |||
| #if JUCE_WINDOWS | |||
| if (isAbsolutePath (path)) | |||
| { | |||
| // This is a hack to convert unix-style absolute paths into valid absolute Windows paths to avoid hitting | |||
| // an assertion in File::parseAbsolutePath(). | |||
| if (path.startsWithChar (L'/') || path.startsWithChar (L'$') || path.startsWithChar (L'~')) | |||
| return File (String ("C:\\") + windowsStylePath (path.substring (1))); | |||
| return File (path); | |||
| } | |||
| #endif | |||
| // This method gets called very often, so we'll cache this directory. | |||
| static const File currentWorkingDirectory (File::getCurrentWorkingDirectory()); | |||
| return currentWorkingDirectory.getChildFile (path); | |||
| } | |||
| }; | |||
| } | |||
| } | |||
| @@ -0,0 +1,84 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| uint64 calculateStreamHashCode (InputStream& in) | |||
| { | |||
| uint64 t = 0; | |||
| const int bufferSize = 4096; | |||
| HeapBlock<uint8> buffer; | |||
| buffer.malloc (bufferSize); | |||
| for (;;) | |||
| { | |||
| auto num = in.read (buffer, bufferSize); | |||
| if (num <= 0) | |||
| break; | |||
| for (int i = 0; i < num; ++i) | |||
| t = t * 65599 + buffer[i]; | |||
| } | |||
| return t; | |||
| } | |||
| uint64 calculateFileHashCode (const File& file) | |||
| { | |||
| std::unique_ptr<FileInputStream> stream (file.createInputStream()); | |||
| return stream != nullptr ? calculateStreamHashCode (*stream) : 0; | |||
| } | |||
| uint64 calculateMemoryHashCode (const void* data, size_t numBytes) | |||
| { | |||
| uint64 t = 0; | |||
| for (size_t i = 0; i < numBytes; ++i) | |||
| t = t * 65599 + static_cast<const uint8*> (data)[i]; | |||
| return t; | |||
| } | |||
| bool overwriteFileWithNewDataIfDifferent (const File& file, const void* data, size_t numBytes) | |||
| { | |||
| if (file.getSize() == (int64) numBytes | |||
| && calculateMemoryHashCode (data, numBytes) == calculateFileHashCode (file)) | |||
| return true; | |||
| if (file.exists()) | |||
| return file.replaceWithData (data, numBytes); | |||
| return file.getParentDirectory().createDirectory() && file.appendData (data, numBytes); | |||
| } | |||
| bool overwriteFileWithNewDataIfDifferent (const File& file, const MemoryOutputStream& newData) | |||
| { | |||
| return overwriteFileWithNewDataIfDifferent (file, newData.getData(), newData.getDataSize()); | |||
| } | |||
| bool overwriteFileWithNewDataIfDifferent (const File& file, const String& newData) | |||
| { | |||
| const char* const utf8 = newData.toUTF8(); | |||
| return overwriteFileWithNewDataIfDifferent (file, utf8, strlen (utf8)); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,31 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| uint64 calculateStreamHashCode (InputStream& in); | |||
| uint64 calculateFileHashCode (const File& file); | |||
| uint64 calculateMemoryHashCode (const void* data, size_t numBytes); | |||
| bool overwriteFileWithNewDataIfDifferent (const File& file, const void* data, size_t numBytes); | |||
| bool overwriteFileWithNewDataIfDifferent (const File& file, const MemoryOutputStream& newData); | |||
| bool overwriteFileWithNewDataIfDifferent (const File& file, const String& newData); | |||
| } | |||
| } | |||
| @@ -0,0 +1,88 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| static void writeRCValue (MemoryOutputStream& mo, const String& n, const String& value) | |||
| { | |||
| if (value.isNotEmpty()) | |||
| mo << " VALUE \"" << n << "\", \"" | |||
| << addEscapeChars (value) << "\\0\"" << newLine; | |||
| } | |||
| static String getCommaSeparatedVersionNumber (const String& version) | |||
| { | |||
| auto versionParts = StringArray::fromTokens (version, ",.", ""); | |||
| versionParts.trim(); | |||
| versionParts.removeEmptyStrings(); | |||
| while (versionParts.size() < 4) | |||
| versionParts.add ("0"); | |||
| return versionParts.joinIntoString (","); | |||
| } | |||
| void ResourceRcOptions::write (const File& resourceRcFile) const | |||
| { | |||
| MemoryOutputStream mo; | |||
| mo << "#ifdef JUCE_USER_DEFINED_RC_FILE" << newLine | |||
| << " #include JUCE_USER_DEFINED_RC_FILE" << newLine | |||
| << "#else" << newLine | |||
| << newLine | |||
| << "#undef WIN32_LEAN_AND_MEAN" << newLine | |||
| << "#define WIN32_LEAN_AND_MEAN" << newLine | |||
| << "#include <windows.h>" << newLine | |||
| << newLine | |||
| << "VS_VERSION_INFO VERSIONINFO" << newLine | |||
| << "FILEVERSION " << getCommaSeparatedVersionNumber (version) << newLine | |||
| << "BEGIN" << newLine | |||
| << " BLOCK \"StringFileInfo\"" << newLine | |||
| << " BEGIN" << newLine | |||
| << " BLOCK \"040904E4\"" << newLine | |||
| << " BEGIN" << newLine; | |||
| writeRCValue (mo, "CompanyName", companyName); | |||
| writeRCValue (mo, "LegalCopyright", companyCopyright); | |||
| writeRCValue (mo, "FileDescription", projectName); | |||
| writeRCValue (mo, "FileVersion", version); | |||
| writeRCValue (mo, "ProductName", projectName); | |||
| writeRCValue (mo, "ProductVersion", version); | |||
| mo << " END" << newLine | |||
| << " END" << newLine | |||
| << newLine | |||
| << " BLOCK \"VarFileInfo\"" << newLine | |||
| << " BEGIN" << newLine | |||
| << " VALUE \"Translation\", 0x409, 1252" << newLine | |||
| << " END" << newLine | |||
| << "END" << newLine | |||
| << newLine | |||
| << "#endif" << newLine; | |||
| if (icon.existsAsFile()) | |||
| mo << newLine | |||
| << "IDI_ICON1 ICON DISCARDABLE " << icon.getFileName().quoted() | |||
| << newLine | |||
| << "IDI_ICON2 ICON DISCARDABLE " << icon.getFileName().quoted(); | |||
| overwriteFileIfDifferentOrThrow (resourceRcFile, mo); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,36 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| class ResourceRcOptions final | |||
| { | |||
| public: | |||
| void write (const File& resourceRcFile) const; | |||
| //============================================================================== | |||
| String version; | |||
| String companyName; | |||
| String companyCopyright; | |||
| String projectName; | |||
| File icon; | |||
| }; | |||
| } | |||
| } | |||
| @@ -0,0 +1,50 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| StringArray getVersionSegments (juce::StringRef p) | |||
| { | |||
| auto segments = StringArray::fromTokens (p, ",.", ""); | |||
| segments.trim(); | |||
| segments.removeEmptyStrings(); | |||
| return segments; | |||
| } | |||
| int getVersionAsHexInteger (juce::StringRef versionString) | |||
| { | |||
| auto segments = getVersionSegments (versionString); | |||
| auto value = (segments[0].getIntValue() << 16) | |||
| + (segments[1].getIntValue() << 8) | |||
| + segments[2].getIntValue(); | |||
| if (segments.size() > 3) | |||
| value = (value << 8) + segments[3].getIntValue(); | |||
| return value; | |||
| } | |||
| String getVersionAsHex (juce::StringRef versionString) | |||
| { | |||
| return "0x" + String::toHexString (getVersionAsHexInteger (versionString)); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,29 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2017 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| namespace build_tools | |||
| { | |||
| StringArray getVersionSegments (juce::StringRef p); | |||
| int getVersionAsHexInteger (juce::StringRef versionString); | |||
| String getVersionAsHex (juce::StringRef versionString); | |||
| } | |||
| } | |||
| @@ -0,0 +1,90 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| # The juceaide program generates intermediate build files including BinaryData sources, icons, and | |||
| # plists. To ensure that we always build it for the host system, and not for, say, a device or | |||
| # simulator if we're targeting iOS or Android, we reinvoke cmake here and build juceaide during the | |||
| # configuration stage of the outer project. | |||
| if(JUCE_BUILD_HELPER_TOOLS) | |||
| # Build the tool for the current system | |||
| juce_add_console_app(juceaide) | |||
| target_sources(juceaide PRIVATE Main.cpp) | |||
| target_compile_definitions(juceaide PRIVATE | |||
| JUCE_DISABLE_JUCE_VERSION_PRINTING=1 | |||
| JUCE_USE_CURL=0) | |||
| target_link_libraries(juceaide PRIVATE juce::juce_build_tools) | |||
| export(TARGETS juceaide | |||
| NAMESPACE juce_tools:: | |||
| FILE "${JUCE_BINARY_DIR}/JUCEToolsExport.cmake") | |||
| else() | |||
| # If we're building using the NDK, the gradle wrapper will try to inject its own compiler using | |||
| # environment variables, which is unfortunate because we really don't want to cross-compile | |||
| # juceaide. If you really want to set the compilers for juceaide, pass the appropriate | |||
| # CMAKE_<lang>_COMPILER flags when configuring CMake. | |||
| unset(ENV{ASM}) | |||
| unset(ENV{CC}) | |||
| unset(ENV{CXX}) | |||
| # Looks like we're boostrapping, reinvoke CMake | |||
| execute_process(COMMAND "${CMAKE_COMMAND}" | |||
| "-B${JUCE_BINARY_DIR}/tools" | |||
| "-G${CMAKE_GENERATOR}" | |||
| "-DCMAKE_BUILD_TYPE=Debug" | |||
| "-DJUCE_BUILD_HELPER_TOOLS=ON" | |||
| "-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}" | |||
| WORKING_DIRECTORY "${JUCE_SOURCE_DIR}" | |||
| OUTPUT_VARIABLE command_output | |||
| ERROR_VARIABLE command_output | |||
| RESULT_VARIABLE result_variable) | |||
| if(result_variable) | |||
| message(FATAL_ERROR "Failed to configure tools\n${command_output}") | |||
| endif() | |||
| execute_process(COMMAND "${CMAKE_COMMAND}" | |||
| --build "${JUCE_BINARY_DIR}/tools" | |||
| --config Debug | |||
| OUTPUT_VARIABLE command_output | |||
| ERROR_VARIABLE command_output | |||
| RESULT_VARIABLE result_variable) | |||
| if(result_variable) | |||
| message(FATAL_ERROR "Failed to build tools\n${command_output}") | |||
| endif() | |||
| # This will be generated by the recursive invocation of CMake (above) | |||
| include("${JUCE_BINARY_DIR}/tools/JUCEToolsExport.cmake") | |||
| add_executable(juceaide IMPORTED GLOBAL) | |||
| get_target_property(imported_location juce_tools::juceaide IMPORTED_LOCATION_DEBUG) | |||
| set_target_properties(juceaide PROPERTIES IMPORTED_LOCATION "${imported_location}") | |||
| add_executable(juce::juceaide ALIAS juceaide) | |||
| set(JUCE_TOOL_INSTALL_DIR "bin" CACHE STRING | |||
| "The location, relative to the install prefix, where juceaide will be installed") | |||
| install(PROGRAMS "${imported_location}" DESTINATION "${JUCE_TOOL_INSTALL_DIR}") | |||
| get_filename_component(binary_name "${imported_location}" NAME) | |||
| set(JUCE_CMAKE_BINARY_BUILDER_NAME "${JUCE_TOOL_INSTALL_DIR}/${binary_name}" | |||
| CACHE INTERNAL "The name of the juceaide program") | |||
| endif() | |||
| @@ -0,0 +1,507 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 6 technical preview. | |||
| Copyright (c) 2020 - ROLI Ltd. | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For this technical preview, this file is not subject to commercial licensing. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| #include <juce_build_tools/juce_build_tools.h> | |||
| #include <fstream> | |||
| #include <unordered_map> | |||
| namespace | |||
| { | |||
| constexpr auto headerTemplate = R"(/* | |||
| IMPORTANT! This file is auto-generated. | |||
| If you alter its contents, your changes may be overwritten! | |||
| This is the header file that your files should include in order to get all the | |||
| JUCE library headers. You should avoid including the JUCE headers directly in | |||
| your own source files, because that wouldn't pick up the correct configuration | |||
| options for your app. | |||
| */ | |||
| #pragma once | |||
| ${JUCE_INCLUDES} | |||
| #if JUCE_TARGET_HAS_BINARY_DATA | |||
| #include "BinaryData.h" | |||
| #endif | |||
| #if ! DONT_SET_USING_JUCE_NAMESPACE | |||
| // If your code uses a lot of JUCE classes, then this will obviously save you | |||
| // a lot of typing, but can be disabled by setting DONT_SET_USING_JUCE_NAMESPACE. | |||
| using namespace juce; | |||
| #endif | |||
| #if ! JUCE_DONT_DECLARE_PROJECTINFO | |||
| namespace ProjectInfo | |||
| { | |||
| const char* const projectName = "${JUCE_EXECUTABLE_NAME}"; | |||
| const char* const companyName = "${JUCE_COMPANY_NAME}"; | |||
| const char* const versionString = "${JUCE_PROJECT_VERSION}"; | |||
| const int versionNumber = ${JUCE_PROJECT_VERSION_HEX}; | |||
| } | |||
| #endif | |||
| )"; | |||
| juce::String getValueOr (juce::ArgumentList& args, juce::String option, juce::String fallback) | |||
| { | |||
| const auto opt = args.removeValueForOption (option); | |||
| return opt.isNotEmpty() ? opt : fallback; | |||
| } | |||
| int writeBinaryData (juce::ArgumentList&& argumentList) | |||
| { | |||
| juce::build_tools::ResourceFile resourceFile; | |||
| resourceFile.setClassName (getValueOr (argumentList, "--namespace", "BinaryData")); | |||
| const auto lineEndings = argumentList.removeOptionIfFound ("--windows") ? "\r\n" : "\n"; | |||
| if (argumentList.arguments.isEmpty()) | |||
| juce::ConsoleApplication::fail ("No destination folder specified for binary data files", 1); | |||
| const auto outFolder = argumentList.arguments.removeAndReturn (0).resolveAsExistingFolder(); | |||
| for (const auto& arg : argumentList.arguments) | |||
| resourceFile.addFile (arg.resolveAsExistingFile()); | |||
| const auto result = resourceFile.write (0, | |||
| lineEndings, | |||
| outFolder.getChildFile ("./BinaryData.h"), | |||
| [&outFolder] (int index) | |||
| { | |||
| return outFolder.getChildFile ("./BinaryData" + juce::String { index + 1 } + ".cpp"); | |||
| }); | |||
| if (result.result.failed()) | |||
| juce::ConsoleApplication::fail (result.result.getErrorMessage(), 1); | |||
| return 0; | |||
| } | |||
| struct IconParseResults final | |||
| { | |||
| juce::build_tools::Icons icons; | |||
| juce::File output; | |||
| }; | |||
| IconParseResults parseIconArguments (juce::ArgumentList&& args) | |||
| { | |||
| args.checkMinNumArguments (2); | |||
| const auto output = args.arguments.removeAndReturn (0); | |||
| const auto popDrawable = [&args]() -> std::unique_ptr<juce::Drawable> | |||
| { | |||
| if (args.size() == 0) | |||
| return {}; | |||
| const auto firstArgText = args.arguments.removeAndReturn (0).text; | |||
| return juce::Drawable::createFromImageFile (firstArgText); | |||
| }; | |||
| auto smallIcon = popDrawable(); | |||
| auto bigIcon = popDrawable(); | |||
| return { { std::move (smallIcon), std::move (bigIcon) }, output.text }; | |||
| } | |||
| int writeMacIcon (juce::ArgumentList&& argumentList) | |||
| { | |||
| const auto parsed = parseIconArguments (std::move (argumentList)); | |||
| juce::build_tools::writeMacIcon (parsed.icons, parsed.output); | |||
| return 0; | |||
| } | |||
| int writeiOSAssets (juce::ArgumentList&& argumentList) | |||
| { | |||
| const auto parsed = parseIconArguments (std::move (argumentList)); | |||
| juce::build_tools::createXcassetsFolderFromIcons (parsed.icons, | |||
| parsed.output.getParentDirectory(), | |||
| parsed.output.getFileName()); | |||
| return 0; | |||
| } | |||
| int writeWinIcon (juce::ArgumentList&& argumentList) | |||
| { | |||
| const auto parsed = parseIconArguments (std::move (argumentList)); | |||
| juce::build_tools::writeWinIcon (parsed.icons, parsed.output); | |||
| return 0; | |||
| } | |||
| std::unordered_map<juce::String, juce::String> parseProjectData (const juce::File& file) | |||
| { | |||
| constexpr auto recordSeparator = "\x1e"; | |||
| const auto contents = file.loadFileAsString(); | |||
| const auto lines = juce::StringArray::fromTokens (contents, recordSeparator, {}); | |||
| std::unordered_map<juce::String, juce::String> result; | |||
| constexpr auto unitSeparator = "\x1f"; | |||
| for (const auto& line : lines) | |||
| { | |||
| if (line.isEmpty()) | |||
| continue; | |||
| result.emplace (line.upToFirstOccurrenceOf (unitSeparator, false, false), | |||
| line.fromFirstOccurrenceOf (unitSeparator, false, false)); | |||
| } | |||
| return result; | |||
| } | |||
| juce::String getStringValue (const std::unordered_map<juce::String, juce::String>& dict, | |||
| juce::StringRef key) | |||
| { | |||
| const auto it = dict.find (key); | |||
| return it != dict.cend() ? it->second : juce::String{}; | |||
| } | |||
| bool getBoolValue (const std::unordered_map<juce::String, juce::String>& dict, juce::StringRef key) | |||
| { | |||
| const auto str = getStringValue (dict, key); | |||
| return str.equalsIgnoreCase ("yes") | |||
| || str.equalsIgnoreCase ("true") | |||
| || str.equalsIgnoreCase ("1") | |||
| || str.equalsIgnoreCase ("on"); | |||
| } | |||
| struct UpdateField final | |||
| { | |||
| const std::unordered_map<juce::String, juce::String>& dict; | |||
| void operator() (juce::StringRef key, juce::String& value) const | |||
| { | |||
| value = getStringValue (dict, key); | |||
| } | |||
| void operator() (juce::StringRef key, juce::File& value) const | |||
| { | |||
| value = getStringValue (dict, key); | |||
| } | |||
| void operator() (juce::StringRef key, bool& value) const | |||
| { | |||
| value = getBoolValue (dict, key); | |||
| } | |||
| void operator() (juce::StringRef key, juce::StringArray& value) const | |||
| { | |||
| value = juce::StringArray::fromTokens (getStringValue (dict, key), ";", {}); | |||
| } | |||
| }; | |||
| void setIfEmpty (juce::String& field, juce::StringRef fallback) | |||
| { | |||
| if (field.isEmpty()) | |||
| field = fallback; | |||
| } | |||
| juce::build_tools::PlistOptions parsePlistOptions (const juce::File& file, | |||
| juce::build_tools::ProjectType::Target::Type type) | |||
| { | |||
| if (type == juce::build_tools::ProjectType::Target::ConsoleApp) | |||
| juce::ConsoleApplication::fail ("Deduced project type does not require a plist", 1); | |||
| const auto dict = parseProjectData (file); | |||
| UpdateField updateField { dict }; | |||
| juce::build_tools::PlistOptions result; | |||
| updateField ("EXECUTABLE_NAME", result.executableName); | |||
| updateField ("PLIST_TO_MERGE", result.plistToMerge); | |||
| updateField ("IS_IOS", result.iOS); | |||
| updateField ("MICROPHONE_PERMISSION_ENABLED", result.microphonePermissionEnabled); | |||
| updateField ("MICROPHONE_PERMISSION_TEXT", result.microphonePermissionText); | |||
| updateField ("CAMERA_PERMISSION_ENABLED", result.cameraPermissionEnabled); | |||
| updateField ("CAMERA_PERMISSION_TEXT", result.cameraPermissionText); | |||
| updateField ("BLUETOOTH_PERMISSION_ENABLED", result.bluetoothPermissionEnabled); | |||
| updateField ("BLUETOOTH_PERMISSION_TEXT", result.bluetoothPermissionText); | |||
| updateField ("SEND_APPLE_EVENTS_PERMISSION_ENABLED", result.sendAppleEventsPermissionEnabled); | |||
| updateField ("SEND_APPLE_EVENTS_PERMISSION_TEXT", result.sendAppleEventsPermissionText); | |||
| updateField ("SHOULD_ADD_STORYBOARD", result.shouldAddStoryboardToProject); | |||
| updateField ("LAUNCH_STORYBOARD_FILE", result.storyboardName); | |||
| updateField ("PROJECT_NAME", result.projectName); | |||
| updateField ("VERSION", result.version); | |||
| updateField ("COMPANY_COPYRIGHT", result.companyCopyright); | |||
| updateField ("DOCUMENT_EXTENSIONS", result.documentExtensions); | |||
| updateField ("FILE_SHARING_ENABLED", result.fileSharingEnabled); | |||
| updateField ("DOCUMENT_BROWSER_ENABLED", result.documentBrowserEnabled); | |||
| updateField ("STATUS_BAR_HIDDEN", result.statusBarHidden); | |||
| updateField ("BACKGROUND_AUDIO_ENABLED", result.backgroundAudioEnabled); | |||
| updateField ("BACKGROUND_BLE_ENABLED", result.backgroundBleEnabled); | |||
| updateField ("PUSH_NOTIFICATIONS_ENABLED", result.pushNotificationsEnabled); | |||
| updateField ("PLUGIN_MANUFACTURER_CODE", result.pluginManufacturerCode); | |||
| updateField ("PLUGIN_CODE", result.pluginCode); | |||
| updateField ("IPHONE_SCREEN_ORIENTATIONS", result.iPhoneScreenOrientations); | |||
| updateField ("IPAD_SCREEN_ORIENTATIONS", result.iPadScreenOrientations); | |||
| updateField ("PLUGIN_NAME", result.pluginName); | |||
| updateField ("PLUGIN_MANUFACTURER", result.pluginManufacturer); | |||
| updateField ("PLUGIN_DESCRIPTION", result.pluginDescription); | |||
| updateField ("PLUGIN_AU_EXPORT_PREFIX", result.pluginAUExportPrefix); | |||
| updateField ("PLUGIN_AU_MAIN_TYPE", result.auMainType); | |||
| updateField ("IS_AU_SANDBOX_SAFE", result.isAuSandboxSafe); | |||
| updateField ("IS_PLUGIN_SYNTH", result.isPluginSynth); | |||
| updateField ("BUNDLE_ID", result.bundleIdentifier); | |||
| updateField ("ICON_FILE", result.iconFile); | |||
| result.type = type; | |||
| result.versionAsHex = juce::build_tools::getVersionAsHexInteger (result.version); | |||
| if (result.storyboardName.isNotEmpty()) | |||
| result.storyboardName = result.storyboardName.fromLastOccurrenceOf ("/", false, false) | |||
| .upToLastOccurrenceOf (".storyboard", false, false); | |||
| setIfEmpty (result.microphonePermissionText, | |||
| "This app requires audio input. If you do not have an audio interface connected it will use the built-in microphone."); | |||
| setIfEmpty (result.cameraPermissionText, | |||
| "This app requires access to the camera to function correctly."); | |||
| setIfEmpty (result.bluetoothPermissionText, | |||
| "This app requires access to Bluetooth to function correctly."); | |||
| setIfEmpty (result.sendAppleEventsPermissionText, | |||
| "This app requires the ability to send Apple events to function correctly."); | |||
| result.documentExtensions = result.documentExtensions.replace (";", ","); | |||
| // AUv3 needs a slightly different bundle ID | |||
| if (type == juce::build_tools::ProjectType::Target::Type::AudioUnitv3PlugIn) | |||
| { | |||
| const auto bundleIdSegments = juce::StringArray::fromTokens (result.bundleIdentifier, ".", {}); | |||
| jassert (! bundleIdSegments.isEmpty()); | |||
| const auto last = bundleIdSegments.isEmpty() ? "" | |||
| : bundleIdSegments[bundleIdSegments.size() - 1]; | |||
| result.bundleIdentifier += "." + last + "AUv3"; | |||
| } | |||
| return result; | |||
| } | |||
| int writePlist (juce::ArgumentList&& args) | |||
| { | |||
| args.checkMinNumArguments (3); | |||
| const auto kind = args.arguments.removeAndReturn (0); | |||
| const auto input = args.arguments.removeAndReturn (0); | |||
| const auto output = args.arguments.removeAndReturn (0); | |||
| parsePlistOptions (input.resolveAsExistingFile(), | |||
| juce::build_tools::ProjectType::Target::typeFromName (kind.text)) | |||
| .write (output.resolveAsFile()); | |||
| return 0; | |||
| } | |||
| juce::build_tools::EntitlementOptions parseEntitlementsOptions (const juce::File& file, | |||
| juce::build_tools::ProjectType::Target::Type type) | |||
| { | |||
| if (type == juce::build_tools::ProjectType::Target::ConsoleApp) | |||
| juce::ConsoleApplication::fail ("Deduced project type does not require entitlements", 1); | |||
| const auto dict = parseProjectData (file); | |||
| UpdateField updateField { dict }; | |||
| juce::build_tools::EntitlementOptions result; | |||
| updateField ("IS_IOS", result.isiOS); | |||
| updateField ("IS_PLUGIN", result.isAudioPluginProject); | |||
| updateField ("ICLOUD_PERMISSIONS_ENABLED", result.isiCloudPermissionsEnabled); | |||
| updateField ("PUSH_NOTIFICATIONS_ENABLED", result.isPushNotificationsEnabled); | |||
| updateField ("APP_GROUPS_ENABLED", result.isAppGroupsEnabled); | |||
| updateField ("APP_GROUP_IDS", result.appGroupIdString); | |||
| updateField ("HARDENED_RUNTIME_ENABLED", result.isHardenedRuntimeEnabled); | |||
| updateField ("HARDENED_RUNTIME_OPTIONS", result.hardenedRuntimeOptions); | |||
| updateField ("APP_SANDBOX_ENABLED", result.isAppSandboxEnabled); | |||
| updateField ("APP_SANDBOX_INHERIT", result.isAppSandboxInhertianceEnabled); | |||
| updateField ("APP_SANDBOX_OPTIONS", result.appSandboxOptions); | |||
| result.type = type; | |||
| return result; | |||
| } | |||
| int writeEntitlements (juce::ArgumentList&& args) | |||
| { | |||
| args.checkMinNumArguments (3); | |||
| const auto kind = args.arguments.removeAndReturn (0); | |||
| const auto input = args.arguments.removeAndReturn (0); | |||
| const auto output = args.arguments.removeAndReturn (0); | |||
| const auto options = parseEntitlementsOptions (input.resolveAsExistingFile(), | |||
| juce::build_tools::ProjectType::Target::typeFromName (kind.text)); | |||
| juce::build_tools::overwriteFileIfDifferentOrThrow (output.resolveAsFile(), options.getEntitlementsFileContent()); | |||
| return 0; | |||
| } | |||
| int createAndWrite (const juce::File& file, juce::StringRef text) | |||
| { | |||
| if (file.create()) | |||
| return file.replaceWithText (text) ? 0 : 1; | |||
| return 1; | |||
| } | |||
| int writePkgInfo (juce::ArgumentList&& args) | |||
| { | |||
| args.checkMinNumArguments (2); | |||
| const auto kind = args.arguments.removeAndReturn (0); | |||
| const auto output = args.arguments.removeAndReturn (0); | |||
| const auto projectType = juce::build_tools::ProjectType::Target::typeFromName (kind.text); | |||
| return createAndWrite (output.resolveAsFile(), | |||
| juce::build_tools::getXcodePackageType (projectType) | |||
| + juce::build_tools::getXcodeBundleSignature (projectType)); | |||
| } | |||
| juce::build_tools::ResourceRcOptions parseRcFileOptions (const juce::File& file) | |||
| { | |||
| const auto dict = parseProjectData (file); | |||
| UpdateField updateField { dict }; | |||
| juce::build_tools::ResourceRcOptions result; | |||
| updateField ("VERSION", result.version); | |||
| updateField ("COMPANY_NAME", result.companyName); | |||
| updateField ("COMPANY_COPYRIGHT", result.companyCopyright); | |||
| updateField ("PROJECT_NAME", result.projectName); | |||
| updateField ("ICON_FILE", result.icon); | |||
| return result; | |||
| } | |||
| int writeRcFile (juce::ArgumentList&& args) | |||
| { | |||
| args.checkMinNumArguments (2); | |||
| const auto input = args.arguments.removeAndReturn (0); | |||
| const auto output = args.arguments.removeAndReturn (0); | |||
| parseRcFileOptions (input.resolveAsExistingFile()).write (output.resolveAsFile()); | |||
| return 0; | |||
| } | |||
| juce::String createDefineStatements (juce::StringRef definitions) | |||
| { | |||
| const auto split = juce::StringArray::fromTokens (definitions, ";", "\""); | |||
| juce::String defineStatements; | |||
| for (const auto& def : split) | |||
| { | |||
| const auto defineName = def.upToFirstOccurrenceOf ("=", false, false); | |||
| const auto defineValue = def.fromFirstOccurrenceOf ("=", false, false); | |||
| defineStatements += "#define " + defineName + " " + defineValue + '\n'; | |||
| } | |||
| return defineStatements; | |||
| } | |||
| int writeAuAppConfig (juce::ArgumentList&& args) | |||
| { | |||
| args.checkMinNumArguments (2); | |||
| const auto input = args.arguments.removeAndReturn (0); | |||
| const auto output = args.arguments.removeAndReturn (0); | |||
| const auto dict = parseProjectData (input.resolveAsExistingFile()); | |||
| const auto getString = [&] (juce::StringRef key) { return getStringValue (dict, key); }; | |||
| const auto defines = "#pragma once\n" + createDefineStatements (getString ("MODULE_DEFINITIONS")); | |||
| return createAndWrite (output.resolveAsFile(), defines); | |||
| } | |||
| juce::String createIncludeStatements (juce::StringRef definitions) | |||
| { | |||
| const auto split = juce::StringArray::fromTokens (definitions, ";", "\""); | |||
| juce::String includeStatements; | |||
| for (const auto& def : split) | |||
| { | |||
| constexpr auto moduleToken = "JUCE_MODULE_AVAILABLE_"; | |||
| if (def.startsWith (moduleToken)) | |||
| { | |||
| const auto moduleName = def.fromFirstOccurrenceOf (moduleToken, false, false) | |||
| .upToFirstOccurrenceOf ("=", false, false); | |||
| includeStatements += "#include <" + moduleName + "/" + moduleName + ".h>\n"; | |||
| } | |||
| } | |||
| return includeStatements; | |||
| } | |||
| int writeHeader (juce::ArgumentList&& args) | |||
| { | |||
| args.checkMinNumArguments (2); | |||
| const auto input = args.arguments.removeAndReturn (0); | |||
| const auto output = args.arguments.removeAndReturn (0); | |||
| const auto dict = parseProjectData (input.resolveAsExistingFile()); | |||
| const auto getString = [&] (juce::StringRef key) { return getStringValue (dict, key); }; | |||
| const auto includes = createIncludeStatements (getString ("MODULE_DEFINITIONS")); | |||
| const auto projectName = getString ("PROJECT_NAME"); | |||
| const auto name = projectName.isEmpty() ? getString ("EXECUTABLE_NAME") : projectName; | |||
| const auto versionString = getString ("VERSION"); | |||
| const auto headerText = juce::String (headerTemplate) | |||
| .replace ("${JUCE_INCLUDES}", includes) | |||
| .replace ("${JUCE_EXECUTABLE_NAME}", name) | |||
| .replace ("${JUCE_COMPANY_NAME}", getString ("COMPANY_NAME")) | |||
| .replace ("${JUCE_PROJECT_VERSION}", versionString) | |||
| .replace ("${JUCE_PROJECT_VERSION_HEX}", juce::build_tools::getVersionAsHex (versionString)); | |||
| return createAndWrite (output.resolveAsFile(), headerText); | |||
| } | |||
| } // namespace | |||
| int main (int argc, char** argv) | |||
| { | |||
| juce::ScopedJuceInitialiser_GUI libraryInitialiser; | |||
| return juce::ConsoleApplication::invokeCatchingFailures ([argc, argv] | |||
| { | |||
| juce::ArgumentList argumentList { argc, argv }; | |||
| using Fn = typename std::add_lvalue_reference<decltype (writeBinaryData)>::type; | |||
| const std::unordered_map<juce::String, Fn> commands | |||
| { | |||
| { "auappconfig", writeAuAppConfig }, | |||
| { "binarydata", writeBinaryData }, | |||
| { "entitlements", writeEntitlements }, | |||
| { "header", writeHeader }, | |||
| { "iosassets", writeiOSAssets }, | |||
| { "macicon", writeMacIcon }, | |||
| { "pkginfo", writePkgInfo }, | |||
| { "plist", writePlist }, | |||
| { "rcfile", writeRcFile }, | |||
| { "winicon", writeWinIcon } | |||
| }; | |||
| argumentList.checkMinNumArguments (1); | |||
| const auto mode = argumentList.arguments.removeAndReturn (0); | |||
| const auto it = commands.find (mode.text); | |||
| if (it == commands.cend()) | |||
| juce::ConsoleApplication::fail ("No matching mode", 1); | |||
| return it->second (std::move (argumentList)); | |||
| }); | |||
| } | |||
| @@ -0,0 +1,22 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| add_subdirectory(AudioPerformanceTest) | |||
| add_subdirectory(AudioPluginHost) | |||
| add_subdirectory(BinaryBuilder) | |||
| add_subdirectory(NetworkGraphicsDemo) | |||
| add_subdirectory(Projucer) | |||
| add_subdirectory(UnitTestRunner) | |||
| @@ -0,0 +1,30 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| juce_add_gui_app(NetworkGraphicsDemo) | |||
| juce_generate_juce_header(NetworkGraphicsDemo) | |||
| target_sources(NetworkGraphicsDemo PRIVATE Source/Main.cpp) | |||
| target_compile_definitions(NetworkGraphicsDemo PRIVATE | |||
| JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0) | |||
| target_link_libraries(NetworkGraphicsDemo PRIVATE | |||
| juce::juce_audio_utils | |||
| juce::juce_cryptography | |||
| juce::juce_opengl | |||
| juce::juce_osc) | |||
| @@ -35,7 +35,7 @@ ifeq ($(CONFIG),Debug) | |||
| TARGET_ARCH := | |||
| endif | |||
| JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=6.0.0 -DJUCE_APP_VERSION_HEX=0x60000 $(shell pkg-config --cflags x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) | |||
| JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=6.0.0 -DJUCE_APP_VERSION_HEX=0x60000 $(shell pkg-config --cflags x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules -I../../../Build $(CPPFLAGS) | |||
| JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0 | |||
| JUCE_TARGET_APP := Projucer | |||
| @@ -56,7 +56,7 @@ ifeq ($(CONFIG),Release) | |||
| TARGET_ARCH := | |||
| endif | |||
| JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=6.0.0 -DJUCE_APP_VERSION_HEX=0x60000 $(shell pkg-config --cflags x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) | |||
| JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=6.0.0 -DJUCE_APP_VERSION_HEX=0x60000 $(shell pkg-config --cflags x11 xinerama xext freetype2 webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules -I../../../Build $(CPPFLAGS) | |||
| JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0 | |||
| JUCE_TARGET_APP := Projucer | |||
| @@ -123,6 +123,7 @@ OBJECTS_APP := \ | |||
| $(JUCE_OBJDIR)/jucer_NewProjectWizardClasses_891f6fa2.o \ | |||
| $(JUCE_OBJDIR)/BinaryData_ce4232d4.o \ | |||
| $(JUCE_OBJDIR)/include_juce_analytics_f8e9fa94.o \ | |||
| $(JUCE_OBJDIR)/include_juce_build_tools_f5069398.o \ | |||
| $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \ | |||
| $(JUCE_OBJDIR)/include_juce_cryptography_8cb807a8.o \ | |||
| $(JUCE_OBJDIR)/include_juce_data_structures_7471b1e3.o \ | |||
| @@ -419,6 +420,11 @@ $(JUCE_OBJDIR)/include_juce_analytics_f8e9fa94.o: ../../JuceLibraryCode/include_ | |||
| @echo "Compiling include_juce_analytics.cpp" | |||
| $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" | |||
| $(JUCE_OBJDIR)/include_juce_build_tools_f5069398.o: ../../JuceLibraryCode/include_juce_build_tools.cpp | |||
| -$(V_AT)mkdir -p $(JUCE_OBJDIR) | |||
| @echo "Compiling include_juce_build_tools.cpp" | |||
| $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" | |||
| $(JUCE_OBJDIR)/include_juce_core_f26d17db.o: ../../JuceLibraryCode/include_juce_core.cpp | |||
| -$(V_AT)mkdir -p $(JUCE_OBJDIR) | |||
| @echo "Compiling include_juce_core.cpp" | |||
| @@ -297,6 +297,10 @@ | |||
| isa = PBXBuildFile; | |||
| fileRef = 805A3A5FBA3B9E28363DD77B; | |||
| }; | |||
| 4C743A3DA8682EEE89BDBD28 = { | |||
| isa = PBXBuildFile; | |||
| fileRef = E2687B099347B364D1919A9B; | |||
| }; | |||
| 5DD883699B85E4C492CAD065 = { | |||
| isa = PBXBuildFile; | |||
| fileRef = DB9C8E35DF815B803CB4A9CF; | |||
| @@ -640,6 +644,13 @@ | |||
| path = "../../../../modules/juce_events"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| 233C7FC5157176DB33FE2F27 = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = file.nib; | |||
| name = RecentFilesMenuTemplate.nib; | |||
| path = ../../../Build/CMake/RecentFilesMenuTemplate.nib; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| 23A8DE16C0CDB8EED18B008B = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = sourcecode.c.h; | |||
| @@ -836,13 +847,6 @@ | |||
| path = "../../Source/Utility/UI/jucer_SlidingPanelComponent.h"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| 3DC2ED15A9DFAAEF3D2ACDDF = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = sourcecode.cpp.cpp; | |||
| name = "jucer_PIPMain.cpp"; | |||
| path = "../../Source/BinaryData/Templates/jucer_PIPMain.cpp"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| 3EA27F52A254912218F4DE94 = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = sourcecode.c.h; | |||
| @@ -913,6 +917,13 @@ | |||
| path = "../../Source/BinaryData/Icons/juce-logo-with-text.svg"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| 463C8CF42FAA00014198B71B = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = file.in; | |||
| name = PIPComponent.cpp.in; | |||
| path = ../../../Build/CMake/PIPComponent.cpp.in; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| 471C7B0A8B92320AF0C80839 = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = sourcecode.c.h; | |||
| @@ -1025,6 +1036,13 @@ | |||
| path = "../../Source/ComponentEditor/jucer_ObjectTypes.h"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| 50F89D3827B83B48855B3564 = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = file.storyboard; | |||
| name = LaunchScreen.storyboard; | |||
| path = ../../../Build/CMake/LaunchScreen.storyboard; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| 512D80BE12634967A085A1DC = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = sourcecode.cpp.cpp; | |||
| @@ -1109,13 +1127,6 @@ | |||
| path = "../../Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| 58139D8D454051C59E77609B = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = file.nib; | |||
| name = RecentFilesMenuTemplate.nib; | |||
| path = ../../Source/BinaryData/RecentFilesMenuTemplate.nib; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| 5867DC4E39DF8539B54C0D59 = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = sourcecode.cpp.objcpp; | |||
| @@ -1368,13 +1379,6 @@ | |||
| path = "../../Source/ComponentEditor/UI/jucer_SnapGridPainter.h"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| 763A63E75AC802F17D11FE8B = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = file.cs; | |||
| name = "jucer_UnityPluginGUIScript.cs"; | |||
| path = "../../Source/BinaryData/Templates/jucer_UnityPluginGUIScript.cs"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| 7687A1374C60A025BDBE98DE = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = sourcecode.c.h; | |||
| @@ -1823,6 +1827,13 @@ | |||
| path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| A0ECDAF137029C445910D3ED = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = file.in; | |||
| name = PIPAudioProcessor.cpp.in; | |||
| path = ../../../Build/CMake/PIPAudioProcessor.cpp.in; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| A160AEF56553A658E6EA6A8E = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = sourcecode.cpp.cpp; | |||
| @@ -1977,13 +1988,6 @@ | |||
| path = "../../../../modules/juce_graphics"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| B8385E9A644BD3CD94876448 = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = sourcecode.c.h; | |||
| name = "jucer_ProjectType.h"; | |||
| path = "../../Source/Project/jucer_ProjectType.h"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| B83C9BD89F31EA9E5E12A3C6 = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = image.png; | |||
| @@ -2390,6 +2394,13 @@ | |||
| path = "Info-App.plist"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| E2687B099347B364D1919A9B = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = sourcecode.cpp.cpp; | |||
| name = "include_juce_build_tools.cpp"; | |||
| path = "../../JuceLibraryCode/include_juce_build_tools.cpp"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| E2B668E2A65AEE8F07B406C8 = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = sourcecode.c.h; | |||
| @@ -2474,6 +2485,13 @@ | |||
| path = "../../Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| EE12741389A87D1BF04AE795 = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = file; | |||
| name = "juce_build_tools"; | |||
| path = "../../../Build/juce_build_tools"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| EE690110171E1648FF2118B8 = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = sourcecode.c.h; | |||
| @@ -2516,6 +2534,13 @@ | |||
| path = "../../Source/Utility/Helpers/jucer_CodeHelpers.cpp"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| F313EE01ECE306DB2CFE011D = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = file.in; | |||
| name = UnityPluginGUIScript.cs.in; | |||
| path = ../../../Build/CMake/UnityPluginGUIScript.cs.in; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| F3CC8F26ECCDA6DCD8A284D2 = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = sourcecode.c.h; | |||
| @@ -2551,6 +2576,13 @@ | |||
| path = "../../Source/Application/Windows/jucer_TranslationToolWindowComponent.h"; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| F84D031B2A6BB1EE6A316C71 = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = file.in; | |||
| name = PIPConsole.cpp.in; | |||
| path = ../../../Build/CMake/PIPConsole.cpp.in; | |||
| sourceTree = "SOURCE_ROOT"; | |||
| }; | |||
| F8A38C0C7C45F2DB6A5FB812 = { | |||
| isa = PBXFileReference; | |||
| lastKnownFileType = file.svg; | |||
| @@ -2652,7 +2684,7 @@ | |||
| name = Application; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| 8CF70DA9AB4725126B9F55BE = { | |||
| 59BA7D0ED63ACD9A7F3E8814 = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 129F2DE0FEF154F8F8C7A74E, | |||
| @@ -2663,7 +2695,7 @@ | |||
| name = gradle; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| F0F189518721D46C0F94FD56 = { | |||
| C83BF6127A39BE2C4ED80B67 = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 514F2FAFDBF535AC03FA2E6C, | |||
| @@ -2690,7 +2722,7 @@ | |||
| name = Icons; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| E59ABA0D11CBAAD77179E9C6 = { | |||
| 86B4069D904AB46AC86FB383 = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 9A3B8BBDA8E144A3DF6B9349, | |||
| @@ -2722,25 +2754,28 @@ | |||
| 023B92AC0340305762412E90, | |||
| 3F7C5B53347A487C7FBD2223, | |||
| 4ECF029E3A69BF42FED1503D, | |||
| 3DC2ED15A9DFAAEF3D2ACDDF, | |||
| E67999BF57B139E00207A374, | |||
| 763A63E75AC802F17D11FE8B, | |||
| ); | |||
| name = Templates; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| A9399733CAA07BDAB958242C = { | |||
| DC3A4B0AD79334BA8A7E0661 = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 8CF70DA9AB4725126B9F55BE, | |||
| F0F189518721D46C0F94FD56, | |||
| E59ABA0D11CBAAD77179E9C6, | |||
| 50F89D3827B83B48855B3564, | |||
| A0ECDAF137029C445910D3ED, | |||
| 463C8CF42FAA00014198B71B, | |||
| F84D031B2A6BB1EE6A316C71, | |||
| 233C7FC5157176DB33FE2F27, | |||
| F313EE01ECE306DB2CFE011D, | |||
| 59BA7D0ED63ACD9A7F3E8814, | |||
| C83BF6127A39BE2C4ED80B67, | |||
| 86B4069D904AB46AC86FB383, | |||
| 41105E536155E394E54BDD35, | |||
| 5F6584B675E30761521A9F42, | |||
| 59B08C7B13B8EA5137ACA77A, | |||
| 8C281F2F8EA3AD614ADF7955, | |||
| 4073A12E196BDDADE211E19F, | |||
| 58139D8D454051C59E77609B, | |||
| ); | |||
| name = BinaryData; | |||
| sourceTree = "<group>"; | |||
| @@ -2979,7 +3014,6 @@ | |||
| 7211101FFA28400ADBB1D47A, | |||
| BAC43B20E14A340CCF14119C, | |||
| BF3CEF080FA013E2778DCE90, | |||
| B8385E9A644BD3CD94876448, | |||
| ); | |||
| name = Project; | |||
| sourceTree = "<group>"; | |||
| @@ -3111,7 +3145,7 @@ | |||
| isa = PBXGroup; | |||
| children = ( | |||
| BC67FD952A6F210A11A1ECB8, | |||
| A9399733CAA07BDAB958242C, | |||
| DC3A4B0AD79334BA8A7E0661, | |||
| F1B44F007A02A0FAE4DC8D79, | |||
| F6BD840F9A06F2DA891E2CB8, | |||
| 144B649D98AE8316058B8281, | |||
| @@ -3129,6 +3163,7 @@ | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 58DE91CE6B05AFBACADDB251, | |||
| EE12741389A87D1BF04AE795, | |||
| BA159A3B7D129771F5C15EA3, | |||
| AA1C44E89D792DDC4867B2C8, | |||
| 69555CEFC6ED613AA3949298, | |||
| @@ -3147,6 +3182,7 @@ | |||
| 472F9A90F685220D730EBF6C, | |||
| 4F687965FBE86EAFDB3ACFEC, | |||
| 805A3A5FBA3B9E28363DD77B, | |||
| E2687B099347B364D1919A9B, | |||
| DB9C8E35DF815B803CB4A9CF, | |||
| D766BB9D8C32B5560F0493F3, | |||
| 1DE5BBC777FB64798D823002, | |||
| @@ -3243,6 +3279,7 @@ | |||
| HEADER_SEARCH_PATHS = ( | |||
| "../../JuceLibraryCode", | |||
| "../../../../modules", | |||
| "../../../Build", | |||
| "$(inherited)", | |||
| ); | |||
| INFOPLIST_FILE = Info-App.plist; | |||
| @@ -3287,6 +3324,7 @@ | |||
| HEADER_SEARCH_PATHS = ( | |||
| "../../JuceLibraryCode", | |||
| "../../../../modules", | |||
| "../../../Build", | |||
| "$(inherited)", | |||
| ); | |||
| INFOPLIST_FILE = Info-App.plist; | |||
| @@ -3487,6 +3525,7 @@ | |||
| B7EBA1A83575F48CD08140B9, | |||
| 3C5267E06A897B0DC0F7EA50, | |||
| 202DC8CF15ACBE096CC327EA, | |||
| 4C743A3DA8682EEE89BDBD28, | |||
| 5DD883699B85E4C492CAD065, | |||
| D5C9125F65493CA481F18E53, | |||
| 02E8F35A8E0D4A0DF6F38D60, | |||
| @@ -63,7 +63,7 @@ | |||
| <ClCompile> | |||
| <Optimization>Disabled</Optimization> | |||
| <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> | |||
| <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;..\..\..\Build;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.0.0;JUCE_APP_VERSION_HEX=0x60000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||
| <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> | |||
| <RuntimeTypeInfo>true</RuntimeTypeInfo> | |||
| @@ -105,7 +105,7 @@ | |||
| </Midl> | |||
| <ClCompile> | |||
| <Optimization>Full</Optimization> | |||
| <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;..\..\..\Build;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.0.0;JUCE_APP_VERSION_HEX=0x60000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||
| <RuntimeLibrary>MultiThreaded</RuntimeLibrary> | |||
| <RuntimeTypeInfo>true</RuntimeTypeInfo> | |||
| @@ -187,9 +187,6 @@ | |||
| <ClCompile Include="..\..\Source\BinaryData\Templates\jucer_OpenGLComponentTemplate.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\BinaryData\Templates\jucer_PIPMain.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\CodeEditor\jucer_DocumentEditorComponent.cpp"/> | |||
| <ClCompile Include="..\..\Source\CodeEditor\jucer_OpenDocumentManager.cpp"/> | |||
| <ClCompile Include="..\..\Source\CodeEditor\jucer_SourceCodeEditor.cpp"/> | |||
| @@ -253,6 +250,36 @@ | |||
| <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_BinaryResourceFile.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_BuildHelperFunctions.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_CppTokeniserFunctions.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_Entitlements.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_Icons.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_PlistOptions.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceFileHelpers.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceRc.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_VersionNumbers.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\juce_build_tools.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| @@ -1452,6 +1479,7 @@ | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\JuceLibraryCode\BinaryData.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_analytics.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_build_tools.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_core.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_cryptography.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_data_structures.cpp"/> | |||
| @@ -1601,7 +1629,6 @@ | |||
| <ClInclude Include="..\..\Source\Project\UI\jucer_ProjectContentComponent.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_Module.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_Project.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectType.h"/> | |||
| <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExport_Android.h"/> | |||
| <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExport_CLion.h"/> | |||
| <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExport_CodeBlocks.h"/> | |||
| @@ -1654,6 +1681,17 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_analytics\destinations\juce_AnalyticsDestination.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_analytics\destinations\juce_ThreadedAnalyticsDestination.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_analytics\juce_analytics.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_BinaryResourceFile.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_BuildHelperFunctions.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_Entitlements.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_Icons.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_PlistOptions.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ProjectType.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_RelativePath.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceFileHelpers.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceRc.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_VersionNumbers.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\juce_build_tools.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/> | |||
| @@ -2064,6 +2102,12 @@ | |||
| <ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <None Include="..\..\..\Build\CMake\LaunchScreen.storyboard"/> | |||
| <None Include="..\..\..\Build\CMake\PIPAudioProcessor.cpp.in"/> | |||
| <None Include="..\..\..\Build\CMake\PIPComponent.cpp.in"/> | |||
| <None Include="..\..\..\Build\CMake\PIPConsole.cpp.in"/> | |||
| <None Include="..\..\..\Build\CMake\RecentFilesMenuTemplate.nib"/> | |||
| <None Include="..\..\..\Build\CMake\UnityPluginGUIScript.cs.in"/> | |||
| <None Include="..\..\Source\BinaryData\gradle\gradle-wrapper.jar"/> | |||
| <None Include="..\..\Source\BinaryData\gradle\gradlew"/> | |||
| <None Include="..\..\Source\BinaryData\gradle\gradlew.bat"/> | |||
| @@ -2088,13 +2132,11 @@ | |||
| <None Include="..\..\Source\BinaryData\Icons\wizard_Openfile.svg"/> | |||
| <None Include="..\..\Source\BinaryData\Icons\wizard_OpenGL.svg"/> | |||
| <None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg"/> | |||
| <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs"/> | |||
| <None Include="..\..\Source\BinaryData\colourscheme_dark.xml"/> | |||
| <None Include="..\..\Source\BinaryData\colourscheme_light.xml"/> | |||
| <None Include="..\..\Source\BinaryData\nothingtoseehere.txt"/> | |||
| <None Include="..\..\Source\BinaryData\offlinepage.html"/> | |||
| <None Include="..\..\Source\BinaryData\projucer_EULA.txt"/> | |||
| <None Include="..\..\Source\BinaryData\RecentFilesMenuTemplate.nib"/> | |||
| <None Include="..\..\..\..\modules\juce_core\native\java\README.txt"/> | |||
| <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/> | |||
| <None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/> | |||
| @@ -95,6 +95,12 @@ | |||
| <Filter Include="JUCE Modules\juce_analytics"> | |||
| <UniqueIdentifier>{97F7F593-75F8-D6B2-DC96-C946C3976226}</UniqueIdentifier> | |||
| </Filter> | |||
| <Filter Include="JUCE Modules\juce_build_tools\utils"> | |||
| <UniqueIdentifier>{D9FAFF6D-6737-F775-056A-D0B29BE13820}</UniqueIdentifier> | |||
| </Filter> | |||
| <Filter Include="JUCE Modules\juce_build_tools"> | |||
| <UniqueIdentifier>{065C11E4-EB37-5B72-0A01-F549675EB866}</UniqueIdentifier> | |||
| </Filter> | |||
| <Filter Include="JUCE Modules\juce_core\containers"> | |||
| <UniqueIdentifier>{42F7BE9D-3C8A-AE26-289B-8F355C068036}</UniqueIdentifier> | |||
| </Filter> | |||
| @@ -370,9 +376,6 @@ | |||
| <ClCompile Include="..\..\Source\BinaryData\Templates\jucer_OpenGLComponentTemplate.cpp"> | |||
| <Filter>Projucer\BinaryData\Templates</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\BinaryData\Templates\jucer_PIPMain.cpp"> | |||
| <Filter>Projucer\BinaryData\Templates</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\CodeEditor\jucer_DocumentEditorComponent.cpp"> | |||
| <Filter>Projucer\CodeEditor</Filter> | |||
| </ClCompile> | |||
| @@ -532,6 +535,36 @@ | |||
| <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp"> | |||
| <Filter>JUCE Modules\juce_analytics</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_BinaryResourceFile.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_BuildHelperFunctions.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_CppTokeniserFunctions.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_Entitlements.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_Icons.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_PlistOptions.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceFileHelpers.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceRc.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_VersionNumbers.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\juce_build_tools.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp"> | |||
| <Filter>JUCE Modules\juce_core\containers</Filter> | |||
| </ClCompile> | |||
| @@ -1819,6 +1852,9 @@ | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_analytics.cpp"> | |||
| <Filter>JUCE Library Code</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_build_tools.cpp"> | |||
| <Filter>JUCE Library Code</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_core.cpp"> | |||
| <Filter>JUCE Library Code</Filter> | |||
| </ClCompile> | |||
| @@ -2262,9 +2298,6 @@ | |||
| <ClInclude Include="..\..\Source\Project\jucer_Project.h"> | |||
| <Filter>Projucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectType.h"> | |||
| <Filter>Projucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExport_Android.h"> | |||
| <Filter>Projucer\ProjectSaving</Filter> | |||
| </ClInclude> | |||
| @@ -2421,6 +2454,39 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_analytics\juce_analytics.h"> | |||
| <Filter>JUCE Modules\juce_analytics</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_BinaryResourceFile.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_BuildHelperFunctions.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_Entitlements.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_Icons.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_PlistOptions.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ProjectType.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_RelativePath.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceFileHelpers.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceRc.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_VersionNumbers.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\juce_build_tools.h"> | |||
| <Filter>JUCE Modules\juce_build_tools</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"> | |||
| <Filter>JUCE Modules\juce_core\containers</Filter> | |||
| </ClInclude> | |||
| @@ -3647,6 +3713,24 @@ | |||
| </ClInclude> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <None Include="..\..\..\Build\CMake\LaunchScreen.storyboard"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\PIPAudioProcessor.cpp.in"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\PIPComponent.cpp.in"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\PIPConsole.cpp.in"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\RecentFilesMenuTemplate.nib"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\UnityPluginGUIScript.cs.in"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\Source\BinaryData\gradle\gradle-wrapper.jar"> | |||
| <Filter>Projucer\BinaryData\gradle</Filter> | |||
| </None> | |||
| @@ -3719,9 +3803,6 @@ | |||
| <None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg"> | |||
| <Filter>Projucer\BinaryData\Icons</Filter> | |||
| </None> | |||
| <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs"> | |||
| <Filter>Projucer\BinaryData\Templates</Filter> | |||
| </None> | |||
| <None Include="..\..\Source\BinaryData\colourscheme_dark.xml"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| @@ -3737,9 +3818,6 @@ | |||
| <None Include="..\..\Source\BinaryData\projucer_EULA.txt"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\Source\BinaryData\RecentFilesMenuTemplate.nib"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\..\modules\juce_core\native\java\README.txt"> | |||
| <Filter>JUCE Modules\juce_core\native\java</Filter> | |||
| </None> | |||
| @@ -63,7 +63,7 @@ | |||
| <ClCompile> | |||
| <Optimization>Disabled</Optimization> | |||
| <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> | |||
| <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;..\..\..\Build;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.0.0;JUCE_APP_VERSION_HEX=0x60000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||
| <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> | |||
| <RuntimeTypeInfo>true</RuntimeTypeInfo> | |||
| @@ -105,7 +105,7 @@ | |||
| </Midl> | |||
| <ClCompile> | |||
| <Optimization>Full</Optimization> | |||
| <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;..\..\..\Build;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.0.0;JUCE_APP_VERSION_HEX=0x60000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||
| <RuntimeLibrary>MultiThreaded</RuntimeLibrary> | |||
| <RuntimeTypeInfo>true</RuntimeTypeInfo> | |||
| @@ -187,9 +187,6 @@ | |||
| <ClCompile Include="..\..\Source\BinaryData\Templates\jucer_OpenGLComponentTemplate.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\BinaryData\Templates\jucer_PIPMain.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\CodeEditor\jucer_DocumentEditorComponent.cpp"/> | |||
| <ClCompile Include="..\..\Source\CodeEditor\jucer_OpenDocumentManager.cpp"/> | |||
| <ClCompile Include="..\..\Source\CodeEditor\jucer_SourceCodeEditor.cpp"/> | |||
| @@ -253,6 +250,36 @@ | |||
| <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_BinaryResourceFile.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_BuildHelperFunctions.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_CppTokeniserFunctions.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_Entitlements.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_Icons.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_PlistOptions.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceFileHelpers.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceRc.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_VersionNumbers.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\juce_build_tools.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| @@ -1452,6 +1479,7 @@ | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\JuceLibraryCode\BinaryData.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_analytics.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_build_tools.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_core.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_cryptography.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_data_structures.cpp"/> | |||
| @@ -1601,7 +1629,6 @@ | |||
| <ClInclude Include="..\..\Source\Project\UI\jucer_ProjectContentComponent.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_Module.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_Project.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectType.h"/> | |||
| <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExport_Android.h"/> | |||
| <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExport_CLion.h"/> | |||
| <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExport_CodeBlocks.h"/> | |||
| @@ -1654,6 +1681,17 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_analytics\destinations\juce_AnalyticsDestination.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_analytics\destinations\juce_ThreadedAnalyticsDestination.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_analytics\juce_analytics.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_BinaryResourceFile.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_BuildHelperFunctions.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_Entitlements.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_Icons.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_PlistOptions.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ProjectType.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_RelativePath.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceFileHelpers.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceRc.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_VersionNumbers.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\juce_build_tools.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/> | |||
| @@ -2064,6 +2102,12 @@ | |||
| <ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <None Include="..\..\..\Build\CMake\LaunchScreen.storyboard"/> | |||
| <None Include="..\..\..\Build\CMake\PIPAudioProcessor.cpp.in"/> | |||
| <None Include="..\..\..\Build\CMake\PIPComponent.cpp.in"/> | |||
| <None Include="..\..\..\Build\CMake\PIPConsole.cpp.in"/> | |||
| <None Include="..\..\..\Build\CMake\RecentFilesMenuTemplate.nib"/> | |||
| <None Include="..\..\..\Build\CMake\UnityPluginGUIScript.cs.in"/> | |||
| <None Include="..\..\Source\BinaryData\gradle\gradle-wrapper.jar"/> | |||
| <None Include="..\..\Source\BinaryData\gradle\gradlew"/> | |||
| <None Include="..\..\Source\BinaryData\gradle\gradlew.bat"/> | |||
| @@ -2088,13 +2132,11 @@ | |||
| <None Include="..\..\Source\BinaryData\Icons\wizard_Openfile.svg"/> | |||
| <None Include="..\..\Source\BinaryData\Icons\wizard_OpenGL.svg"/> | |||
| <None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg"/> | |||
| <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs"/> | |||
| <None Include="..\..\Source\BinaryData\colourscheme_dark.xml"/> | |||
| <None Include="..\..\Source\BinaryData\colourscheme_light.xml"/> | |||
| <None Include="..\..\Source\BinaryData\nothingtoseehere.txt"/> | |||
| <None Include="..\..\Source\BinaryData\offlinepage.html"/> | |||
| <None Include="..\..\Source\BinaryData\projucer_EULA.txt"/> | |||
| <None Include="..\..\Source\BinaryData\RecentFilesMenuTemplate.nib"/> | |||
| <None Include="..\..\..\..\modules\juce_core\native\java\README.txt"/> | |||
| <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/> | |||
| <None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/> | |||
| @@ -95,6 +95,12 @@ | |||
| <Filter Include="JUCE Modules\juce_analytics"> | |||
| <UniqueIdentifier>{97F7F593-75F8-D6B2-DC96-C946C3976226}</UniqueIdentifier> | |||
| </Filter> | |||
| <Filter Include="JUCE Modules\juce_build_tools\utils"> | |||
| <UniqueIdentifier>{D9FAFF6D-6737-F775-056A-D0B29BE13820}</UniqueIdentifier> | |||
| </Filter> | |||
| <Filter Include="JUCE Modules\juce_build_tools"> | |||
| <UniqueIdentifier>{065C11E4-EB37-5B72-0A01-F549675EB866}</UniqueIdentifier> | |||
| </Filter> | |||
| <Filter Include="JUCE Modules\juce_core\containers"> | |||
| <UniqueIdentifier>{42F7BE9D-3C8A-AE26-289B-8F355C068036}</UniqueIdentifier> | |||
| </Filter> | |||
| @@ -370,9 +376,6 @@ | |||
| <ClCompile Include="..\..\Source\BinaryData\Templates\jucer_OpenGLComponentTemplate.cpp"> | |||
| <Filter>Projucer\BinaryData\Templates</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\BinaryData\Templates\jucer_PIPMain.cpp"> | |||
| <Filter>Projucer\BinaryData\Templates</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\CodeEditor\jucer_DocumentEditorComponent.cpp"> | |||
| <Filter>Projucer\CodeEditor</Filter> | |||
| </ClCompile> | |||
| @@ -532,6 +535,36 @@ | |||
| <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp"> | |||
| <Filter>JUCE Modules\juce_analytics</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_BinaryResourceFile.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_BuildHelperFunctions.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_CppTokeniserFunctions.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_Entitlements.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_Icons.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_PlistOptions.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceFileHelpers.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceRc.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_VersionNumbers.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\juce_build_tools.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp"> | |||
| <Filter>JUCE Modules\juce_core\containers</Filter> | |||
| </ClCompile> | |||
| @@ -1819,6 +1852,9 @@ | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_analytics.cpp"> | |||
| <Filter>JUCE Library Code</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_build_tools.cpp"> | |||
| <Filter>JUCE Library Code</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_core.cpp"> | |||
| <Filter>JUCE Library Code</Filter> | |||
| </ClCompile> | |||
| @@ -2262,9 +2298,6 @@ | |||
| <ClInclude Include="..\..\Source\Project\jucer_Project.h"> | |||
| <Filter>Projucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectType.h"> | |||
| <Filter>Projucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExport_Android.h"> | |||
| <Filter>Projucer\ProjectSaving</Filter> | |||
| </ClInclude> | |||
| @@ -2421,6 +2454,39 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_analytics\juce_analytics.h"> | |||
| <Filter>JUCE Modules\juce_analytics</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_BinaryResourceFile.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_BuildHelperFunctions.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_Entitlements.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_Icons.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_PlistOptions.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ProjectType.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_RelativePath.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceFileHelpers.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceRc.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_VersionNumbers.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\juce_build_tools.h"> | |||
| <Filter>JUCE Modules\juce_build_tools</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"> | |||
| <Filter>JUCE Modules\juce_core\containers</Filter> | |||
| </ClInclude> | |||
| @@ -3647,6 +3713,24 @@ | |||
| </ClInclude> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <None Include="..\..\..\Build\CMake\LaunchScreen.storyboard"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\PIPAudioProcessor.cpp.in"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\PIPComponent.cpp.in"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\PIPConsole.cpp.in"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\RecentFilesMenuTemplate.nib"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\UnityPluginGUIScript.cs.in"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\Source\BinaryData\gradle\gradle-wrapper.jar"> | |||
| <Filter>Projucer\BinaryData\gradle</Filter> | |||
| </None> | |||
| @@ -3719,9 +3803,6 @@ | |||
| <None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg"> | |||
| <Filter>Projucer\BinaryData\Icons</Filter> | |||
| </None> | |||
| <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs"> | |||
| <Filter>Projucer\BinaryData\Templates</Filter> | |||
| </None> | |||
| <None Include="..\..\Source\BinaryData\colourscheme_dark.xml"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| @@ -3737,9 +3818,6 @@ | |||
| <None Include="..\..\Source\BinaryData\projucer_EULA.txt"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\Source\BinaryData\RecentFilesMenuTemplate.nib"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\..\modules\juce_core\native\java\README.txt"> | |||
| <Filter>JUCE Modules\juce_core\native\java</Filter> | |||
| </None> | |||
| @@ -63,7 +63,7 @@ | |||
| <ClCompile> | |||
| <Optimization>Disabled</Optimization> | |||
| <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> | |||
| <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;..\..\..\Build;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.0.0;JUCE_APP_VERSION_HEX=0x60000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||
| <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> | |||
| <RuntimeTypeInfo>true</RuntimeTypeInfo> | |||
| @@ -105,7 +105,7 @@ | |||
| </Midl> | |||
| <ClCompile> | |||
| <Optimization>Full</Optimization> | |||
| <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;..\..\..\Build;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.0.0;JUCE_APP_VERSION_HEX=0x60000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||
| <RuntimeLibrary>MultiThreaded</RuntimeLibrary> | |||
| <RuntimeTypeInfo>true</RuntimeTypeInfo> | |||
| @@ -187,9 +187,6 @@ | |||
| <ClCompile Include="..\..\Source\BinaryData\Templates\jucer_OpenGLComponentTemplate.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\BinaryData\Templates\jucer_PIPMain.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\CodeEditor\jucer_DocumentEditorComponent.cpp"/> | |||
| <ClCompile Include="..\..\Source\CodeEditor\jucer_OpenDocumentManager.cpp"/> | |||
| <ClCompile Include="..\..\Source\CodeEditor\jucer_SourceCodeEditor.cpp"/> | |||
| @@ -253,6 +250,36 @@ | |||
| <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_BinaryResourceFile.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_BuildHelperFunctions.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_CppTokeniserFunctions.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_Entitlements.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_Icons.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_PlistOptions.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceFileHelpers.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceRc.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_VersionNumbers.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\juce_build_tools.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp"> | |||
| <ExcludedFromBuild>true</ExcludedFromBuild> | |||
| </ClCompile> | |||
| @@ -1452,6 +1479,7 @@ | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\JuceLibraryCode\BinaryData.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_analytics.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_build_tools.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_core.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_cryptography.cpp"/> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_data_structures.cpp"/> | |||
| @@ -1601,7 +1629,6 @@ | |||
| <ClInclude Include="..\..\Source\Project\UI\jucer_ProjectContentComponent.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_Module.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_Project.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectType.h"/> | |||
| <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExport_Android.h"/> | |||
| <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExport_CLion.h"/> | |||
| <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExport_CodeBlocks.h"/> | |||
| @@ -1654,6 +1681,17 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_analytics\destinations\juce_AnalyticsDestination.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_analytics\destinations\juce_ThreadedAnalyticsDestination.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_analytics\juce_analytics.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_BinaryResourceFile.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_BuildHelperFunctions.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_Entitlements.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_Icons.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_PlistOptions.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ProjectType.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_RelativePath.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceFileHelpers.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceRc.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_VersionNumbers.h"/> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\juce_build_tools.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/> | |||
| @@ -2064,6 +2102,12 @@ | |||
| <ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <None Include="..\..\..\Build\CMake\LaunchScreen.storyboard"/> | |||
| <None Include="..\..\..\Build\CMake\PIPAudioProcessor.cpp.in"/> | |||
| <None Include="..\..\..\Build\CMake\PIPComponent.cpp.in"/> | |||
| <None Include="..\..\..\Build\CMake\PIPConsole.cpp.in"/> | |||
| <None Include="..\..\..\Build\CMake\RecentFilesMenuTemplate.nib"/> | |||
| <None Include="..\..\..\Build\CMake\UnityPluginGUIScript.cs.in"/> | |||
| <None Include="..\..\Source\BinaryData\gradle\gradle-wrapper.jar"/> | |||
| <None Include="..\..\Source\BinaryData\gradle\gradlew"/> | |||
| <None Include="..\..\Source\BinaryData\gradle\gradlew.bat"/> | |||
| @@ -2088,13 +2132,11 @@ | |||
| <None Include="..\..\Source\BinaryData\Icons\wizard_Openfile.svg"/> | |||
| <None Include="..\..\Source\BinaryData\Icons\wizard_OpenGL.svg"/> | |||
| <None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg"/> | |||
| <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs"/> | |||
| <None Include="..\..\Source\BinaryData\colourscheme_dark.xml"/> | |||
| <None Include="..\..\Source\BinaryData\colourscheme_light.xml"/> | |||
| <None Include="..\..\Source\BinaryData\nothingtoseehere.txt"/> | |||
| <None Include="..\..\Source\BinaryData\offlinepage.html"/> | |||
| <None Include="..\..\Source\BinaryData\projucer_EULA.txt"/> | |||
| <None Include="..\..\Source\BinaryData\RecentFilesMenuTemplate.nib"/> | |||
| <None Include="..\..\..\..\modules\juce_core\native\java\README.txt"/> | |||
| <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/> | |||
| <None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/> | |||
| @@ -95,6 +95,12 @@ | |||
| <Filter Include="JUCE Modules\juce_analytics"> | |||
| <UniqueIdentifier>{97F7F593-75F8-D6B2-DC96-C946C3976226}</UniqueIdentifier> | |||
| </Filter> | |||
| <Filter Include="JUCE Modules\juce_build_tools\utils"> | |||
| <UniqueIdentifier>{D9FAFF6D-6737-F775-056A-D0B29BE13820}</UniqueIdentifier> | |||
| </Filter> | |||
| <Filter Include="JUCE Modules\juce_build_tools"> | |||
| <UniqueIdentifier>{065C11E4-EB37-5B72-0A01-F549675EB866}</UniqueIdentifier> | |||
| </Filter> | |||
| <Filter Include="JUCE Modules\juce_core\containers"> | |||
| <UniqueIdentifier>{42F7BE9D-3C8A-AE26-289B-8F355C068036}</UniqueIdentifier> | |||
| </Filter> | |||
| @@ -370,9 +376,6 @@ | |||
| <ClCompile Include="..\..\Source\BinaryData\Templates\jucer_OpenGLComponentTemplate.cpp"> | |||
| <Filter>Projucer\BinaryData\Templates</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\BinaryData\Templates\jucer_PIPMain.cpp"> | |||
| <Filter>Projucer\BinaryData\Templates</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\CodeEditor\jucer_DocumentEditorComponent.cpp"> | |||
| <Filter>Projucer\CodeEditor</Filter> | |||
| </ClCompile> | |||
| @@ -532,6 +535,36 @@ | |||
| <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp"> | |||
| <Filter>JUCE Modules\juce_analytics</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_BinaryResourceFile.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_BuildHelperFunctions.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_CppTokeniserFunctions.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_Entitlements.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_Icons.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_PlistOptions.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceFileHelpers.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceRc.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\utils\juce_VersionNumbers.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\Build\juce_build_tools\juce_build_tools.cpp"> | |||
| <Filter>JUCE Modules\juce_build_tools</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp"> | |||
| <Filter>JUCE Modules\juce_core\containers</Filter> | |||
| </ClCompile> | |||
| @@ -1819,6 +1852,9 @@ | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_analytics.cpp"> | |||
| <Filter>JUCE Library Code</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_build_tools.cpp"> | |||
| <Filter>JUCE Library Code</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\JuceLibraryCode\include_juce_core.cpp"> | |||
| <Filter>JUCE Library Code</Filter> | |||
| </ClCompile> | |||
| @@ -2262,9 +2298,6 @@ | |||
| <ClInclude Include="..\..\Source\Project\jucer_Project.h"> | |||
| <Filter>Projucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectType.h"> | |||
| <Filter>Projucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExport_Android.h"> | |||
| <Filter>Projucer\ProjectSaving</Filter> | |||
| </ClInclude> | |||
| @@ -2421,6 +2454,39 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_analytics\juce_analytics.h"> | |||
| <Filter>JUCE Modules\juce_analytics</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_BinaryResourceFile.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_BuildHelperFunctions.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_Entitlements.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_Icons.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_PlistOptions.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ProjectType.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_RelativePath.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceFileHelpers.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_ResourceRc.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\utils\juce_VersionNumbers.h"> | |||
| <Filter>JUCE Modules\juce_build_tools\utils</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\Build\juce_build_tools\juce_build_tools.h"> | |||
| <Filter>JUCE Modules\juce_build_tools</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"> | |||
| <Filter>JUCE Modules\juce_core\containers</Filter> | |||
| </ClInclude> | |||
| @@ -3647,6 +3713,24 @@ | |||
| </ClInclude> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <None Include="..\..\..\Build\CMake\LaunchScreen.storyboard"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\PIPAudioProcessor.cpp.in"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\PIPComponent.cpp.in"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\PIPConsole.cpp.in"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\RecentFilesMenuTemplate.nib"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\Build\CMake\UnityPluginGUIScript.cs.in"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\Source\BinaryData\gradle\gradle-wrapper.jar"> | |||
| <Filter>Projucer\BinaryData\gradle</Filter> | |||
| </None> | |||
| @@ -3719,9 +3803,6 @@ | |||
| <None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg"> | |||
| <Filter>Projucer\BinaryData\Icons</Filter> | |||
| </None> | |||
| <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs"> | |||
| <Filter>Projucer\BinaryData\Templates</Filter> | |||
| </None> | |||
| <None Include="..\..\Source\BinaryData\colourscheme_dark.xml"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| @@ -3737,9 +3818,6 @@ | |||
| <None Include="..\..\Source\BinaryData\projucer_EULA.txt"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\Source\BinaryData\RecentFilesMenuTemplate.nib"> | |||
| <Filter>Projucer\BinaryData</Filter> | |||
| </None> | |||
| <None Include="..\..\..\..\modules\juce_core\native\java\README.txt"> | |||
| <Filter>JUCE Modules\juce_core\native\java</Filter> | |||
| </None> | |||
| @@ -0,0 +1,166 @@ | |||
| # ============================================================================== | |||
| # | |||
| # This file is part of the JUCE 6 technical preview. | |||
| # Copyright (c) 2020 - ROLI Ltd. | |||
| # | |||
| # You may use this code under the terms of the GPL v3 | |||
| # (see www.gnu.org/licenses). | |||
| # | |||
| # For this technical preview, this file is not subject to commercial licensing. | |||
| # | |||
| # JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| # EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| # DISCLAIMED. | |||
| # | |||
| # ============================================================================== | |||
| juce_add_gui_app(Projucer | |||
| BUNDLE_ID com.juce.theprojucer | |||
| ICON_BIG ${CMAKE_CURRENT_SOURCE_DIR}/Source/BinaryData/Icons/juce_icon.png | |||
| DOCUMENT_EXTENSIONS jucer | |||
| NEEDS_CURL TRUE | |||
| NEEDS_WEB_BROWSER TRUE) | |||
| juce_generate_juce_header(Projucer) | |||
| # This is to work around a bug with how cmake computes language standard flags with | |||
| # target_compile_features | |||
| set_target_properties(Projucer PROPERTIES CXX_STANDARD 11) | |||
| target_sources(Projucer PRIVATE | |||
| Source/Application/jucer_AutoUpdater.cpp | |||
| Source/Application/jucer_CommandLine.cpp | |||
| Source/Application/jucer_Main.cpp | |||
| Source/Application/jucer_MainWindow.cpp | |||
| Source/Application/jucer_ProjucerAnalytics.cpp | |||
| Source/CodeEditor/jucer_DocumentEditorComponent.cpp | |||
| Source/CodeEditor/jucer_OpenDocumentManager.cpp | |||
| Source/CodeEditor/jucer_SourceCodeEditor.cpp | |||
| Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp | |||
| Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp | |||
| Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp | |||
| Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp | |||
| Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp | |||
| Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp | |||
| Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp | |||
| Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp | |||
| Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp | |||
| Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp | |||
| Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp | |||
| Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp | |||
| Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp | |||
| Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp | |||
| Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp | |||
| Source/ComponentEditor/UI/jucer_TestComponent.cpp | |||
| Source/ComponentEditor/jucer_BinaryResources.cpp | |||
| Source/ComponentEditor/jucer_ComponentLayout.cpp | |||
| Source/ComponentEditor/jucer_GeneratedCode.cpp | |||
| Source/ComponentEditor/jucer_JucerDocument.cpp | |||
| Source/ComponentEditor/jucer_ObjectTypes.cpp | |||
| Source/ComponentEditor/jucer_PaintRoutine.cpp | |||
| Source/Licenses/jucer_LicenseController.cpp | |||
| Source/LiveBuildEngine/jucer_CompileEngineClient.cpp | |||
| Source/LiveBuildEngine/jucer_CompileEngineServer.cpp | |||
| Source/LiveBuildEngine/jucer_DownloadCompileEngineThread.cpp | |||
| Source/Project/UI/jucer_HeaderComponent.cpp | |||
| Source/Project/jucer_Module.cpp | |||
| Source/Project/jucer_Project.cpp | |||
| Source/ProjectSaving/jucer_ProjectExporter.cpp | |||
| Source/ProjectSaving/jucer_ProjectSaver.cpp | |||
| Source/ProjectSaving/jucer_ResourceFile.cpp | |||
| Source/Settings/jucer_AppearanceSettings.cpp | |||
| Source/Settings/jucer_StoredSettings.cpp | |||
| Source/Utility/Helpers/jucer_CodeHelpers.cpp | |||
| Source/Utility/Helpers/jucer_FileHelpers.cpp | |||
| Source/Utility/Helpers/jucer_MiscUtilities.cpp | |||
| Source/Utility/Helpers/jucer_VersionInfo.cpp | |||
| Source/Utility/PIPs/jucer_PIPGenerator.cpp | |||
| Source/Utility/UI/jucer_Icons.cpp | |||
| Source/Utility/UI/jucer_JucerTreeViewBase.cpp | |||
| Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp | |||
| Source/Utility/UI/jucer_SlidingPanelComponent.cpp | |||
| Source/Wizards/jucer_NewFileWizard.cpp | |||
| Source/Wizards/jucer_NewProjectWizardClasses.cpp) | |||
| target_compile_definitions(Projucer PRIVATE | |||
| JUCE_ALLOW_STATIC_NULL_VARIABLES=0 | |||
| JUCE_LOAD_CURL_SYMBOLS_LAZILY=1 | |||
| JUCE_LOG_ASSERTIONS=1 | |||
| JUCE_STRICT_REFCOUNTEDPOINTER=1 | |||
| JUCE_USE_CURL=1 | |||
| JUCE_WEB_BROWSER=1) | |||
| juce_add_binary_data(ProjucerData SOURCES | |||
| Source/BinaryData/Icons/background_logo.svg | |||
| Source/BinaryData/Icons/export_android.svg | |||
| Source/BinaryData/Icons/export_clion.svg | |||
| Source/BinaryData/Icons/export_codeBlocks.svg | |||
| Source/BinaryData/Icons/export_linux.svg | |||
| Source/BinaryData/Icons/export_visualStudio.svg | |||
| Source/BinaryData/Icons/export_xcode.svg | |||
| Source/BinaryData/Icons/huckleberry_icon.svg | |||
| Source/BinaryData/Icons/juce-logo-with-text.svg | |||
| Source/BinaryData/Icons/juce_icon.png | |||
| Source/BinaryData/Icons/wizard_AnimatedApp.svg | |||
| Source/BinaryData/Icons/wizard_AudioApp.svg | |||
| Source/BinaryData/Icons/wizard_AudioPlugin.svg | |||
| Source/BinaryData/Icons/wizard_ConsoleApp.svg | |||
| Source/BinaryData/Icons/wizard_DLL.svg | |||
| Source/BinaryData/Icons/wizard_GUI.svg | |||
| Source/BinaryData/Icons/wizard_Highlight.svg | |||
| Source/BinaryData/Icons/wizard_OpenGL.svg | |||
| Source/BinaryData/Icons/wizard_Openfile.svg | |||
| Source/BinaryData/Icons/wizard_StaticLibrary.svg | |||
| Source/BinaryData/Templates/jucer_AnimatedComponentSimpleTemplate.h | |||
| Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.cpp | |||
| Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.h | |||
| Source/BinaryData/Templates/jucer_AudioComponentSimpleTemplate.h | |||
| Source/BinaryData/Templates/jucer_AudioComponentTemplate.cpp | |||
| Source/BinaryData/Templates/jucer_AudioComponentTemplate.h | |||
| Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.cpp | |||
| Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.h | |||
| Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.cpp | |||
| Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h | |||
| Source/BinaryData/Templates/jucer_ComponentTemplate.cpp | |||
| Source/BinaryData/Templates/jucer_ComponentTemplate.h | |||
| Source/BinaryData/Templates/jucer_ContentCompSimpleTemplate.h | |||
| Source/BinaryData/Templates/jucer_ContentCompTemplate.cpp | |||
| Source/BinaryData/Templates/jucer_ContentCompTemplate.h | |||
| Source/BinaryData/Templates/jucer_InlineComponentTemplate.h | |||
| Source/BinaryData/Templates/jucer_MainConsoleAppTemplate.cpp | |||
| Source/BinaryData/Templates/jucer_MainTemplate_NoWindow.cpp | |||
| Source/BinaryData/Templates/jucer_MainTemplate_SimpleWindow.cpp | |||
| Source/BinaryData/Templates/jucer_MainTemplate_Window.cpp | |||
| Source/BinaryData/Templates/jucer_NewComponentTemplate.cpp | |||
| Source/BinaryData/Templates/jucer_NewComponentTemplate.h | |||
| Source/BinaryData/Templates/jucer_NewCppFileTemplate.cpp | |||
| Source/BinaryData/Templates/jucer_NewCppFileTemplate.h | |||
| Source/BinaryData/Templates/jucer_NewInlineComponentTemplate.h | |||
| Source/BinaryData/Templates/jucer_OpenGLComponentSimpleTemplate.h | |||
| Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.cpp | |||
| Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.h | |||
| Source/BinaryData/Templates/jucer_PIPAudioProcessorTemplate.h | |||
| Source/BinaryData/Templates/jucer_PIPTemplate.h | |||
| Source/BinaryData/colourscheme_dark.xml | |||
| Source/BinaryData/colourscheme_light.xml | |||
| Source/BinaryData/gradle/LICENSE | |||
| Source/BinaryData/gradle/gradle-wrapper.jar | |||
| Source/BinaryData/gradle/gradlew | |||
| Source/BinaryData/gradle/gradlew.bat | |||
| Source/BinaryData/nothingtoseehere.txt | |||
| Source/BinaryData/offlinepage.html | |||
| Source/BinaryData/projucer_EULA.txt | |||
| ../Build/CMake/LaunchScreen.storyboard | |||
| ../Build/CMake/PIPAudioProcessor.cpp.in | |||
| ../Build/CMake/PIPComponent.cpp.in | |||
| ../Build/CMake/PIPConsole.cpp.in | |||
| ../Build/CMake/RecentFilesMenuTemplate.nib | |||
| ../Build/CMake/UnityPluginGUIScript.cs.in) | |||
| target_link_libraries(Projucer PRIVATE | |||
| ProjucerData | |||
| juce::juce_analytics | |||
| juce::juce_build_tools | |||
| juce::juce_cryptography | |||
| juce::juce_gui_extra) | |||
| @@ -70,6 +70,7 @@ | |||
| //============================================================================== | |||
| #define JUCE_MODULE_AVAILABLE_juce_analytics 1 | |||
| #define JUCE_MODULE_AVAILABLE_juce_build_tools 1 | |||
| #define JUCE_MODULE_AVAILABLE_juce_core 1 | |||
| #define JUCE_MODULE_AVAILABLE_juce_cryptography 1 | |||
| #define JUCE_MODULE_AVAILABLE_juce_data_structures 1 | |||
| @@ -8,6 +8,24 @@ | |||
| namespace BinaryData | |||
| { | |||
| extern const char* LaunchScreen_storyboard; | |||
| const int LaunchScreen_storyboardSize = 1042; | |||
| extern const char* PIPAudioProcessor_cpp_in; | |||
| const int PIPAudioProcessor_cpp_inSize = 477; | |||
| extern const char* PIPComponent_cpp_in; | |||
| const int PIPComponent_cpp_inSize = 2162; | |||
| extern const char* PIPConsole_cpp_in; | |||
| const int PIPConsole_cpp_inSize = 299; | |||
| extern const char* RecentFilesMenuTemplate_nib; | |||
| const int RecentFilesMenuTemplate_nibSize = 2842; | |||
| extern const char* UnityPluginGUIScript_cs_in; | |||
| const int UnityPluginGUIScript_cs_inSize = 6424; | |||
| extern const char* gradlewrapper_jar; | |||
| const int gradlewrapper_jarSize = 53636; | |||
| @@ -167,15 +185,9 @@ namespace BinaryData | |||
| extern const char* jucer_PIPAudioProcessorTemplate_h; | |||
| const int jucer_PIPAudioProcessorTemplate_hSize = 4926; | |||
| extern const char* jucer_PIPMain_cpp; | |||
| const int jucer_PIPMain_cppSize = 2421; | |||
| extern const char* jucer_PIPTemplate_h; | |||
| const int jucer_PIPTemplate_hSize = 517; | |||
| extern const char* jucer_UnityPluginGUIScript_cs; | |||
| const int jucer_UnityPluginGUIScript_csSize = 6433; | |||
| extern const char* colourscheme_dark_xml; | |||
| const int colourscheme_dark_xmlSize = 1050; | |||
| @@ -191,11 +203,8 @@ namespace BinaryData | |||
| extern const char* projucer_EULA_txt; | |||
| const int projucer_EULA_txtSize = 14361; | |||
| extern const char* RecentFilesMenuTemplate_nib; | |||
| const int RecentFilesMenuTemplate_nibSize = 2842; | |||
| // Number of elements in the namedResourceList and originalFileNames arrays. | |||
| const int namedResourceListSize = 62; | |||
| const int namedResourceListSize = 65; | |||
| // Points to the start of a list of resource names. | |||
| extern const char* namedResourceList[]; | |||
| @@ -15,6 +15,7 @@ | |||
| #include "AppConfig.h" | |||
| #include <juce_analytics/juce_analytics.h> | |||
| #include <juce_build_tools/juce_build_tools.h> | |||
| #include <juce_core/juce_core.h> | |||
| #include <juce_cryptography/juce_cryptography.h> | |||
| #include <juce_data_structures/juce_data_structures.h> | |||
| @@ -0,0 +1,9 @@ | |||
| /* | |||
| IMPORTANT! This file is auto-generated each time you save your | |||
| project - if you alter its contents, your changes may be overwritten! | |||
| */ | |||
| #include "AppConfig.h" | |||
| #include <juce_build_tools/juce_build_tools.cpp> | |||
| @@ -6,9 +6,9 @@ | |||
| companyName="ROLI Ltd." companyCopyright="ROLI Ltd." cppLanguageStandard="11"> | |||
| <EXPORTFORMATS> | |||
| <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK" | |||
| documentExtensions=".jucer" objCExtraSuffix="zkVtji" bigIcon="rv1F4h" | |||
| documentExtensions=".jucer" objCExtraSuffix="zkVtji" bigIcon="Zrx1Gl" | |||
| extraFrameworks="AudioUnit; Accelerate; AVFoundation; CoreAudio; CoreAudioKit; CoreMIDI; DiscRecording; QuartzCore; AudioToolbox; OpenGL; QTKit; QuickTime" | |||
| microphonePermissionNeeded="1" cameraPermissionNeeded="1"> | |||
| microphonePermissionNeeded="1" cameraPermissionNeeded="1" smallIcon="Zrx1Gl"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" targetName="Projucer" cppLibType="libc++" | |||
| recommendedWarnings="LLVM"/> | |||
| @@ -24,9 +24,11 @@ | |||
| <MODULEPATH id="juce_cryptography" path="../../modules"/> | |||
| <MODULEPATH id="juce_core" path="../../modules"/> | |||
| <MODULEPATH id="juce_analytics" path="../../modules"/> | |||
| <MODULEPATH id="juce_build_tools" path="../Build"/> | |||
| </MODULEPATHS> | |||
| </XCODE_MAC> | |||
| <VS2015 targetFolder="Builds/VisualStudio2015" bigIcon="rv1F4h" extraCompilerFlags="/bigobj"> | |||
| <VS2015 targetFolder="Builds/VisualStudio2015" bigIcon="Zrx1Gl" extraCompilerFlags="/bigobj" | |||
| smallIcon="Zrx1Gl"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" targetName="Projucer" debugInformationFormat="ProgramDatabase" | |||
| useRuntimeLibDLL="1"/> | |||
| @@ -42,9 +44,11 @@ | |||
| <MODULEPATH id="juce_cryptography" path="../../modules"/> | |||
| <MODULEPATH id="juce_core" path="../../modules"/> | |||
| <MODULEPATH id="juce_analytics" path="../../modules"/> | |||
| <MODULEPATH id="juce_build_tools" path="../Build"/> | |||
| </MODULEPATHS> | |||
| </VS2015> | |||
| <VS2017 targetFolder="Builds/VisualStudio2017" bigIcon="rv1F4h" extraCompilerFlags="/w44265 /w45038 /w44062"> | |||
| <VS2017 targetFolder="Builds/VisualStudio2017" bigIcon="Zrx1Gl" extraCompilerFlags="/w44265 /w45038 /w44062" | |||
| smallIcon="Zrx1Gl"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" targetName="Projucer" useRuntimeLibDLL="0"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="3" targetName="Projucer" | |||
| @@ -59,9 +63,11 @@ | |||
| <MODULEPATH id="juce_cryptography" path="../../modules"/> | |||
| <MODULEPATH id="juce_core" path="../../modules"/> | |||
| <MODULEPATH id="juce_analytics" path="../../modules"/> | |||
| <MODULEPATH id="juce_build_tools" path="../Build"/> | |||
| </MODULEPATHS> | |||
| </VS2017> | |||
| <VS2019 targetFolder="Builds/VisualStudio2019" bigIcon="rv1F4h" extraCompilerFlags="/w44265 /w45038 /w44062"> | |||
| <VS2019 targetFolder="Builds/VisualStudio2019" bigIcon="Zrx1Gl" extraCompilerFlags="/w44265 /w45038 /w44062" | |||
| smallIcon="Zrx1Gl"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" targetName="Projucer" useRuntimeLibDLL="0"/> | |||
| <CONFIGURATION name="Release" isDebug="0" optimisation="3" targetName="Projucer" | |||
| @@ -76,9 +82,10 @@ | |||
| <MODULEPATH id="juce_cryptography" path="../../modules"/> | |||
| <MODULEPATH id="juce_core" path="../../modules"/> | |||
| <MODULEPATH id="juce_analytics" path="../../modules"/> | |||
| <MODULEPATH id="juce_build_tools" path="../Build"/> | |||
| </MODULEPATHS> | |||
| </VS2019> | |||
| <LINUX_MAKE targetFolder="Builds/LinuxMakefile" bigIcon="rv1F4h"> | |||
| <LINUX_MAKE targetFolder="Builds/LinuxMakefile" bigIcon="Zrx1Gl" smallIcon="Zrx1Gl"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" isDebug="1" targetName="Projucer"/> | |||
| <CONFIGURATION name="Release" isDebug="0" targetName="Projucer"/> | |||
| @@ -92,6 +99,7 @@ | |||
| <MODULEPATH id="juce_cryptography" path="../../modules"/> | |||
| <MODULEPATH id="juce_core" path="../../modules"/> | |||
| <MODULEPATH id="juce_analytics" path="../../modules"/> | |||
| <MODULEPATH id="juce_build_tools" path="../Build"/> | |||
| </MODULEPATHS> | |||
| </LINUX_MAKE> | |||
| </EXPORTFORMATS> | |||
| @@ -144,131 +152,137 @@ | |||
| <FILE id="spHBY0" name="jucer_ProjucerAnalytics.h" compile="0" resource="0" | |||
| file="Source/Application/jucer_ProjucerAnalytics.h"/> | |||
| </GROUP> | |||
| <GROUP id="{8853BD6C-8307-BCF8-65BE-6A2F57093B40}" name="BinaryData"> | |||
| <GROUP id="{1A183456-21D3-225D-99E4-93B1A8E8C43A}" name="gradle"> | |||
| <FILE id="iKvP2G" name="gradle-wrapper.jar" compile="0" resource="1" | |||
| <GROUP id="{BFDB3102-5EB6-41E0-043A-05C0DFF7A34D}" name="BinaryData"> | |||
| <FILE id="QRvesq" name="LaunchScreen.storyboard" compile="0" resource="1" | |||
| file="../Build/CMake/LaunchScreen.storyboard"/> | |||
| <FILE id="QCgjY8" name="PIPAudioProcessor.cpp.in" compile="0" resource="1" | |||
| file="../Build/CMake/PIPAudioProcessor.cpp.in"/> | |||
| <FILE id="AwIYFr" name="PIPComponent.cpp.in" compile="0" resource="1" | |||
| file="../Build/CMake/PIPComponent.cpp.in"/> | |||
| <FILE id="SncItz" name="PIPConsole.cpp.in" compile="0" resource="1" | |||
| file="../Build/CMake/PIPConsole.cpp.in"/> | |||
| <FILE id="xokhSP" name="RecentFilesMenuTemplate.nib" compile="0" resource="1" | |||
| file="../Build/CMake/RecentFilesMenuTemplate.nib"/> | |||
| <FILE id="H4EF8K" name="UnityPluginGUIScript.cs.in" compile="0" resource="1" | |||
| file="../Build/CMake/UnityPluginGUIScript.cs.in"/> | |||
| <GROUP id="{6528902B-862F-277C-31AA-6F6283E7D5C8}" name="gradle"> | |||
| <FILE id="HA0Kl7" name="gradle-wrapper.jar" compile="0" resource="1" | |||
| file="Source/BinaryData/gradle/gradle-wrapper.jar"/> | |||
| <FILE id="Ap8FMN" name="gradlew" compile="0" resource="1" file="Source/BinaryData/gradle/gradlew"/> | |||
| <FILE id="dv12Xk" name="gradlew.bat" compile="0" resource="1" file="Source/BinaryData/gradle/gradlew.bat"/> | |||
| <FILE id="Df6IUU" name="LICENSE" compile="0" resource="1" file="Source/BinaryData/gradle/LICENSE"/> | |||
| <FILE id="RmqRJ9" name="gradlew" compile="0" resource="1" file="Source/BinaryData/gradle/gradlew"/> | |||
| <FILE id="gOeI5K" name="gradlew.bat" compile="0" resource="1" file="Source/BinaryData/gradle/gradlew.bat"/> | |||
| <FILE id="xtpyoD" name="LICENSE" compile="0" resource="1" file="Source/BinaryData/gradle/LICENSE"/> | |||
| </GROUP> | |||
| <GROUP id="{C49A0B44-304A-389D-AAB0-06169AD6ABAD}" name="Icons"> | |||
| <FILE id="kyKYL7" name="background_logo.svg" compile="0" resource="1" | |||
| <GROUP id="{85F5CA8E-1014-692B-2677-292237A41AF5}" name="Icons"> | |||
| <FILE id="HvDzzK" name="background_logo.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/background_logo.svg"/> | |||
| <FILE id="csCUBK" name="export_android.svg" compile="0" resource="1" | |||
| <FILE id="qqeJmA" name="export_android.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/export_android.svg"/> | |||
| <FILE id="ILM268" name="export_clion.svg" compile="0" resource="1" | |||
| <FILE id="WF3jeY" name="export_clion.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/export_clion.svg"/> | |||
| <FILE id="aEHhYA" name="export_codeBlocks.svg" compile="0" resource="1" | |||
| <FILE id="FiwPHz" name="export_codeBlocks.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/export_codeBlocks.svg"/> | |||
| <FILE id="gT2nPs" name="export_linux.svg" compile="0" resource="1" | |||
| <FILE id="WBmsi6" name="export_linux.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/export_linux.svg"/> | |||
| <FILE id="woYtVL" name="export_visualStudio.svg" compile="0" resource="1" | |||
| <FILE id="fETsmT" name="export_visualStudio.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/export_visualStudio.svg"/> | |||
| <FILE id="rgD9FB" name="export_xcode.svg" compile="0" resource="1" | |||
| <FILE id="G0oYd6" name="export_xcode.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/export_xcode.svg"/> | |||
| <FILE id="xH7xtt" name="huckleberry_icon.svg" compile="0" resource="1" | |||
| <FILE id="k4zzKu" name="huckleberry_icon.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/huckleberry_icon.svg"/> | |||
| <FILE id="LKlNVR" name="juce-logo-with-text.svg" compile="0" resource="1" | |||
| <FILE id="Pk2LIn" name="juce-logo-with-text.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/juce-logo-with-text.svg"/> | |||
| <FILE id="rv1F4h" name="juce_icon.png" compile="0" resource="1" file="Source/BinaryData/Icons/juce_icon.png"/> | |||
| <FILE id="g5vwqt" name="wizard_AnimatedApp.svg" compile="0" resource="1" | |||
| <FILE id="Zrx1Gl" name="juce_icon.png" compile="0" resource="1" file="Source/BinaryData/Icons/juce_icon.png"/> | |||
| <FILE id="iPYmG9" name="wizard_AnimatedApp.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/wizard_AnimatedApp.svg"/> | |||
| <FILE id="inzYsC" name="wizard_AudioApp.svg" compile="0" resource="1" | |||
| <FILE id="nAIo3Q" name="wizard_AudioApp.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/wizard_AudioApp.svg"/> | |||
| <FILE id="ZQgRRl" name="wizard_AudioPlugin.svg" compile="0" resource="1" | |||
| <FILE id="hwarU2" name="wizard_AudioPlugin.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/wizard_AudioPlugin.svg"/> | |||
| <FILE id="jOtJaP" name="wizard_ConsoleApp.svg" compile="0" resource="1" | |||
| <FILE id="SMzg53" name="wizard_ConsoleApp.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/wizard_ConsoleApp.svg"/> | |||
| <FILE id="O2L6xg" name="wizard_DLL.svg" compile="0" resource="1" file="Source/BinaryData/Icons/wizard_DLL.svg"/> | |||
| <FILE id="u5Kfkt" name="wizard_GUI.svg" compile="0" resource="1" file="Source/BinaryData/Icons/wizard_GUI.svg"/> | |||
| <FILE id="fgDQ9M" name="wizard_Highlight.svg" compile="0" resource="1" | |||
| <FILE id="YG6Eva" name="wizard_DLL.svg" compile="0" resource="1" file="Source/BinaryData/Icons/wizard_DLL.svg"/> | |||
| <FILE id="obZCkC" name="wizard_GUI.svg" compile="0" resource="1" file="Source/BinaryData/Icons/wizard_GUI.svg"/> | |||
| <FILE id="U47vkJ" name="wizard_Highlight.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/wizard_Highlight.svg"/> | |||
| <FILE id="XUBtiD" name="wizard_Openfile.svg" compile="0" resource="1" | |||
| <FILE id="k4YA4V" name="wizard_Openfile.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/wizard_Openfile.svg"/> | |||
| <FILE id="IwMd6Z" name="wizard_OpenGL.svg" compile="0" resource="1" | |||
| <FILE id="jYodWX" name="wizard_OpenGL.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/wizard_OpenGL.svg"/> | |||
| <FILE id="mzlH8U" name="wizard_StaticLibrary.svg" compile="0" resource="1" | |||
| <FILE id="Rbi6lX" name="wizard_StaticLibrary.svg" compile="0" resource="1" | |||
| file="Source/BinaryData/Icons/wizard_StaticLibrary.svg"/> | |||
| </GROUP> | |||
| <GROUP id="{D5514787-89A7-C727-422F-2BF9D9C6CF70}" name="Templates"> | |||
| <FILE id="thU560" name="jucer_AnimatedComponentSimpleTemplate.h" compile="0" | |||
| <GROUP id="{A8B4BB53-2426-F6A0-9FB1-463BB9D64DB4}" name="Templates"> | |||
| <FILE id="Uadbrm" name="jucer_AnimatedComponentSimpleTemplate.h" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_AnimatedComponentSimpleTemplate.h"/> | |||
| <FILE id="GCUpe7" name="jucer_AnimatedComponentTemplate.cpp" compile="0" | |||
| <FILE id="fFFqLB" name="jucer_AnimatedComponentTemplate.cpp" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.cpp"/> | |||
| <FILE id="if7mRo" name="jucer_AnimatedComponentTemplate.h" compile="0" | |||
| <FILE id="Wh7G1x" name="jucer_AnimatedComponentTemplate.h" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.h"/> | |||
| <FILE id="o5WUW4" name="jucer_AudioComponentSimpleTemplate.h" compile="0" | |||
| <FILE id="jzLsG8" name="jucer_AudioComponentSimpleTemplate.h" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_AudioComponentSimpleTemplate.h"/> | |||
| <FILE id="xynUPZ" name="jucer_AudioComponentTemplate.cpp" compile="0" | |||
| <FILE id="BzvUrn" name="jucer_AudioComponentTemplate.cpp" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_AudioComponentTemplate.cpp"/> | |||
| <FILE id="zC555M" name="jucer_AudioComponentTemplate.h" compile="0" | |||
| <FILE id="i9bm2b" name="jucer_AudioComponentTemplate.h" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_AudioComponentTemplate.h"/> | |||
| <FILE id="A3dhSd" name="jucer_AudioPluginEditorTemplate.cpp" compile="0" | |||
| <FILE id="BYSiw7" name="jucer_AudioPluginEditorTemplate.cpp" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.cpp"/> | |||
| <FILE id="TPGNqq" name="jucer_AudioPluginEditorTemplate.h" compile="0" | |||
| <FILE id="wcuIlm" name="jucer_AudioPluginEditorTemplate.h" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.h"/> | |||
| <FILE id="mKYQMY" name="jucer_AudioPluginFilterTemplate.cpp" compile="0" | |||
| <FILE id="Ik2XYj" name="jucer_AudioPluginFilterTemplate.cpp" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.cpp"/> | |||
| <FILE id="lxnKNQ" name="jucer_AudioPluginFilterTemplate.h" compile="0" | |||
| <FILE id="ZuBmpP" name="jucer_AudioPluginFilterTemplate.h" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h"/> | |||
| <FILE id="lK02mj" name="jucer_ComponentTemplate.cpp" compile="0" resource="1" | |||
| <FILE id="fnjYOi" name="jucer_ComponentTemplate.cpp" compile="0" resource="1" | |||
| file="Source/BinaryData/Templates/jucer_ComponentTemplate.cpp"/> | |||
| <FILE id="LZik3e" name="jucer_ComponentTemplate.h" compile="0" resource="1" | |||
| <FILE id="BlVkqH" name="jucer_ComponentTemplate.h" compile="0" resource="1" | |||
| file="Source/BinaryData/Templates/jucer_ComponentTemplate.h"/> | |||
| <FILE id="cTnZ6j" name="jucer_ContentCompSimpleTemplate.h" compile="0" | |||
| <FILE id="xfOeO3" name="jucer_ContentCompSimpleTemplate.h" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_ContentCompSimpleTemplate.h"/> | |||
| <FILE id="yYPIFT" name="jucer_ContentCompTemplate.cpp" compile="0" | |||
| <FILE id="HX3JPg" name="jucer_ContentCompTemplate.cpp" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_ContentCompTemplate.cpp"/> | |||
| <FILE id="Ze6RvS" name="jucer_ContentCompTemplate.h" compile="0" resource="1" | |||
| <FILE id="QTVhfj" name="jucer_ContentCompTemplate.h" compile="0" resource="1" | |||
| file="Source/BinaryData/Templates/jucer_ContentCompTemplate.h"/> | |||
| <FILE id="SSXmPL" name="jucer_InlineComponentTemplate.h" compile="0" | |||
| <FILE id="PuyOnZ" name="jucer_InlineComponentTemplate.h" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_InlineComponentTemplate.h"/> | |||
| <FILE id="DIZd10" name="jucer_MainConsoleAppTemplate.cpp" compile="0" | |||
| <FILE id="FwmOVk" name="jucer_MainConsoleAppTemplate.cpp" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_MainConsoleAppTemplate.cpp"/> | |||
| <FILE id="vbXfRZ" name="jucer_MainTemplate_NoWindow.cpp" compile="0" | |||
| <FILE id="IW9dIW" name="jucer_MainTemplate_NoWindow.cpp" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_MainTemplate_NoWindow.cpp"/> | |||
| <FILE id="mh39Tv" name="jucer_MainTemplate_SimpleWindow.cpp" compile="0" | |||
| <FILE id="SOsB1w" name="jucer_MainTemplate_SimpleWindow.cpp" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_MainTemplate_SimpleWindow.cpp"/> | |||
| <FILE id="H3c6AE" name="jucer_MainTemplate_Window.cpp" compile="0" | |||
| <FILE id="Zx5T5B" name="jucer_MainTemplate_Window.cpp" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_MainTemplate_Window.cpp"/> | |||
| <FILE id="lCVXSL" name="jucer_NewComponentTemplate.cpp" compile="0" | |||
| <FILE id="jCBXcQ" name="jucer_NewComponentTemplate.cpp" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_NewComponentTemplate.cpp"/> | |||
| <FILE id="nsaLHZ" name="jucer_NewComponentTemplate.h" compile="0" resource="1" | |||
| <FILE id="Jmpp81" name="jucer_NewComponentTemplate.h" compile="0" resource="1" | |||
| file="Source/BinaryData/Templates/jucer_NewComponentTemplate.h"/> | |||
| <FILE id="edeOEj" name="jucer_NewCppFileTemplate.cpp" compile="0" resource="1" | |||
| <FILE id="mJuFw3" name="jucer_NewCppFileTemplate.cpp" compile="0" resource="1" | |||
| file="Source/BinaryData/Templates/jucer_NewCppFileTemplate.cpp"/> | |||
| <FILE id="tXjAnD" name="jucer_NewCppFileTemplate.h" compile="0" resource="1" | |||
| <FILE id="AMybWD" name="jucer_NewCppFileTemplate.h" compile="0" resource="1" | |||
| file="Source/BinaryData/Templates/jucer_NewCppFileTemplate.h"/> | |||
| <FILE id="gqGzE1" name="jucer_NewInlineComponentTemplate.h" compile="0" | |||
| <FILE id="UfHALE" name="jucer_NewInlineComponentTemplate.h" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_NewInlineComponentTemplate.h"/> | |||
| <FILE id="EfEiMx" name="jucer_OpenGLComponentSimpleTemplate.h" compile="0" | |||
| <FILE id="l16bPj" name="jucer_OpenGLComponentSimpleTemplate.h" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_OpenGLComponentSimpleTemplate.h"/> | |||
| <FILE id="fSnbWk" name="jucer_OpenGLComponentTemplate.cpp" compile="0" | |||
| <FILE id="r1X5GG" name="jucer_OpenGLComponentTemplate.cpp" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.cpp"/> | |||
| <FILE id="Edyh5d" name="jucer_OpenGLComponentTemplate.h" compile="0" | |||
| <FILE id="FBo5Mj" name="jucer_OpenGLComponentTemplate.h" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.h"/> | |||
| <FILE id="BVHe2G" name="jucer_PIPAudioProcessorTemplate.h" compile="0" | |||
| <FILE id="e0zFrj" name="jucer_PIPAudioProcessorTemplate.h" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_PIPAudioProcessorTemplate.h"/> | |||
| <FILE id="aUkNL5" name="jucer_PIPMain.cpp" compile="0" resource="1" | |||
| file="Source/BinaryData/Templates/jucer_PIPMain.cpp"/> | |||
| <FILE id="WqDCf0" name="jucer_PIPTemplate.h" compile="0" resource="1" | |||
| <FILE id="iamwVV" name="jucer_PIPTemplate.h" compile="0" resource="1" | |||
| file="Source/BinaryData/Templates/jucer_PIPTemplate.h"/> | |||
| <FILE id="wrkU1v" name="jucer_UnityPluginGUIScript.cs" compile="0" | |||
| resource="1" file="Source/BinaryData/Templates/jucer_UnityPluginGUIScript.cs"/> | |||
| </GROUP> | |||
| <FILE id="oXM3fR" name="colourscheme_dark.xml" compile="0" resource="1" | |||
| <FILE id="Dfk9dC" name="colourscheme_dark.xml" compile="0" resource="1" | |||
| file="Source/BinaryData/colourscheme_dark.xml"/> | |||
| <FILE id="ZZ5K4s" name="colourscheme_light.xml" compile="0" resource="1" | |||
| <FILE id="bvFank" name="colourscheme_light.xml" compile="0" resource="1" | |||
| file="Source/BinaryData/colourscheme_light.xml"/> | |||
| <FILE id="gjEdBX" name="nothingtoseehere.txt" compile="0" resource="1" | |||
| <FILE id="lBlcfb" name="nothingtoseehere.txt" compile="0" resource="1" | |||
| file="Source/BinaryData/nothingtoseehere.txt"/> | |||
| <FILE id="ckpkjs" name="offlinepage.html" compile="0" resource="1" | |||
| <FILE id="vb8G2I" name="offlinepage.html" compile="0" resource="1" | |||
| file="Source/BinaryData/offlinepage.html"/> | |||
| <FILE id="kT5f0b" name="projucer_EULA.txt" compile="0" resource="1" | |||
| <FILE id="tqxmy4" name="projucer_EULA.txt" compile="0" resource="1" | |||
| file="Source/BinaryData/projucer_EULA.txt"/> | |||
| <FILE id="Y4HEng" name="RecentFilesMenuTemplate.nib" compile="0" resource="1" | |||
| file="Source/BinaryData/RecentFilesMenuTemplate.nib"/> | |||
| </GROUP> | |||
| <GROUP id="{A5AE7471-B900-FD9D-8DE7-2FB68D11AE30}" name="CodeEditor"> | |||
| <FILE id="w3ka6n" name="jucer_DocumentEditorComponent.cpp" compile="1" | |||
| @@ -571,8 +585,6 @@ | |||
| <FILE id="JT1rMJ" name="jucer_Project.cpp" compile="1" resource="0" | |||
| file="Source/Project/jucer_Project.cpp"/> | |||
| <FILE id="bUjtVS" name="jucer_Project.h" compile="0" resource="0" file="Source/Project/jucer_Project.h"/> | |||
| <FILE id="LuEXHg" name="jucer_ProjectType.h" compile="0" resource="0" | |||
| file="Source/Project/jucer_ProjectType.h"/> | |||
| </GROUP> | |||
| <GROUP id="{00CEE998-91CD-5001-DE85-4F4895E99A32}" name="ProjectSaving"> | |||
| <FILE id="JBLk8Y" name="jucer_ProjectExport_Android.h" compile="0" | |||
| @@ -718,6 +730,7 @@ | |||
| JUCE_STRICT_REFCOUNTEDPOINTER="1" JUCE_LOAD_CURL_SYMBOLS_LAZILY="1"/> | |||
| <MODULES> | |||
| <MODULE id="juce_analytics" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/> | |||
| <MODULE id="juce_build_tools" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/> | |||
| <MODULE id="juce_core" showAllCode="1"/> | |||
| <MODULE id="juce_cryptography" showAllCode="1"/> | |||
| <MODULE id="juce_data_structures" showAllCode="1"/> | |||
| @@ -77,7 +77,7 @@ public: | |||
| MemoryOutputStream out; | |||
| out << "static const unsigned char pathData[] = "; | |||
| CodeHelpers::writeDataAsCppLiteral (data.getMemoryBlock(), out, false, true); | |||
| build_tools::writeDataAsCppLiteral (data.getMemoryBlock(), out, false, true); | |||
| out << newLine | |||
| << newLine | |||
| << "Path path;" << newLine | |||
| @@ -629,11 +629,11 @@ namespace | |||
| MemoryBlock data; | |||
| FileInputStream input (source); | |||
| input.readIntoMemoryBlock (data); | |||
| CodeHelpers::writeDataAsCppLiteral (data, literal, true, true); | |||
| build_tools::writeDataAsCppLiteral (data, literal, true, true); | |||
| dataSize = data.getSize(); | |||
| } | |||
| auto variableName = CodeHelpers::makeBinaryDataIdentifierName (source); | |||
| auto variableName = build_tools::makeBinaryDataIdentifierName (source); | |||
| MemoryOutputStream header, cpp; | |||
| @@ -57,7 +57,6 @@ typedef TargetOS::OS DependencyPathOS; | |||
| #include "../Utility/Helpers/jucer_MiscUtilities.h" | |||
| #include "../Utility/Helpers/jucer_CodeHelpers.h" | |||
| #include "../Utility/Helpers/jucer_FileHelpers.h" | |||
| #include "../Utility/Helpers/jucer_RelativePath.h" | |||
| #include "../Utility/Helpers/jucer_ValueSourceHelpers.h" | |||
| #include "../Utility/Helpers/jucer_PresetIDs.h" | |||
| #include "jucer_CommandIDs.h" | |||
| @@ -646,7 +646,7 @@ void CppCodeEditorComponent::insertComponentClass() | |||
| { | |||
| auto className = aw.getTextEditorContents (classNameField).trim(); | |||
| if (className == CodeHelpers::makeValidIdentifier (className, false, true, false)) | |||
| if (className == build_tools::makeValidIdentifier (className, false, true, false)) | |||
| { | |||
| String code (BinaryData::jucer_InlineComponentTemplate_h); | |||
| code = code.replace ("%%component_class%%", className); | |||
| @@ -546,7 +546,7 @@ void ComponentTypeHandler::fillInMemberVariableDeclarations (GeneratedCode& code | |||
| String clsName (component->getProperties() ["virtualName"].toString()); | |||
| if (clsName.isNotEmpty()) | |||
| clsName = CodeHelpers::makeValidIdentifier (clsName, false, false, true); | |||
| clsName = build_tools::makeValidIdentifier (clsName, false, false, true); | |||
| else | |||
| clsName = getClassName (component); | |||
| @@ -584,7 +584,7 @@ void ComponentTypeHandler::fillInCreationCode (GeneratedCode& code, Component* c | |||
| s << memberVariableName << ".reset (new "; | |||
| if (virtualName.isNotEmpty()) | |||
| s << CodeHelpers::makeValidIdentifier (virtualName, false, false, true); | |||
| s << build_tools::makeValidIdentifier (virtualName, false, false, true); | |||
| else | |||
| s << getClassName (component); | |||
| @@ -142,7 +142,7 @@ private: | |||
| void setText (const String& newText) override | |||
| { | |||
| document.perform (new GenericCompClassChangeAction (component, *document.getComponentLayout(), | |||
| CodeHelpers::makeValidIdentifier (newText, false, false, true)), | |||
| build_tools::makeValidIdentifier (newText, false, false, true)), | |||
| "Change generic component class"); | |||
| } | |||
| @@ -369,7 +369,7 @@ private: | |||
| { | |||
| if (Project* project = document->getCppDocument().getProject()) | |||
| { | |||
| ResourceFile resourceFile (*project); | |||
| JucerResourceFile resourceFile (*project); | |||
| for (int i = 0; i < resourceFile.getNumFiles(); ++i) | |||
| { | |||
| @@ -114,7 +114,7 @@ public: | |||
| if (Project* project = cpp.getProject()) | |||
| { | |||
| ResourceFile resourceFile (*project); | |||
| JucerResourceFile resourceFile (*project); | |||
| for (int i = 0; i < resourceFile.getNumFiles(); ++i) | |||
| { | |||
| @@ -732,7 +732,7 @@ struct RelativePositionedRectangle | |||
| { | |||
| double x, y, w, h; | |||
| getRectangleDouble (x, y, w, h, parentArea, layout); | |||
| return Point<float> ((float) x, (float) y); | |||
| return { (float) x, (float) y }; | |||
| } | |||
| void getXY (double& x, double& y, | |||
| @@ -154,7 +154,7 @@ String BinaryResources::browseForResource (const String& title, | |||
| String BinaryResources::findUniqueName (const String& rootName) const | |||
| { | |||
| auto nameRoot = CodeHelpers::makeValidIdentifier (rootName, true, true, false); | |||
| auto nameRoot = build_tools::makeValidIdentifier (rootName, true, true, false); | |||
| auto name = nameRoot; | |||
| auto names = getResourceNames(); | |||
| @@ -411,7 +411,7 @@ Component* ComponentLayout::addNewComponent (ComponentTypeHandler* const type, i | |||
| std::unique_ptr<XmlElement> xml (type->createXmlFor (c.get(), this)); | |||
| c.reset (addComponentFromXml (*xml, true)); | |||
| String memberName (CodeHelpers::makeValidIdentifier (type->getClassName (c.get()), true, true, false)); | |||
| String memberName (build_tools::makeValidIdentifier (type->getClassName (c.get()), true, true, false)); | |||
| setComponentMemberVariableName (c.get(), memberName); | |||
| selected.selectOnly (c.get()); | |||
| @@ -852,7 +852,7 @@ String ComponentLayout::getComponentMemberVariableName (Component* comp) const | |||
| String name (comp->getProperties() ["memberName"].toString()); | |||
| if (name.isEmpty()) | |||
| name = getUnusedMemberName (CodeHelpers::makeValidIdentifier (comp->getName(), true, true, false), comp); | |||
| name = getUnusedMemberName (build_tools::makeValidIdentifier (comp->getName(), true, true, false), comp); | |||
| return name; | |||
| } | |||
| @@ -864,7 +864,7 @@ void ComponentLayout::setComponentMemberVariableName (Component* comp, const Str | |||
| comp->getProperties().set ("memberName", String()); | |||
| const String n (getUnusedMemberName (CodeHelpers::makeValidIdentifier (newName, false, true, false), comp)); | |||
| const String n (getUnusedMemberName (build_tools::makeValidIdentifier (newName, false, true, false), comp)); | |||
| comp->getProperties().set ("memberName", n); | |||
| if (n != oldName) | |||
| @@ -915,7 +915,7 @@ String ComponentLayout::getComponentVirtualClassName (Component* comp) const | |||
| void ComponentLayout::setComponentVirtualClassName (Component* comp, const String& newName) | |||
| { | |||
| jassert (comp != nullptr); | |||
| const String name (CodeHelpers::makeValidIdentifier (newName, false, false, true)); | |||
| const String name (build_tools::makeValidIdentifier (newName, false, false, true)); | |||
| if (name != getComponentVirtualClassName (comp)) | |||
| { | |||
| @@ -127,7 +127,7 @@ String GeneratedCode::getCallbackDefinitions() const | |||
| CallbackMethod* const cm = callbacks.getUnchecked(i); | |||
| const String userCodeBlockName ("User" | |||
| + CodeHelpers::makeValidIdentifier (cm->prototype.upToFirstOccurrenceOf ("(", false, false), | |||
| + build_tools::makeValidIdentifier (cm->prototype.upToFirstOccurrenceOf ("(", false, false), | |||
| true, true, false).trim()); | |||
| if (userCodeBlockName.isNotEmpty() && cm->hasPrePostUserSections) | |||
| @@ -118,9 +118,9 @@ void JucerDocument::refreshAllPropertyComps() | |||
| void JucerDocument::setClassName (const String& newName) | |||
| { | |||
| if (newName != className | |||
| && CodeHelpers::makeValidIdentifier (newName, false, false, true).isNotEmpty()) | |||
| && build_tools::makeValidIdentifier (newName, false, false, true).isNotEmpty()) | |||
| { | |||
| className = CodeHelpers::makeValidIdentifier (newName, false, false, true); | |||
| className = build_tools::makeValidIdentifier (newName, false, false, true); | |||
| changed(); | |||
| } | |||
| } | |||
| @@ -156,7 +156,7 @@ void JucerDocument::setParentClasses (const String& classes) | |||
| type = s = String(); | |||
| } | |||
| s = type + CodeHelpers::makeValidIdentifier (s.trim(), false, false, true, true); | |||
| s = type + build_tools::makeValidIdentifier (s.trim(), false, false, true, true); | |||
| parentClassLines.set (i, s); | |||
| } | |||
| @@ -386,11 +386,12 @@ private: | |||
| : m->moduleInfo.getFolder(); | |||
| m->findAndAddCompiledUnits (*exporter, nullptr, compileUnits, | |||
| isPluginProject || isVSTHost ? ProjectType::Target::SharedCodeTarget | |||
| : ProjectType::Target::unspecified); | |||
| isPluginProject || isVSTHost ? build_tools::ProjectType::Target::SharedCodeTarget | |||
| : build_tools::ProjectType::Target::unspecified); | |||
| if (isPluginProject || isVSTHost) | |||
| m->findAndAddCompiledUnits (*exporter, nullptr, compileUnits, ProjectType::Target::StandalonePlugIn); | |||
| m->findAndAddCompiledUnits (*exporter, nullptr, compileUnits, | |||
| build_tools::ProjectType::Target::StandalonePlugIn); | |||
| } | |||
| break; | |||