diff --git a/arduino/libraries/librariesresolver/cpp.go b/arduino/libraries/librariesresolver/cpp.go index e21e5dd1061..ac4ea823c31 100644 --- a/arduino/libraries/librariesresolver/cpp.go +++ b/arduino/libraries/librariesresolver/cpp.go @@ -69,6 +69,11 @@ func (resolver *Cpp) AlternativesFor(header string) libraries.List { return resolver.headers[header] } +func (resolver *Cpp) ExportMap() map[string]libraries.List { + return resolver.headers; +} + + // ResolveFor finds the most suitable library for the specified combination of // header and architecture. If no libraries provides the requested header, nil is returned func (resolver *Cpp) ResolveFor(header, architecture string) *libraries.Library { diff --git a/legacy/builder/builder.go b/legacy/builder/builder.go index 420c459e49b..57821d151f3 100644 --- a/legacy/builder/builder.go +++ b/legacy/builder/builder.go @@ -16,6 +16,8 @@ package builder import ( + "encoding/json" + "io/ioutil" "os" "reflect" "strconv" @@ -28,6 +30,7 @@ import ( "github.com/arduino/arduino-cli/legacy/builder/types" "github.com/arduino/arduino-cli/legacy/builder/utils" "github.com/pkg/errors" + "github.com/arduino/arduino-cli/arduino/libraries" ) var MAIN_FILE_VALID_EXTENSIONS = map[string]bool{".ino": true, ".pde": true} @@ -100,6 +103,71 @@ func (s *Builder) Run(ctx *types.Context) error { ctx.CompilationDatabase.SaveToFile() } + if ctx.CodeModelBuilder != nil { + var librariesByLocation = map[string]*libraries.Library{} + + for header, libraries := range ctx.LibrariesResolver.ExportMap() { + var knownHeader = new(types.KnownHeader) + + knownHeader.Name = header + for _, library := range libraries { + knownHeader.LibraryDirectories = append(knownHeader.LibraryDirectories, library.SourceDir.String()) + librariesByLocation[library.InstallDir.String()] = library + } + + ctx.CodeModelBuilder.Prototypes = ctx.Prototypes + ctx.CodeModelBuilder.KnownHeaders = append(ctx.CodeModelBuilder.KnownHeaders, knownHeader) + } + + for _, library := range librariesByLocation { + var knownLib = new(types.KnownLibrary) + + if (library.InstallDir != nil) { + knownLib.Folder = library.InstallDir.String() + } + + if (library.SourceDir != nil) { + knownLib.SrcFolder = library.SourceDir.String() + } + + if library.UtilityDir != nil { + knownLib.UtilityFolder = library.UtilityDir.String() + } + + knownLib.Layout = library.Layout + knownLib.Name = library.Name + knownLib.RealName = library.RealName + knownLib.IsLegacy = library.IsLegacy + + if (library.Version != nil) { + knownLib.Version = library.Version.String() + } + knownLib.Author = library.Author + knownLib.Maintainer = library.Maintainer + knownLib.Sentence = library.Sentence + knownLib.Paragraph = library.Paragraph + knownLib.URL = library.Website + knownLib.Category = library.Category + knownLib.License = library.License + + ctx.CodeModelBuilder.KnownLibraries = append(ctx.CodeModelBuilder.KnownLibraries, knownLib) + } + + for key, value := range ctx.BuildProperties.AsMap() { + var kv = new(types.KeyValuePair) + kv.Key = key + kv.Value = value + ctx.CodeModelBuilder.BuildProperties = append(ctx.CodeModelBuilder.BuildProperties, *kv) + } + + var bytes, err = json.MarshalIndent(ctx.CodeModelBuilder, "", " ") + if err != nil { + return err + } + ioutil.WriteFile(ctx.CodeModelBuilderFile, bytes, 0644) + return nil + } + commands = []types.Command{ &PrintUsedAndNotUsedLibraries{SketchError: mainErr != nil}, diff --git a/legacy/builder/builder_utils/utils.go b/legacy/builder/builder_utils/utils.go index 5d568b91b67..19be850a4ee 100644 --- a/legacy/builder/builder_utils/utils.go +++ b/legacy/builder/builder_utils/utils.go @@ -44,8 +44,8 @@ func PrintProgressIfProgressEnabledAndMachineLogger(ctx *types.Context) { } } -func CompileFilesRecursive(ctx *types.Context, sourcePath *paths.Path, buildPath *paths.Path, buildProperties *properties.Map, includes []string) (paths.PathList, error) { - objectFiles, err := CompileFiles(ctx, sourcePath, false, buildPath, buildProperties, includes) +func CompileFilesRecursive(ctx *types.Context, sourcePath *paths.Path, buildPath *paths.Path, buildProperties *properties.Map, includes []string, libraryModel *types.CodeModelLibrary) (paths.PathList, error) { + objectFiles, err := CompileFiles(ctx, sourcePath, false, buildPath, buildProperties, includes, libraryModel) if err != nil { return nil, errors.WithStack(err) } @@ -56,7 +56,7 @@ func CompileFilesRecursive(ctx *types.Context, sourcePath *paths.Path, buildPath } for _, folder := range folders { - subFolderObjectFiles, err := CompileFilesRecursive(ctx, sourcePath.Join(folder.Name()), buildPath.Join(folder.Name()), buildProperties, includes) + subFolderObjectFiles, err := CompileFilesRecursive(ctx, sourcePath.Join(folder.Name()), buildPath.Join(folder.Name()), buildProperties, includes, libraryModel) if err != nil { return nil, errors.WithStack(err) } @@ -66,7 +66,7 @@ func CompileFilesRecursive(ctx *types.Context, sourcePath *paths.Path, buildPath return objectFiles, nil } -func CompileFiles(ctx *types.Context, sourcePath *paths.Path, recurse bool, buildPath *paths.Path, buildProperties *properties.Map, includes []string) (paths.PathList, error) { +func CompileFiles(ctx *types.Context, sourcePath *paths.Path, recurse bool, buildPath *paths.Path, buildProperties *properties.Map, includes []string, libraryModel *types.CodeModelLibrary) (paths.PathList, error) { sSources, err := findFilesInFolder(sourcePath, ".S", recurse) if err != nil { return nil, errors.WithStack(err) @@ -83,15 +83,15 @@ func CompileFiles(ctx *types.Context, sourcePath *paths.Path, recurse bool, buil ctx.Progress.AddSubSteps(len(sSources) + len(cSources) + len(cppSources)) defer ctx.Progress.RemoveSubSteps() - sObjectFiles, err := compileFilesWithRecipe(ctx, sourcePath, sSources, buildPath, buildProperties, includes, constants.RECIPE_S_PATTERN) + sObjectFiles, err := compileFilesWithRecipe(ctx, sourcePath, sSources, buildPath, buildProperties, includes, constants.RECIPE_S_PATTERN, libraryModel) if err != nil { return nil, errors.WithStack(err) } - cObjectFiles, err := compileFilesWithRecipe(ctx, sourcePath, cSources, buildPath, buildProperties, includes, constants.RECIPE_C_PATTERN) + cObjectFiles, err := compileFilesWithRecipe(ctx, sourcePath, cSources, buildPath, buildProperties, includes, constants.RECIPE_C_PATTERN, libraryModel) if err != nil { return nil, errors.WithStack(err) } - cppObjectFiles, err := compileFilesWithRecipe(ctx, sourcePath, cppSources, buildPath, buildProperties, includes, constants.RECIPE_CPP_PATTERN) + cppObjectFiles, err := compileFilesWithRecipe(ctx, sourcePath, cppSources, buildPath, buildProperties, includes, constants.RECIPE_CPP_PATTERN, libraryModel) if err != nil { return nil, errors.WithStack(err) } @@ -103,6 +103,42 @@ func CompileFiles(ctx *types.Context, sourcePath *paths.Path, recurse bool, buil return objectFiles, nil } +func ReplaceOptimizationFlags(str string) string { + var tmp = strings.Split(str, " ") + for k, v := range tmp { + if v == "-O2" || v == "-Os" || v == "-O1" || v == "-Og" || v == "-O3" { + tmp[k] = "-O0" + } else if v == "-flto" { + tmp[k] = "" + } + } + + return strings.Join(tmp, " ") +} + +func RemoveOptimizationFromBuildProperties(properties *properties.Map) *properties.Map { + var result = properties.Clone() + + result.Set("compiler.c.flags", ReplaceOptimizationFlags(result.Get("compiler.c.flags"))) + result.Set("compiler.cpp.flags", ReplaceOptimizationFlags(result.Get("compiler.cpp.flags"))) + result.Set("build.flags.optimize", ReplaceOptimizationFlags(result.Get("build.flags.optimize"))) + return result +} + +func ExpandSysprogsExtensionProperties(properties *properties.Map, subtype string) *properties.Map { + var result = properties.Clone() + + result.Set("compiler.c.flags", result.Get("compiler.c.flags") + " " + result.Get("com.sysprogs.extraflags") + " " + result.Get("com.sysprogs.extraflags." + subtype)) + result.Set("compiler.cpp.flags", result.Get("compiler.cpp.flags") + " " + result.Get("com.sysprogs.extraflags") + " " + result.Get("com.sysprogs.extraflags." + subtype)) + return result +} + +func ExpandSysprogsLinkerProperties(properties *properties.Map) *properties.Map { + var result = properties.Clone() + result.Set("compiler.ldflags", result.Get("compiler.ldflags") + " " + result.Get("com.sysprogs.extraflags.ld")) + return result +} + func findFilesInFolder(sourcePath *paths.Path, extension string, recurse bool) (paths.PathList, error) { files, err := utils.ReadDirFiltered(sourcePath.String(), utils.FilterFilesWithExtensions(extension)) if err != nil { @@ -162,7 +198,7 @@ func findAllFilesInFolder(sourcePath string, recurse bool) ([]string, error) { return sources, nil } -func compileFilesWithRecipe(ctx *types.Context, sourcePath *paths.Path, sources paths.PathList, buildPath *paths.Path, buildProperties *properties.Map, includes []string, recipe string) (paths.PathList, error) { +func compileFilesWithRecipe(ctx *types.Context, sourcePath *paths.Path, sources paths.PathList, buildPath *paths.Path, buildProperties *properties.Map, includes []string, recipe string, libraryModel *types.CodeModelLibrary) (paths.PathList, error) { objectFiles := paths.NewPathList() if len(sources) == 0 { return objectFiles, nil @@ -173,7 +209,7 @@ func compileFilesWithRecipe(ctx *types.Context, sourcePath *paths.Path, sources queue := make(chan *paths.Path) job := func(source *paths.Path) { - objectFile, err := compileFileWithRecipe(ctx, sourcePath, source, buildPath, buildProperties, includes, recipe) + objectFile, err := compileFileWithRecipe(ctx, sourcePath, source, buildPath, buildProperties, includes, recipe, libraryModel) if err != nil { errorsMux.Lock() errorsList = append(errorsList, err) @@ -224,7 +260,7 @@ func compileFilesWithRecipe(ctx *types.Context, sourcePath *paths.Path, sources return objectFiles, nil } -func compileFileWithRecipe(ctx *types.Context, sourcePath *paths.Path, source *paths.Path, buildPath *paths.Path, buildProperties *properties.Map, includes []string, recipe string) (*paths.Path, error) { +func compileFileWithRecipe(ctx *types.Context, sourcePath *paths.Path, source *paths.Path, buildPath *paths.Path, buildProperties *properties.Map, includes []string, recipe string, libraryModel *types.CodeModelLibrary) (*paths.Path, error) { logger := ctx.GetLogger() properties := buildProperties.Clone() properties.Set(constants.BUILD_PROPERTIES_COMPILER_WARNING_FLAGS, properties.Get(constants.BUILD_PROPERTIES_COMPILER_WARNING_FLAGS+"."+ctx.WarningsLevel)) @@ -254,7 +290,17 @@ func compileFileWithRecipe(ctx *types.Context, sourcePath *paths.Path, source *p if ctx.CompilationDatabase != nil { ctx.CompilationDatabase.Add(source, command) } - if !objIsUpToDate && !ctx.OnlyUpdateCompilationDatabase { + + if libraryModel != nil { + var invocation = new(types.CodeModelGCCInvocation) + invocation.GCC = command.Path + invocation.InputFile = source.String() + invocation.ObjectFile = properties.Get(constants.BUILD_PROPERTIES_OBJECT_FILE) + invocation.Arguments = command.Args[1:] + libraryModel.Invocations = append(libraryModel.Invocations, invocation) + } + + if !objIsUpToDate && !ctx.OnlyUpdateCompilationDatabase && libraryModel == nil{ _, _, err = utils.ExecCommand(ctx, command, utils.ShowIfVerbose /* stdout */, utils.Show /* stderr */) if err != nil { return nil, errors.WithStack(err) @@ -464,7 +510,7 @@ func TXTBuildRulesHaveChanged(corePath, targetCorePath, targetFile *paths.Path) return true } -func ArchiveCompiledFiles(ctx *types.Context, buildPath *paths.Path, archiveFile *paths.Path, objectFilesToArchive paths.PathList, buildProperties *properties.Map) (*paths.Path, error) { +func ArchiveCompiledFiles(ctx *types.Context, buildPath *paths.Path, archiveFile *paths.Path, objectFilesToArchive paths.PathList, buildProperties *properties.Map, libraryModel *types.CodeModelLibrary) (*paths.Path, error) { logger := ctx.GetLogger() archiveFilePath := buildPath.JoinPath(archiveFile) diff --git a/legacy/builder/phases/core_builder.go b/legacy/builder/phases/core_builder.go index ef8e0b06e0d..0ca2271d41e 100644 --- a/legacy/builder/phases/core_builder.go +++ b/legacy/builder/phases/core_builder.go @@ -33,7 +33,7 @@ type CoreBuilder struct{} func (s *CoreBuilder) Run(ctx *types.Context) error { coreBuildPath := ctx.CoreBuildPath coreBuildCachePath := ctx.CoreBuildCachePath - buildProperties := ctx.BuildProperties + var buildProperties = ctx.BuildProperties if err := coreBuildPath.MkdirAll(); err != nil { return errors.WithStack(err) @@ -51,7 +51,19 @@ func (s *CoreBuilder) Run(ctx *types.Context) error { } } - archiveFile, objectFiles, err := compileCore(ctx, coreBuildPath, coreBuildCachePath, buildProperties) + var coreModel *types.CodeModelLibrary + if ctx.CodeModelBuilder != nil { + coreModel = new(types.CodeModelLibrary) + ctx.CodeModelBuilder.Core = coreModel + } + + if ctx.UnoptimizeCore { + buildProperties = builder_utils.RemoveOptimizationFromBuildProperties(buildProperties) + } + + buildProperties = builder_utils.ExpandSysprogsExtensionProperties(buildProperties, "core") + + archiveFile, objectFiles, err := compileCore(ctx, coreBuildPath, coreBuildCachePath, buildProperties, coreModel) if err != nil { return errors.WithStack(err) } @@ -62,12 +74,17 @@ func (s *CoreBuilder) Run(ctx *types.Context) error { return nil } -func compileCore(ctx *types.Context, buildPath *paths.Path, buildCachePath *paths.Path, buildProperties *properties.Map) (*paths.Path, paths.PathList, error) { +func compileCore(ctx *types.Context, buildPath *paths.Path, buildCachePath *paths.Path, buildProperties *properties.Map, coreModel *types.CodeModelLibrary) (*paths.Path, paths.PathList, error) { logger := ctx.GetLogger() coreFolder := buildProperties.GetPath("build.core.path") variantFolder := buildProperties.GetPath("build.variant.path") targetCoreFolder := buildProperties.GetPath(constants.BUILD_PROPERTIES_RUNTIME_PLATFORM_PATH) + + if coreModel != nil { + coreModel.SourceDirectory = coreFolder.String() + coreModel.Name = buildProperties.Get("name") + } includes := []string{} includes = append(includes, coreFolder.String()) @@ -80,7 +97,7 @@ func compileCore(ctx *types.Context, buildPath *paths.Path, buildCachePath *path variantObjectFiles := paths.NewPathList() if variantFolder != nil && variantFolder.IsDir() { - variantObjectFiles, err = builder_utils.CompileFiles(ctx, variantFolder, true, buildPath, buildProperties, includes) + variantObjectFiles, err = builder_utils.CompileFiles(ctx, variantFolder, true, buildPath, buildProperties, includes, coreModel) if err != nil { return nil, nil, errors.WithStack(err) } @@ -107,18 +124,18 @@ func compileCore(ctx *types.Context, buildPath *paths.Path, buildCachePath *path } } - coreObjectFiles, err := builder_utils.CompileFiles(ctx, coreFolder, true, buildPath, buildProperties, includes) + coreObjectFiles, err := builder_utils.CompileFiles(ctx, coreFolder, true, buildPath, buildProperties, includes, coreModel) if err != nil { return nil, nil, errors.WithStack(err) } - archiveFile, err := builder_utils.ArchiveCompiledFiles(ctx, buildPath, paths.New("core.a"), coreObjectFiles, buildProperties) + archiveFile, err := builder_utils.ArchiveCompiledFiles(ctx, buildPath, paths.New("core.a"), coreObjectFiles, buildProperties, coreModel) if err != nil { return nil, nil, errors.WithStack(err) } // archive core.a - if targetArchivedCore != nil && !ctx.OnlyUpdateCompilationDatabase { + if targetArchivedCore != nil && !ctx.OnlyUpdateCompilationDatabase && coreModel != nil { err := archiveFile.CopyTo(targetArchivedCore) if ctx.Verbose { if err == nil { diff --git a/legacy/builder/phases/libraries_builder.go b/legacy/builder/phases/libraries_builder.go index ba8529d865e..7146099539f 100644 --- a/legacy/builder/phases/libraries_builder.go +++ b/legacy/builder/phases/libraries_builder.go @@ -44,7 +44,7 @@ func (s *LibrariesBuilder) Run(ctx *types.Context) error { return errors.WithStack(err) } - objectFiles, err := compileLibraries(ctx, libs, librariesBuildPath, buildProperties, includes) + objectFiles, err := compileLibraries(ctx, libs, librariesBuildPath, buildProperties, includes, ctx.CodeModelBuilder, ctx.UnoptimizeLibraries) if err != nil { return errors.WithStack(err) } @@ -110,13 +110,29 @@ func findExpectedPrecompiledLibFolder(ctx *types.Context, library *libraries.Lib return nil } -func compileLibraries(ctx *types.Context, libraries libraries.List, buildPath *paths.Path, buildProperties *properties.Map, includes []string) (paths.PathList, error) { +func compileLibraries(ctx *types.Context, libraries libraries.List, buildPath *paths.Path, buildProperties *properties.Map, includes []string, codeModel *types.CodeModelBuilder, unoptimize bool) (paths.PathList, error) { + var unoptimizedProperties = builder_utils.RemoveOptimizationFromBuildProperties(buildProperties) ctx.Progress.AddSubSteps(len(libraries)) defer ctx.Progress.RemoveSubSteps() objectFiles := paths.NewPathList() for _, library := range libraries { - libraryObjectFiles, err := compileLibrary(ctx, library, buildPath, buildProperties, includes) + var libraryModel *types.CodeModelLibrary + if codeModel != nil { + libraryModel = new(types.CodeModelLibrary) + libraryModel.Name = library.Name + libraryModel.SourceDirectory = library.SourceDir.String() + codeModel.Libraries = append(codeModel.Libraries, libraryModel) + } + + var effectiveProperties = buildProperties + if unoptimize && library.Properties.Get("supports_unoptimized_builds") != "false" { + effectiveProperties = unoptimizedProperties + } + + effectiveProperties = builder_utils.ExpandSysprogsExtensionProperties(effectiveProperties, "lib") + + libraryObjectFiles, err := compileLibrary(ctx, library, buildPath, effectiveProperties, includes, libraryModel) if err != nil { return nil, errors.WithStack(err) } @@ -129,7 +145,7 @@ func compileLibraries(ctx *types.Context, libraries libraries.List, buildPath *p return objectFiles, nil } -func compileLibrary(ctx *types.Context, library *libraries.Library, buildPath *paths.Path, buildProperties *properties.Map, includes []string) (paths.PathList, error) { +func compileLibrary(ctx *types.Context, library *libraries.Library, buildPath *paths.Path, buildProperties *properties.Map, includes []string, libraryModel *types.CodeModelLibrary) (paths.PathList, error) { logger := ctx.GetLogger() if ctx.Verbose { logger.Println(constants.LOG_LEVEL_INFO, "Compiling library \"{0}\"", library.Name) @@ -189,12 +205,12 @@ func compileLibrary(ctx *types.Context, library *libraries.Library, buildPath *p } if library.Layout == libraries.RecursiveLayout { - libObjectFiles, err := builder_utils.CompileFilesRecursive(ctx, library.SourceDir, libraryBuildPath, buildProperties, includes) + libObjectFiles, err := builder_utils.CompileFilesRecursive(ctx, library.SourceDir, libraryBuildPath, buildProperties, includes, libraryModel) if err != nil { return nil, errors.WithStack(err) } if library.DotALinkage { - archiveFile, err := builder_utils.ArchiveCompiledFiles(ctx, libraryBuildPath, paths.New(library.Name+".a"), libObjectFiles, buildProperties) + archiveFile, err := builder_utils.ArchiveCompiledFiles(ctx, libraryBuildPath, paths.New(library.Name+".a"), libObjectFiles, buildProperties, libraryModel) if err != nil { return nil, errors.WithStack(err) } @@ -206,7 +222,7 @@ func compileLibrary(ctx *types.Context, library *libraries.Library, buildPath *p if library.UtilityDir != nil { includes = append(includes, utils.WrapWithHyphenI(library.UtilityDir.String())) } - libObjectFiles, err := builder_utils.CompileFiles(ctx, library.SourceDir, false, libraryBuildPath, buildProperties, includes) + libObjectFiles, err := builder_utils.CompileFiles(ctx, library.SourceDir, false, libraryBuildPath, buildProperties, includes, libraryModel) if err != nil { return nil, errors.WithStack(err) } @@ -214,7 +230,7 @@ func compileLibrary(ctx *types.Context, library *libraries.Library, buildPath *p if library.UtilityDir != nil { utilityBuildPath := libraryBuildPath.Join("utility") - utilityObjectFiles, err := builder_utils.CompileFiles(ctx, library.UtilityDir, false, utilityBuildPath, buildProperties, includes) + utilityObjectFiles, err := builder_utils.CompileFiles(ctx, library.UtilityDir, false, utilityBuildPath, buildProperties, includes, libraryModel) if err != nil { return nil, errors.WithStack(err) } diff --git a/legacy/builder/phases/linker.go b/legacy/builder/phases/linker.go index f42f431bfe9..79c4f83c79d 100644 --- a/legacy/builder/phases/linker.go +++ b/legacy/builder/phases/linker.go @@ -54,6 +54,15 @@ func (s *Linker) Run(ctx *types.Context) error { } buildProperties := ctx.BuildProperties + buildProperties = builder_utils.ExpandSysprogsLinkerProperties(buildProperties) + + if ctx.CodeModelBuilder != nil { + //Just compute the linker command line (even without the full object list), we are not actually linking and are only interested in the output file name + pattern := buildProperties.Get(constants.RECIPE_C_COMBINE_PATTERN) + commandLine := buildProperties.ExpandPropsInString(pattern) + ctx.CodeModelBuilder.LinkerCommandLine = commandLine + return nil + } err = link(ctx, objectFiles, coreDotARelPath, coreArchiveFilePath, buildProperties) if err != nil { diff --git a/legacy/builder/phases/sizer.go b/legacy/builder/phases/sizer.go index 482fb5aa35b..2e85cab0ceb 100644 --- a/legacy/builder/phases/sizer.go +++ b/legacy/builder/phases/sizer.go @@ -35,7 +35,7 @@ func (s *Sizer) Run(ctx *types.Context) error { if ctx.OnlyUpdateCompilationDatabase { return nil } - if s.SketchError { + if s.SketchError || ctx.CodeModelBuilder != nil { return nil } diff --git a/legacy/builder/phases/sketch_builder.go b/legacy/builder/phases/sketch_builder.go index 8fea0f129c0..4990dd5427b 100644 --- a/legacy/builder/phases/sketch_builder.go +++ b/legacy/builder/phases/sketch_builder.go @@ -26,14 +26,28 @@ type SketchBuilder struct{} func (s *SketchBuilder) Run(ctx *types.Context) error { sketchBuildPath := ctx.SketchBuildPath - buildProperties := ctx.BuildProperties + var buildProperties = ctx.BuildProperties includes := utils.Map(ctx.IncludeFolders.AsStrings(), utils.WrapWithHyphenI) if err := sketchBuildPath.MkdirAll(); err != nil { return errors.WithStack(err) } + + var sketchModel *types.CodeModelLibrary + if ctx.CodeModelBuilder != nil { + sketchModel = new(types.CodeModelLibrary) + ctx.CodeModelBuilder.Sketch = sketchModel + } else { + sketchModel = nil + } + + if ctx.UnoptimizeSketch { + buildProperties = builder_utils.RemoveOptimizationFromBuildProperties(buildProperties) + } + + buildProperties = builder_utils.ExpandSysprogsExtensionProperties(buildProperties, "sketch") - objectFiles, err := builder_utils.CompileFiles(ctx, sketchBuildPath, false, sketchBuildPath, buildProperties, includes) + objectFiles, err := builder_utils.CompileFiles(ctx, sketchBuildPath, false, sketchBuildPath, buildProperties, includes, sketchModel) if err != nil { return errors.WithStack(err) } @@ -41,7 +55,7 @@ func (s *SketchBuilder) Run(ctx *types.Context) error { // The "src/" subdirectory of a sketch is compiled recursively sketchSrcPath := sketchBuildPath.Join("src") if sketchSrcPath.IsDir() { - srcObjectFiles, err := builder_utils.CompileFiles(ctx, sketchSrcPath, true, sketchSrcPath, buildProperties, includes) + srcObjectFiles, err := builder_utils.CompileFiles(ctx, sketchSrcPath, true, sketchSrcPath, buildProperties, includes, sketchModel) if err != nil { return errors.WithStack(err) } diff --git a/legacy/builder/recipe_runner.go b/legacy/builder/recipe_runner.go index 9f04598d1e6..e4e19fa3df0 100644 --- a/legacy/builder/recipe_runner.go +++ b/legacy/builder/recipe_runner.go @@ -41,6 +41,12 @@ func (s *RecipeByPrefixSuffixRunner) Run(ctx *types.Context) error { buildProperties := ctx.BuildProperties.Clone() recipes := findRecipes(buildProperties, s.Prefix, s.Suffix) + + if ctx.CodeModelBuilder != nil { + if s.Prefix != constants.HOOKS_PREBUILD { + return nil + } + } properties := buildProperties.Clone() for _, recipe := range recipes { diff --git a/legacy/builder/types/CodeModelBuilder.go b/legacy/builder/types/CodeModelBuilder.go new file mode 100644 index 00000000000..bca854d78af --- /dev/null +++ b/legacy/builder/types/CodeModelBuilder.go @@ -0,0 +1,58 @@ +package types + +import ( + "github.com/arduino/arduino-cli/arduino/libraries" +) + +type CodeModelGCCInvocation struct { + GCC string + InputFile string + ObjectFile string + Arguments []string +} + +type CodeModelLibrary struct { + Name string + SourceDirectory string + ArchiveFile string + Invocations []*CodeModelGCCInvocation +} + +type KnownLibrary struct { + Folder string + SrcFolder string + UtilityFolder string + Layout libraries.LibraryLayout + Name string + RealName string + IsLegacy bool + Version string + Author string + Maintainer string + Sentence string + Paragraph string + URL string + Category string + License string +} + +type KnownHeader struct { + Name string + LibraryDirectories []string +} + +type KeyValuePair struct { + Key string + Value string +} + +type CodeModelBuilder struct { + Core *CodeModelLibrary + Sketch *CodeModelLibrary + Libraries []*CodeModelLibrary + KnownHeaders []*KnownHeader + Prototypes []*Prototype + KnownLibraries []*KnownLibrary + LinkerCommandLine string + BuildProperties []KeyValuePair +} diff --git a/legacy/builder/types/context.go b/legacy/builder/types/context.go index 079733db662..5fce46e9df6 100644 --- a/legacy/builder/types/context.go +++ b/legacy/builder/types/context.go @@ -132,6 +132,12 @@ type Context struct { PrototypesSection string PrototypesLineWhereToInsert int Prototypes []*Prototype + + CodeModelBuilder *CodeModelBuilder + CodeModelBuilderFile string + UnoptimizeSketch bool + UnoptimizeCore bool + UnoptimizeLibraries bool // Verbosity settings Verbose bool
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: