Browse Source

CMake: Add support for building JUCE projects with CMake

tags/2021-05-28
reuk 6 years ago
parent
commit
ece5644a20
100 changed files with 8881 additions and 812 deletions
  1. +3
    -0
      .gitignore
  2. +103
    -0
      CMakeLists.txt
  3. +2
    -0
      examples/Assets/DemoUtilities.h
  4. +17
    -0
      examples/Audio/CMakeLists.txt
  5. +17
    -0
      examples/BLOCKS/CMakeLists.txt
  6. +104
    -0
      examples/CMake/AudioPlugin/CMakeLists.txt
  7. +33
    -0
      examples/CMake/AudioPlugin/PluginEditor.cpp
  8. +22
    -0
      examples/CMake/AudioPlugin/PluginEditor.h
  9. +186
    -0
      examples/CMake/AudioPlugin/PluginProcessor.cpp
  10. +47
    -0
      examples/CMake/AudioPlugin/PluginProcessor.h
  11. +19
    -0
      examples/CMake/CMakeLists.txt
  12. +82
    -0
      examples/CMake/ConsoleApp/CMakeLists.txt
  13. +10
    -0
      examples/CMake/ConsoleApp/Main.cpp
  14. +95
    -0
      examples/CMake/GuiApp/CMakeLists.txt
  15. +101
    -0
      examples/CMake/GuiApp/Main.cpp
  16. +25
    -0
      examples/CMake/GuiApp/MainComponent.cpp
  17. +29
    -0
      examples/CMake/GuiApp/MainComponent.h
  18. +513
    -0
      examples/CMake/readme.md
  19. +35
    -0
      examples/CMakeLists.txt
  20. +17
    -0
      examples/DSP/CMakeLists.txt
  21. +2
    -0
      examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h
  22. +64
    -0
      examples/DemoRunner/CMakeLists.txt
  23. +17
    -0
      examples/GUI/CMakeLists.txt
  24. +17
    -14
      examples/Plugins/AUv3SynthPluginDemo.h
  25. +16
    -14
      examples/Plugins/ArpeggiatorPluginDemo.h
  26. +18
    -14
      examples/Plugins/AudioPluginDemo.h
  27. +17
    -0
      examples/Plugins/CMakeLists.txt
  28. +16
    -14
      examples/Plugins/InterAppAudioEffectPluginDemo.h
  29. +16
    -14
      examples/Plugins/MultiOutSynthPluginDemo.h
  30. +17
    -0
      examples/Utilities/CMakeLists.txt
  31. +1
    -0
      examples/Utilities/InAppPurchasesDemo.h
  32. +1
    -0
      examples/Utilities/PushNotificationsDemo.h
  33. +27
    -0
      extras/AudioPerformanceTest/CMakeLists.txt
  34. +52
    -0
      extras/AudioPluginHost/CMakeLists.txt
  35. +25
    -0
      extras/BinaryBuilder/CMakeLists.txt
  36. +41
    -0
      extras/Build/CMake/JUCEConfig.cmake.in
  37. +2014
    -0
      extras/Build/CMake/JUCEUtils.cmake
  38. +16
    -0
      extras/Build/CMake/LaunchScreen.storyboard
  39. +16
    -0
      extras/Build/CMake/PIPAudioProcessor.cpp.in
  40. +68
    -77
      extras/Build/CMake/PIPComponent.cpp.in
  41. +10
    -0
      extras/Build/CMake/PIPConsole.cpp.in
  42. +0
    -0
      extras/Build/CMake/RecentFilesMenuTemplate.nib
  43. +16
    -16
      extras/Build/CMake/UnityPluginGUIScript.cs.in
  44. +17
    -0
      extras/Build/CMake/copyDir.cmake
  45. +20
    -0
      extras/Build/CMakeLists.txt
  46. +40
    -0
      extras/Build/juce_build_tools/juce_build_tools.cpp
  47. +60
    -0
      extras/Build/juce_build_tools/juce_build_tools.h
  48. +280
    -0
      extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.cpp
  49. +67
    -0
      extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.h
  50. +344
    -0
      extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.cpp
  51. +79
    -0
      extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.h
  52. +214
    -0
      extras/Build/juce_build_tools/utils/juce_CppTokeniserFunctions.cpp
  53. +109
    -0
      extras/Build/juce_build_tools/utils/juce_Entitlements.cpp
  54. +48
    -0
      extras/Build/juce_build_tools/utils/juce_Entitlements.h
  55. +497
    -0
      extras/Build/juce_build_tools/utils/juce_Icons.cpp
  56. +42
    -0
      extras/Build/juce_build_tools/utils/juce_Icons.h
  57. +354
    -0
      extras/Build/juce_build_tools/utils/juce_PlistOptions.cpp
  58. +95
    -0
      extras/Build/juce_build_tools/utils/juce_PlistOptions.h
  59. +268
    -0
      extras/Build/juce_build_tools/utils/juce_ProjectType.h
  60. +122
    -0
      extras/Build/juce_build_tools/utils/juce_RelativePath.h
  61. +84
    -0
      extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.cpp
  62. +31
    -0
      extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.h
  63. +88
    -0
      extras/Build/juce_build_tools/utils/juce_ResourceRc.cpp
  64. +36
    -0
      extras/Build/juce_build_tools/utils/juce_ResourceRc.h
  65. +50
    -0
      extras/Build/juce_build_tools/utils/juce_VersionNumbers.cpp
  66. +29
    -0
      extras/Build/juce_build_tools/utils/juce_VersionNumbers.h
  67. +90
    -0
      extras/Build/juceaide/CMakeLists.txt
  68. +507
    -0
      extras/Build/juceaide/Main.cpp
  69. +22
    -0
      extras/CMakeLists.txt
  70. +30
    -0
      extras/NetworkGraphicsDemo/CMakeLists.txt
  71. +8
    -2
      extras/Projucer/Builds/LinuxMakefile/Makefile
  72. BIN
      extras/Projucer/Builds/MacOSX/Icon.icns
  73. +79
    -40
      extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj
  74. +50
    -8
      extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj
  75. +90
    -12
      extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters
  76. +50
    -8
      extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
  77. +90
    -12
      extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
  78. +50
    -8
      extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
  79. +90
    -12
      extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
  80. +166
    -0
      extras/Projucer/CMakeLists.txt
  81. +1
    -0
      extras/Projucer/JuceLibraryCode/AppConfig.h
  82. +495
    -437
      extras/Projucer/JuceLibraryCode/BinaryData.cpp
  83. +19
    -10
      extras/Projucer/JuceLibraryCode/BinaryData.h
  84. +1
    -0
      extras/Projucer/JuceLibraryCode/JuceHeader.h
  85. +9
    -0
      extras/Projucer/JuceLibraryCode/include_juce_build_tools.cpp
  86. +90
    -77
      extras/Projucer/Projucer.jucer
  87. +1
    -1
      extras/Projucer/Source/Application/Windows/jucer_SVGPathDataWindowComponent.h
  88. +2
    -2
      extras/Projucer/Source/Application/jucer_CommandLine.cpp
  89. +0
    -1
      extras/Projucer/Source/Application/jucer_CommonHeaders.h
  90. +1
    -1
      extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.cpp
  91. +2
    -2
      extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp
  92. +1
    -1
      extras/Projucer/Source/ComponentEditor/Components/jucer_GenericComponentHandler.h
  93. +1
    -1
      extras/Projucer/Source/ComponentEditor/PaintElements/jucer_FillType.h
  94. +1
    -1
      extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h
  95. +1
    -1
      extras/Projucer/Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h
  96. +1
    -1
      extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.cpp
  97. +4
    -4
      extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp
  98. +1
    -1
      extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.cpp
  99. +3
    -3
      extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp
  100. +4
    -3
      extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.cpp

+ 3
- 0
.gitignore View File

@@ -59,3 +59,6 @@ profile
**/doxygen/build
**/.idea
extras/Projucer/JUCECompileEngine.dylib
.idea
**/cmake-build*

+ 103
- 0
CMakeLists.txt View 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)


+ 2
- 0
examples/Assets/DemoUtilities.h View File

@@ -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
- 0
examples/Audio/CMakeLists.txt View 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
- 0
examples/BLOCKS/CMakeLists.txt View 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
- 0
examples/CMake/AudioPlugin/CMakeLists.txt View 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
- 0
examples/CMake/AudioPlugin/PluginEditor.cpp View 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
- 0
examples/CMake/AudioPlugin/PluginEditor.h View 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
- 0
examples/CMake/AudioPlugin/PluginProcessor.cpp View 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
- 0
examples/CMake/AudioPlugin/PluginProcessor.h View 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
- 0
examples/CMake/CMakeLists.txt View 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
- 0
examples/CMake/ConsoleApp/CMakeLists.txt View 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
- 0
examples/CMake/ConsoleApp/Main.cpp View 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
- 0
examples/CMake/GuiApp/CMakeLists.txt View 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
- 0
examples/CMake/GuiApp/Main.cpp View 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
- 0
examples/CMake/GuiApp/MainComponent.cpp View 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
- 0
examples/CMake/GuiApp/MainComponent.h View 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
- 0
examples/CMake/readme.md View 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
- 0
examples/CMakeLists.txt View 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
- 0
examples/DSP/CMakeLists.txt View 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()

+ 2
- 0
examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h View File

@@ -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
- 0
examples/DemoRunner/CMakeLists.txt View 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
- 0
examples/GUI/CMakeLists.txt View 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
- 14
examples/Plugins/AUv3SynthPluginDemo.h View File

@@ -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


+ 16
- 14
examples/Plugins/ArpeggiatorPluginDemo.h View File

@@ -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


+ 18
- 14
examples/Plugins/AudioPluginDemo.h View File

@@ -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
- 0
examples/Plugins/CMakeLists.txt View 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()

+ 16
- 14
examples/Plugins/InterAppAudioEffectPluginDemo.h View File

@@ -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


+ 16
- 14
examples/Plugins/MultiOutSynthPluginDemo.h View File

@@ -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
- 0
examples/Utilities/CMakeLists.txt View 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()

+ 1
- 0
examples/Utilities/InAppPurchasesDemo.h View File

@@ -38,6 +38,7 @@
exporters: xcode_mac, xcode_iphone, androidstudio
moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1
JUCE_IN_APP_PURCHASES=1
type: Component
mainClass: InAppPurchasesDemo


+ 1
- 0
examples/Utilities/PushNotificationsDemo.h View File

@@ -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
- 0
extras/AudioPerformanceTest/CMakeLists.txt View 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
- 0
extras/AudioPluginHost/CMakeLists.txt View 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
- 0
extras/BinaryBuilder/CMakeLists.txt View 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
- 0
extras/Build/CMake/JUCEConfig.cmake.in View 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
- 0
extras/Build/CMake/JUCEUtils.cmake
File diff suppressed because it is too large
View File


+ 16
- 0
extras/Build/CMake/LaunchScreen.storyboard View 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
- 0
extras/Build/CMake/PIPAudioProcessor.cpp.in View 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}();
}

extras/Projucer/Source/BinaryData/Templates/jucer_PIPMain.cpp → extras/Build/CMake/PIPComponent.cpp.in View File

@@ -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
- 0
extras/Build/CMake/PIPConsole.cpp.in View 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}"

extras/Projucer/Source/BinaryData/RecentFilesMenuTemplate.nib → extras/Build/CMake/RecentFilesMenuTemplate.nib View File


extras/Projucer/Source/BinaryData/Templates/jucer_UnityPluginGUIScript.cs → extras/Build/CMake/UnityPluginGUIScript.cs.in View File

@@ -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
- 0
extras/Build/CMake/copyDir.cmake View 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
- 0
extras/Build/CMakeLists.txt View 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
- 0
extras/Build/juce_build_tools/juce_build_tools.cpp View 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
- 0
extras/Build/juce_build_tools/juce_build_tools.h View 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
- 0
extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.cpp View 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) };
}
}
}

+ 67
- 0
extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.h View File

@@ -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)
};
}
}

+ 344
- 0
extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.cpp View File

@@ -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);
}
}
}

+ 79
- 0
extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.h View File

@@ -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);
}
}

+ 214
- 0
extras/Build/juce_build_tools/utils/juce_CppTokeniserFunctions.cpp View File

@@ -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
- 0
extras/Build/juce_build_tools/utils/juce_Entitlements.cpp View 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
- 0
extras/Build/juce_build_tools/utils/juce_Entitlements.h View 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
- 0
extras/Build/juce_build_tools/utils/juce_Icons.cpp View 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
- 0
extras/Build/juce_build_tools/utils/juce_Icons.h View 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
- 0
extras/Build/juce_build_tools/utils/juce_PlistOptions.cpp View 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
- 0
extras/Build/juce_build_tools/utils/juce_PlistOptions.h View 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
- 0
extras/Build/juce_build_tools/utils/juce_ProjectType.h View 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
- 0
extras/Build/juce_build_tools/utils/juce_RelativePath.h View 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);
}
};
}
}

+ 84
- 0
extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.cpp View File

@@ -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));
}
}
}

+ 31
- 0
extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.h View File

@@ -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
- 0
extras/Build/juce_build_tools/utils/juce_ResourceRc.cpp View 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
- 0
extras/Build/juce_build_tools/utils/juce_ResourceRc.h View 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
- 0
extras/Build/juce_build_tools/utils/juce_VersionNumbers.cpp View 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
- 0
extras/Build/juce_build_tools/utils/juce_VersionNumbers.h View 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
- 0
extras/Build/juceaide/CMakeLists.txt View 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
- 0
extras/Build/juceaide/Main.cpp View 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
- 0
extras/CMakeLists.txt View 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
- 0
extras/NetworkGraphicsDemo/CMakeLists.txt View 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)

+ 8
- 2
extras/Projucer/Builds/LinuxMakefile/Makefile View File

@@ -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"


BIN
extras/Projucer/Builds/MacOSX/Icon.icns View File


+ 79
- 40
extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj View File

@@ -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,


+ 50
- 8
extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj View File

@@ -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"/>


+ 90
- 12
extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters View File

@@ -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>


+ 50
- 8
extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj View File

@@ -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"/>


+ 90
- 12
extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters View File

@@ -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>


+ 50
- 8
extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj View File

@@ -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"/>


+ 90
- 12
extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters View File

@@ -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
- 0
extras/Projucer/CMakeLists.txt View 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)

+ 1
- 0
extras/Projucer/JuceLibraryCode/AppConfig.h View File

@@ -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


+ 495
- 437
extras/Projucer/JuceLibraryCode/BinaryData.cpp
File diff suppressed because it is too large
View File


+ 19
- 10
extras/Projucer/JuceLibraryCode/BinaryData.h View File

@@ -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[];


+ 1
- 0
extras/Projucer/JuceLibraryCode/JuceHeader.h View File

@@ -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>


+ 9
- 0
extras/Projucer/JuceLibraryCode/include_juce_build_tools.cpp View File

@@ -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>

+ 90
- 77
extras/Projucer/Projucer.jucer View File

@@ -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"/>


+ 1
- 1
extras/Projucer/Source/Application/Windows/jucer_SVGPathDataWindowComponent.h View File

@@ -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


+ 2
- 2
extras/Projucer/Source/Application/jucer_CommandLine.cpp View File

@@ -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;


+ 0
- 1
extras/Projucer/Source/Application/jucer_CommonHeaders.h View File

@@ -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"


+ 1
- 1
extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.cpp View File

@@ -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);


+ 2
- 2
extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp View File

@@ -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);


+ 1
- 1
extras/Projucer/Source/ComponentEditor/Components/jucer_GenericComponentHandler.h View File

@@ -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");
}


+ 1
- 1
extras/Projucer/Source/ComponentEditor/PaintElements/jucer_FillType.h View File

@@ -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)
{


+ 1
- 1
extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h View File

@@ -114,7 +114,7 @@ public:
if (Project* project = cpp.getProject())
{
ResourceFile resourceFile (*project);
JucerResourceFile resourceFile (*project);
for (int i = 0; i < resourceFile.getNumFiles(); ++i)
{


+ 1
- 1
extras/Projucer/Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h View File

@@ -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,


+ 1
- 1
extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.cpp View File

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


+ 4
- 4
extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp View File

@@ -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))
{


+ 1
- 1
extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.cpp View File

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


+ 3
- 3
extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp View File

@@ -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);
}


+ 4
- 3
extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.cpp View File

@@ -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 changed in this diff

Loading…
Cancel
Save