@@ -102,7 +102,7 @@ func (pme *Explorer) DownloadAndInstallPlatformAndTools(
102102
103103 // Install tools first
104104 for _ , tool := range toolsToInstall {
105- if err := pme .InstallTool (tool , taskCB ); err != nil {
105+ if err := pme .InstallTool (tool , taskCB , skipPostInstall ); err != nil {
106106 return err
107107 }
108108 }
@@ -299,7 +299,7 @@ func (pme *Explorer) UninstallPlatform(platformRelease *cores.PlatformRelease, t
299299}
300300
301301// InstallTool installs a specific release of a tool.
302- func (pme * Explorer ) InstallTool (toolRelease * cores.ToolRelease , taskCB rpc.TaskProgressCB ) error {
302+ func (pme * Explorer ) InstallTool (toolRelease * cores.ToolRelease , taskCB rpc.TaskProgressCB , skipPostInstall bool ) error {
303303 log := pme .log .WithField ("Tool" , toolRelease )
304304
305305 if toolRelease .IsInstalled () {
@@ -325,6 +325,22 @@ func (pme *Explorer) InstallTool(toolRelease *cores.ToolRelease, taskCB rpc.Task
325325 log .WithError (err ).Warn ("Cannot install tool" )
326326 return & arduino.FailedInstallError {Message : tr ("Cannot install tool %s" , toolRelease ), Cause : err }
327327 }
328+ if d , err := destDir .Abs (); err == nil {
329+ toolRelease .InstallDir = d
330+ } else {
331+ return err
332+ }
333+ // Perform post install
334+ if ! skipPostInstall {
335+ log .Info ("Running tool post_install script" )
336+ taskCB (& rpc.TaskProgress {Message : tr ("Configuring tool." )})
337+ if err := pme .RunPostInstallScriptTool (toolRelease ); err != nil {
338+ taskCB (& rpc.TaskProgress {Message : tr ("WARNING cannot configure tool: %s" , err )})
339+ }
340+ } else {
341+ log .Info ("Skipping tool configuration." )
342+ taskCB (& rpc.TaskProgress {Message : tr ("Skipping tool configuration." )})
343+ }
328344 log .Info ("Tool installed" )
329345 taskCB (& rpc.TaskProgress {Message : tr ("%s installed" , toolRelease ), Completed : true })
330346
@@ -395,3 +411,27 @@ func (pme *Explorer) IsToolRequired(toolRelease *cores.ToolRelease) bool {
395411 }
396412 return false
397413}
414+
415+ // RunPostInstallScriptTool runs the post_install.sh (or post_install.bat) script for the
416+ // specified toolRelease.
417+ func (pme * Explorer ) RunPostInstallScriptTool (toolRelease * cores.ToolRelease ) error {
418+ if ! toolRelease .IsInstalled () {
419+ return errors .New (tr ("tool not installed" ))
420+ }
421+ postInstallFilename := "post_install.sh"
422+ if runtime .GOOS == "windows" {
423+ postInstallFilename = "post_install.bat"
424+ }
425+ postInstall := toolRelease .InstallDir .Join (postInstallFilename )
426+ if postInstall .Exist () && postInstall .IsNotDir () {
427+ cmd , err := executils .NewProcessFromPath (pme .GetEnvVarsForSpawnedProcess (), postInstall )
428+ if err != nil {
429+ return err
430+ }
431+ cmd .SetDirFromPath (toolRelease .InstallDir )
432+ if err := cmd .Run (); err != nil {
433+ return err
434+ }
435+ }
436+ return nil
437+ }
0 commit comments