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