mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-09 23:34:20 +00:00
CMake: Add support for building JUCE projects with CMake
This commit is contained in:
parent
1fdba480cc
commit
ece5644a20
149 changed files with 9921 additions and 3693 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -59,3 +59,6 @@ profile
|
|||
**/doxygen/build
|
||||
**/.idea
|
||||
extras/Projucer/JUCECompileEngine.dylib
|
||||
|
||||
.idea
|
||||
**/cmake-build*
|
||||
|
|
|
|||
103
CMakeLists.txt
Normal file
103
CMakeLists.txt
Normal file
|
|
@ -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");
|
||||
|
|
|
|||
17
examples/Audio/CMakeLists.txt
Normal file
17
examples/Audio/CMakeLists.txt
Normal file
|
|
@ -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()
|
||||
17
examples/BLOCKS/CMakeLists.txt
Normal file
17
examples/BLOCKS/CMakeLists.txt
Normal file
|
|
@ -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()
|
||||
104
examples/CMake/AudioPlugin/CMakeLists.txt
Normal file
104
examples/CMake/AudioPlugin/CMakeLists.txt
Normal file
|
|
@ -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)
|
||||
33
examples/CMake/AudioPlugin/PluginEditor.cpp
Normal file
33
examples/CMake/AudioPlugin/PluginEditor.cpp
Normal file
|
|
@ -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..
|
||||
}
|
||||
22
examples/CMake/AudioPlugin/PluginEditor.h
Normal file
22
examples/CMake/AudioPlugin/PluginEditor.h
Normal file
|
|
@ -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)
|
||||
};
|
||||
186
examples/CMake/AudioPlugin/PluginProcessor.cpp
Normal file
186
examples/CMake/AudioPlugin/PluginProcessor.cpp
Normal file
|
|
@ -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();
|
||||
}
|
||||
47
examples/CMake/AudioPlugin/PluginProcessor.h
Normal file
47
examples/CMake/AudioPlugin/PluginProcessor.h
Normal file
|
|
@ -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)
|
||||
};
|
||||
19
examples/CMake/CMakeLists.txt
Normal file
19
examples/CMake/CMakeLists.txt
Normal file
|
|
@ -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)
|
||||
82
examples/CMake/ConsoleApp/CMakeLists.txt
Normal file
82
examples/CMake/ConsoleApp/CMakeLists.txt
Normal file
|
|
@ -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)
|
||||
10
examples/CMake/ConsoleApp/Main.cpp
Normal file
10
examples/CMake/ConsoleApp/Main.cpp
Normal file
|
|
@ -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;
|
||||
}
|
||||
95
examples/CMake/GuiApp/CMakeLists.txt
Normal file
95
examples/CMake/GuiApp/CMakeLists.txt
Normal file
|
|
@ -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)
|
||||
101
examples/CMake/GuiApp/Main.cpp
Normal file
101
examples/CMake/GuiApp/Main.cpp
Normal file
|
|
@ -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)
|
||||
25
examples/CMake/GuiApp/MainComponent.cpp
Normal file
25
examples/CMake/GuiApp/MainComponent.cpp
Normal file
|
|
@ -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.
|
||||
}
|
||||
29
examples/CMake/GuiApp/MainComponent.h
Normal file
29
examples/CMake/GuiApp/MainComponent.h
Normal file
|
|
@ -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)
|
||||
};
|
||||
513
examples/CMake/readme.md
Normal file
513
examples/CMake/readme.md
Normal file
|
|
@ -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.
|
||||
35
examples/CMakeLists.txt
Normal file
35
examples/CMakeLists.txt
Normal file
|
|
@ -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)
|
||||
17
examples/DSP/CMakeLists.txt
Normal file
17
examples/DSP/CMakeLists.txt
Normal file
|
|
@ -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");
|
||||
|
|
|
|||
64
examples/DemoRunner/CMakeLists.txt
Normal file
64
examples/DemoRunner/CMakeLists.txt
Normal file
|
|
@ -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()
|
||||
17
examples/GUI/CMakeLists.txt
Normal file
17
examples/GUI/CMakeLists.txt
Normal file
|
|
@ -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
|
||||
|
||||
|
|
|
|||
17
examples/Plugins/CMakeLists.txt
Normal file
17
examples/Plugins/CMakeLists.txt
Normal file
|
|
@ -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
|
||||
|
||||
|
|
|
|||
17
examples/Utilities/CMakeLists.txt
Normal file
17
examples/Utilities/CMakeLists.txt
Normal file
|
|
@ -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
|
||||
|
|
|
|||
27
extras/AudioPerformanceTest/CMakeLists.txt
Normal file
27
extras/AudioPerformanceTest/CMakeLists.txt
Normal file
|
|
@ -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)
|
||||
52
extras/AudioPluginHost/CMakeLists.txt
Normal file
52
extras/AudioPluginHost/CMakeLists.txt
Normal file
|
|
@ -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)
|
||||
25
extras/BinaryBuilder/CMakeLists.txt
Normal file
25
extras/BinaryBuilder/CMakeLists.txt
Normal file
|
|
@ -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)
|
||||
41
extras/Build/CMake/JUCEConfig.cmake.in
Normal file
41
extras/Build/CMake/JUCEConfig.cmake.in
Normal file
|
|
@ -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")
|
||||
2014
extras/Build/CMake/JUCEUtils.cmake
Normal file
2014
extras/Build/CMake/JUCEUtils.cmake
Normal file
File diff suppressed because it is too large
Load diff
16
extras/Build/CMake/LaunchScreen.storyboard
Normal file
16
extras/Build/CMake/LaunchScreen.storyboard
Normal file
|
|
@ -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>
|
||||
16
extras/Build/CMake/PIPAudioProcessor.cpp.in
Normal file
16
extras/Build/CMake/PIPAudioProcessor.cpp.in
Normal file
|
|
@ -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)
|
||||
10
extras/Build/CMake/PIPConsole.cpp.in
Normal file
10
extras/Build/CMake/PIPConsole.cpp.in
Normal file
|
|
@ -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);
|
||||
}
|
||||
17
extras/Build/CMake/copyDir.cmake
Normal file
17
extras/Build/CMake/copyDir.cmake
Normal file
|
|
@ -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})
|
||||
20
extras/Build/CMakeLists.txt
Normal file
20
extras/Build/CMakeLists.txt
Normal file
|
|
@ -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)
|
||||
|
||||
40
extras/Build/juce_build_tools/juce_build_tools.cpp
Normal file
40
extras/Build/juce_build_tools/juce_build_tools.cpp
Normal file
|
|
@ -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"
|
||||
60
extras/Build/juce_build_tools/juce_build_tools.h
Normal file
60
extras/Build/juce_build_tools/juce_build_tools.h
Normal file
|
|
@ -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"
|
||||
280
extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.cpp
Normal file
280
extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.cpp
Normal file
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
109
extras/Build/juce_build_tools/utils/juce_Entitlements.cpp
Normal file
109
extras/Build/juce_build_tools/utils/juce_Entitlements.cpp
Normal file
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
48
extras/Build/juce_build_tools/utils/juce_Entitlements.h
Normal file
48
extras/Build/juce_build_tools/utils/juce_Entitlements.h
Normal file
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
}
|
||||
497
extras/Build/juce_build_tools/utils/juce_Icons.cpp
Normal file
497
extras/Build/juce_build_tools/utils/juce_Icons.cpp
Normal file
|
|
@ -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 };
|
||||
}
|
||||
}
|
||||
}
|
||||
42
extras/Build/juce_build_tools/utils/juce_Icons.h
Normal file
42
extras/Build/juce_build_tools/utils/juce_Icons.h
Normal file
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
354
extras/Build/juce_build_tools/utils/juce_PlistOptions.cpp
Normal file
354
extras/Build/juce_build_tools/utils/juce_PlistOptions.cpp
Normal file
|
|
@ -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 };
|
||||
}
|
||||
}
|
||||
}
|
||||
95
extras/Build/juce_build_tools/utils/juce_PlistOptions.h
Normal file
95
extras/Build/juce_build_tools/utils/juce_PlistOptions.h
Normal file
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
}
|
||||
268
extras/Build/juce_build_tools/utils/juce_ProjectType.h
Normal file
268
extras/Build/juce_build_tools/utils/juce_ProjectType.h
Normal file
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
122
extras/Build/juce_build_tools/utils/juce_RelativePath.h
Normal file
122
extras/Build/juce_build_tools/utils/juce_RelativePath.h
Normal file
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
88
extras/Build/juce_build_tools/utils/juce_ResourceRc.cpp
Normal file
88
extras/Build/juce_build_tools/utils/juce_ResourceRc.cpp
Normal file
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
36
extras/Build/juce_build_tools/utils/juce_ResourceRc.h
Normal file
36
extras/Build/juce_build_tools/utils/juce_ResourceRc.h
Normal file
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
}
|
||||
50
extras/Build/juce_build_tools/utils/juce_VersionNumbers.cpp
Normal file
50
extras/Build/juce_build_tools/utils/juce_VersionNumbers.cpp
Normal file
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
29
extras/Build/juce_build_tools/utils/juce_VersionNumbers.h
Normal file
29
extras/Build/juce_build_tools/utils/juce_VersionNumbers.h
Normal file
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
90
extras/Build/juceaide/CMakeLists.txt
Normal file
90
extras/Build/juceaide/CMakeLists.txt
Normal file
|
|
@ -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()
|
||||
507
extras/Build/juceaide/Main.cpp
Normal file
507
extras/Build/juceaide/Main.cpp
Normal file
|
|
@ -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));
|
||||
});
|
||||
}
|
||||
22
extras/CMakeLists.txt
Normal file
22
extras/CMakeLists.txt
Normal file
|
|
@ -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)
|
||||
30
extras/NetworkGraphicsDemo/CMakeLists.txt
Normal file
30
extras/NetworkGraphicsDemo/CMakeLists.txt
Normal file
|
|
@ -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"
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -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>
|
||||
|
|
|
|||
166
extras/Projucer/CMakeLists.txt
Normal file
166
extras/Projucer/CMakeLists.txt
Normal file
|
|
@ -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
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -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;
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue