3030package phases
3131
3232import (
33+ "path/filepath"
34+
3335 "arduino.cc/builder/builder_utils"
3436 "arduino.cc/builder/constants"
3537 "arduino.cc/builder/i18n"
@@ -42,6 +44,7 @@ type CoreBuilder struct{}
4244
4345func (s * CoreBuilder ) Run (ctx * types.Context ) error {
4446 coreBuildPath := ctx .CoreBuildPath
47+ coreBuildCachePath := ctx .CoreBuildCachePath
4548 buildProperties := ctx .BuildProperties
4649 verbose := ctx .Verbose
4750 warningsLevel := ctx .WarningsLevel
@@ -52,7 +55,14 @@ func (s *CoreBuilder) Run(ctx *types.Context) error {
5255 return i18n .WrapError (err )
5356 }
5457
55- archiveFile , objectFiles , err := compileCore (coreBuildPath , buildProperties , verbose , warningsLevel , logger )
58+ if coreBuildCachePath != "" {
59+ err := utils .EnsureFolderExists (coreBuildCachePath )
60+ if err != nil {
61+ return i18n .WrapError (err )
62+ }
63+ }
64+
65+ archiveFile , objectFiles , err := compileCore (coreBuildPath , coreBuildCachePath , buildProperties , verbose , warningsLevel , logger )
5666 if err != nil {
5767 return i18n .WrapError (err )
5868 }
@@ -63,7 +73,7 @@ func (s *CoreBuilder) Run(ctx *types.Context) error {
6373 return nil
6474}
6575
66- func compileCore (buildPath string , buildProperties properties.Map , verbose bool , warningsLevel string , logger i18n.Logger ) (string , []string , error ) {
76+ func compileCore (buildPath string , buildCachePath string , buildProperties properties.Map , verbose bool , warningsLevel string , logger i18n.Logger ) (string , []string , error ) {
6777 coreFolder := buildProperties [constants .BUILD_PROPERTIES_BUILD_CORE_PATH ]
6878 variantFolder := buildProperties [constants .BUILD_PROPERTIES_BUILD_VARIANT_PATH ]
6979
@@ -89,15 +99,19 @@ func compileCore(buildPath string, buildProperties properties.Map, verbose bool,
8999 // Recreate the archive if ANY of the core files (including platform.txt) has changed
90100 realCoreFolder := utils .GetParentFolder (coreFolder , 2 )
91101
92- targetArchivedCore := builder_utils .GetCachedCoreArchiveFileName (buildProperties [constants .BUILD_PROPERTIES_FQBN ], realCoreFolder )
93- canUseArchivedCore := ! builder_utils .CoreOrReferencedCoreHasChanged (realCoreFolder , targetCoreFolder , targetArchivedCore )
94-
95- if canUseArchivedCore {
96- // use archived core
97- if verbose {
98- logger .Println (constants .LOG_LEVEL_INFO , "Using precompiled core" )
102+ var targetArchivedCore string
103+ if buildCachePath != "" {
104+ archivedCoreName := builder_utils .GetCachedCoreArchiveFileName (buildProperties [constants .BUILD_PROPERTIES_FQBN ], realCoreFolder )
105+ targetArchivedCore = filepath .Join (buildCachePath , archivedCoreName )
106+ canUseArchivedCore := ! builder_utils .CoreOrReferencedCoreHasChanged (realCoreFolder , targetCoreFolder , targetArchivedCore )
107+
108+ if canUseArchivedCore {
109+ // use archived core
110+ if verbose {
111+ logger .Println (constants .LOG_LEVEL_INFO , "Using precompiled core" )
112+ }
113+ return targetArchivedCore , variantObjectFiles , nil
99114 }
100- return targetArchivedCore , variantObjectFiles , nil
101115 }
102116
103117 coreObjectFiles , err := builder_utils .CompileFiles ([]string {}, coreFolder , true , buildPath , buildProperties , includes , verbose , warningsLevel , logger )
@@ -111,7 +125,10 @@ func compileCore(buildPath string, buildProperties properties.Map, verbose bool,
111125 }
112126
113127 // archive core.a
114- builder_utils .CopyFile (archiveFile , targetArchivedCore )
128+ if targetArchivedCore != "" {
129+ logger .Println (constants .LOG_LEVEL_DEBUG , "Archiving built core (caching) in: " + targetArchivedCore )
130+ builder_utils .CopyFile (archiveFile , targetArchivedCore )
131+ }
115132
116133 return archiveFile , variantObjectFiles , nil
117134}
0 commit comments