@@ -102,7 +102,7 @@ func (pme *Explorer) DownloadAndInstallPlatformAndTools(
102
102
103
103
// Install tools first
104
104
for _ , tool := range toolsToInstall {
105
- if err := pme .InstallTool (tool , taskCB ); err != nil {
105
+ if err := pme .InstallTool (tool , taskCB , skipPostInstall ); err != nil {
106
106
return err
107
107
}
108
108
}
@@ -299,7 +299,7 @@ func (pme *Explorer) UninstallPlatform(platformRelease *cores.PlatformRelease, t
299
299
}
300
300
301
301
// 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 {
303
303
log := pme .log .WithField ("Tool" , toolRelease )
304
304
305
305
if toolRelease .IsInstalled () {
@@ -325,6 +325,22 @@ func (pme *Explorer) InstallTool(toolRelease *cores.ToolRelease, taskCB rpc.Task
325
325
log .WithError (err ).Warn ("Cannot install tool" )
326
326
return & arduino.FailedInstallError {Message : tr ("Cannot install tool %s" , toolRelease ), Cause : err }
327
327
}
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
+ }
328
344
log .Info ("Tool installed" )
329
345
taskCB (& rpc.TaskProgress {Message : tr ("%s installed" , toolRelease ), Completed : true })
330
346
@@ -395,3 +411,27 @@ func (pme *Explorer) IsToolRequired(toolRelease *cores.ToolRelease) bool {
395
411
}
396
412
return false
397
413
}
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