| @@ -242,6 +242,9 @@ void Project::initialiseProjectValues() | |||||
| binaryDataNamespaceValue.referTo (projectRoot, Ids::binaryDataNamespace, getUndoManager(), "BinaryData"); | binaryDataNamespaceValue.referTo (projectRoot, Ids::binaryDataNamespace, getUndoManager(), "BinaryData"); | ||||
| compilerFlagSchemesValue.referTo (projectRoot, Ids::compilerFlagSchemes, getUndoManager(), Array<var>(), ","); | compilerFlagSchemesValue.referTo (projectRoot, Ids::compilerFlagSchemes, getUndoManager(), Array<var>(), ","); | ||||
| postExportShellCommandPosixValue.referTo (projectRoot, Ids::postExportShellCommandPosix, getUndoManager()); | |||||
| postExportShellCommandWinValue.referTo (projectRoot, Ids::postExportShellCommandWin, getUndoManager()); | |||||
| } | } | ||||
| void Project::initialiseAudioPluginValues() | void Project::initialiseAudioPluginValues() | ||||
| @@ -1046,6 +1049,14 @@ void Project::createPropertyEditors (PropertyListBuilder& props) | |||||
| props.addSearchPathProperty (headerSearchPathsValue, "Header Search Paths", "Global header search paths."); | props.addSearchPathProperty (headerSearchPathsValue, "Header Search Paths", "Global header search paths."); | ||||
| props.add (new TextPropertyComponent (postExportShellCommandPosixValue, "Post-Export Shell Command (macOS, Linux)", 1024, false), | |||||
| "A command that will be executed by the system shell after saving this project on macOS or Linux. " | |||||
| "The string \"%%1%%\" will be substituted with the absolute path to the project root folder."); | |||||
| props.add (new TextPropertyComponent (postExportShellCommandWinValue, "Post-Export Shell Command (Windows)", 1024, false), | |||||
| "A command that will be executed by the system shell after saving this project on Windows. " | |||||
| "The string \"%%1%%\" will be substituted with the absolute path to the project root folder."); | |||||
| props.add (new TextPropertyComponent (userNotesValue, "Notes", 32768, true), | props.add (new TextPropertyComponent (userNotesValue, "Notes", 32768, true), | ||||
| "Extra comments: This field is not used for code or project generation, it's just a space where you can express your thoughts."); | "Extra comments: This field is not used for code or project generation, it's just a space where you can express your thoughts."); | ||||
| } | } | ||||
| @@ -133,6 +133,9 @@ public: | |||||
| void addCompilerFlagScheme (const String&); | void addCompilerFlagScheme (const String&); | ||||
| void removeCompilerFlagScheme (const String&); | void removeCompilerFlagScheme (const String&); | ||||
| String getPostExportShellCommandPosixString() const { return postExportShellCommandPosixValue.get(); } | |||||
| String getPostExportShellCommandWinString() const { return postExportShellCommandWinValue.get(); } | |||||
| //============================================================================== | //============================================================================== | ||||
| String getPluginNameString() const { return pluginNameValue.get(); } | String getPluginNameString() const { return pluginNameValue.get(); } | ||||
| String getPluginDescriptionString() const { return pluginDescriptionValue.get();} | String getPluginDescriptionString() const { return pluginDescriptionValue.get();} | ||||
| @@ -425,7 +428,7 @@ private: | |||||
| ValueWithDefault projectNameValue, projectUIDValue, projectLineFeedValue, projectTypeValue, versionValue, bundleIdentifierValue, companyNameValue, | ValueWithDefault projectNameValue, projectUIDValue, projectLineFeedValue, projectTypeValue, versionValue, bundleIdentifierValue, companyNameValue, | ||||
| companyCopyrightValue, companyWebsiteValue, companyEmailValue, displaySplashScreenValue, reportAppUsageValue, splashScreenColourValue, cppStandardValue, | companyCopyrightValue, companyWebsiteValue, companyEmailValue, displaySplashScreenValue, reportAppUsageValue, splashScreenColourValue, cppStandardValue, | ||||
| headerSearchPathsValue, preprocessorDefsValue, userNotesValue, maxBinaryFileSizeValue, includeBinaryDataInJuceHeaderValue, binaryDataNamespaceValue, | headerSearchPathsValue, preprocessorDefsValue, userNotesValue, maxBinaryFileSizeValue, includeBinaryDataInJuceHeaderValue, binaryDataNamespaceValue, | ||||
| compilerFlagSchemesValue; | |||||
| compilerFlagSchemesValue, postExportShellCommandPosixValue, postExportShellCommandWinValue; | |||||
| ValueWithDefault pluginFormatsValue, pluginNameValue, pluginDescriptionValue, pluginManufacturerValue, pluginManufacturerCodeValue, | ValueWithDefault pluginFormatsValue, pluginNameValue, pluginDescriptionValue, pluginManufacturerValue, pluginManufacturerCodeValue, | ||||
| pluginCodeValue, pluginChannelConfigsValue, pluginCharacteristicsValue, pluginAUExportPrefixValue, pluginAAXIdentifierValue, | pluginCodeValue, pluginChannelConfigsValue, pluginCharacteristicsValue, pluginAUExportPrefixValue, pluginAAXIdentifierValue, | ||||
| @@ -108,6 +108,7 @@ public: | |||||
| writeAppHeader (modules); | writeAppHeader (modules); | ||||
| writeModuleCppWrappers (modules); | writeModuleCppWrappers (modules); | ||||
| writeProjects (modules, specifiedExporterToSave, ! showProgressBox); | writeProjects (modules, specifiedExporterToSave, ! showProgressBox); | ||||
| runPostExportScript(); | |||||
| // if the project root has changed after writing the other files then re-save it | // if the project root has changed after writing the other files then re-save it | ||||
| if (project.getProjectRoot().toXmlString().hashCode() != projectRootHash) | if (project.getProjectRoot().toXmlString().hashCode() != projectRootHash) | ||||
| @@ -708,6 +709,46 @@ private: | |||||
| void writeProjects (const OwnedArray<LibraryModule>&, const String&, bool); | void writeProjects (const OwnedArray<LibraryModule>&, const String&, bool); | ||||
| void runPostExportScript() | |||||
| { | |||||
| #if JUCE_WINDOWS | |||||
| auto cmdString = project.getPostExportShellCommandWinString(); | |||||
| #else | |||||
| auto cmdString = project.getPostExportShellCommandPosixString(); | |||||
| #endif | |||||
| auto shellCommand = cmdString.replace ("%%1%%", project.getProjectFolder().getFullPathName()); | |||||
| if (shellCommand.isNotEmpty()) | |||||
| { | |||||
| #if JUCE_WINDOWS | |||||
| StringArray argList ("cmd.exe", "/c"); | |||||
| #else | |||||
| StringArray argList ("/bin/sh", "-c"); | |||||
| #endif | |||||
| argList.add (shellCommand); | |||||
| ChildProcess shellProcess; | |||||
| if (! shellProcess.start (argList)) | |||||
| { | |||||
| addError ("Failed to run shell command: " + argList.joinIntoString (" ")); | |||||
| return; | |||||
| } | |||||
| if (! shellProcess.waitForProcessToFinish (10000)) | |||||
| { | |||||
| addError ("Timeout running shell command: " + argList.joinIntoString (" ")); | |||||
| return; | |||||
| } | |||||
| auto exitCode = shellProcess.getExitCode(); | |||||
| if (exitCode != 0) | |||||
| addError ("Shell command: " + argList.joinIntoString (" ") + " failed with exit code: " + String (exitCode)); | |||||
| } | |||||
| } | |||||
| void saveExporter (ProjectExporter* exporter, const OwnedArray<LibraryModule>& modules) | void saveExporter (ProjectExporter* exporter, const OwnedArray<LibraryModule>& modules) | ||||
| { | { | ||||
| try | try | ||||
| @@ -352,6 +352,8 @@ namespace Ids | |||||
| DECLARE_ID (compilerFlagSchemes); | DECLARE_ID (compilerFlagSchemes); | ||||
| DECLARE_ID (compilerFlagScheme); | DECLARE_ID (compilerFlagScheme); | ||||
| DECLARE_ID (dontQueryForUpdate); | DECLARE_ID (dontQueryForUpdate); | ||||
| DECLARE_ID (postExportShellCommandPosix); | |||||
| DECLARE_ID (postExportShellCommandWin); | |||||
| const Identifier ID ("id"); | const Identifier ID ("id"); | ||||
| const Identifier ID_uppercase ("ID"); | const Identifier ID_uppercase ("ID"); | ||||