diff --git a/.licenses/go/github.com/arduino/go-paths-helper.dep.yml b/.licenses/go/github.com/arduino/go-paths-helper.dep.yml index 3fe9cd23dd5..a85b5285431 100644 --- a/.licenses/go/github.com/arduino/go-paths-helper.dep.yml +++ b/.licenses/go/github.com/arduino/go-paths-helper.dep.yml @@ -1,8 +1,8 @@ --- name: github.com/arduino/go-paths-helper -version: v1.6.1 +version: v1.7.0 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/arduino/go-paths-helper license: gpl-2.0-or-later licenses: diff --git a/arduino/discovery/discovery_client/go.sum b/arduino/discovery/discovery_client/go.sum index aeca4341bc0..daccd6d46d3 100644 --- a/arduino/discovery/discovery_client/go.sum +++ b/arduino/discovery/discovery_client/go.sum @@ -45,8 +45,8 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/arduino/board-discovery v0.0.0-20180823133458-1ba29327fb0c/go.mod h1:HK7SpkEax/3P+0w78iRQx1sz1vCDYYw9RXwHjQTB5i8= github.com/arduino/go-paths-helper v1.0.1/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck= github.com/arduino/go-paths-helper v1.2.0/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck= -github.com/arduino/go-paths-helper v1.6.1 h1:lha+/BuuBsx0qTZ3gy6IO1kU23lObWdQ/UItkzVWQ+0= -github.com/arduino/go-paths-helper v1.6.1/go.mod h1:V82BWgAAp4IbmlybxQdk9Bpkz8M4Qyx+RAFKaG9NuvU= +github.com/arduino/go-paths-helper v1.7.0 h1:S9l5BP2aogz1CgyqqnncXt0PLpK4yvwOW/wu/LaR3tc= +github.com/arduino/go-paths-helper v1.7.0/go.mod h1:V82BWgAAp4IbmlybxQdk9Bpkz8M4Qyx+RAFKaG9NuvU= github.com/arduino/go-properties-orderedmap v1.6.0 h1:gp2JoWRETtqwsZ+UHu/PBuYWYH2x2+d+uipDxS4WmvM= github.com/arduino/go-properties-orderedmap v1.6.0/go.mod h1:DKjD2VXY/NZmlingh4lSFMEYCVubfeArCsGPGDwb2yk= github.com/arduino/go-timeutils v0.0.0-20171220113728-d1dd9e313b1b/go.mod h1:uwGy5PpN4lqW97FiLnbcx+xx8jly5YuPMJWfVwwjJiQ= diff --git a/client_example/go.sum b/client_example/go.sum index c35a559380b..40867f1ad6d 100644 --- a/client_example/go.sum +++ b/client_example/go.sum @@ -45,7 +45,7 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/arduino/board-discovery v0.0.0-20180823133458-1ba29327fb0c/go.mod h1:HK7SpkEax/3P+0w78iRQx1sz1vCDYYw9RXwHjQTB5i8= github.com/arduino/go-paths-helper v1.0.1/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck= github.com/arduino/go-paths-helper v1.2.0/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck= -github.com/arduino/go-paths-helper v1.6.1/go.mod h1:V82BWgAAp4IbmlybxQdk9Bpkz8M4Qyx+RAFKaG9NuvU= +github.com/arduino/go-paths-helper v1.7.0/go.mod h1:V82BWgAAp4IbmlybxQdk9Bpkz8M4Qyx+RAFKaG9NuvU= github.com/arduino/go-properties-orderedmap v1.6.0/go.mod h1:DKjD2VXY/NZmlingh4lSFMEYCVubfeArCsGPGDwb2yk= github.com/arduino/go-timeutils v0.0.0-20171220113728-d1dd9e313b1b/go.mod h1:uwGy5PpN4lqW97FiLnbcx+xx8jly5YuPMJWfVwwjJiQ= github.com/arduino/go-win32-utils v0.0.0-20180330194947-ed041402e83b/go.mod h1:iIPnclBMYm1g32Q5kXoqng4jLhMStReIP7ZxaoUC2y8= diff --git a/docsgen/go.sum b/docsgen/go.sum index c7bc636df8d..7226e9660d5 100644 --- a/docsgen/go.sum +++ b/docsgen/go.sum @@ -48,8 +48,8 @@ github.com/arduino/board-discovery v0.0.0-20180823133458-1ba29327fb0c h1:agh2JT9 github.com/arduino/board-discovery v0.0.0-20180823133458-1ba29327fb0c/go.mod h1:HK7SpkEax/3P+0w78iRQx1sz1vCDYYw9RXwHjQTB5i8= github.com/arduino/go-paths-helper v1.0.1/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck= github.com/arduino/go-paths-helper v1.2.0/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck= -github.com/arduino/go-paths-helper v1.6.1 h1:lha+/BuuBsx0qTZ3gy6IO1kU23lObWdQ/UItkzVWQ+0= -github.com/arduino/go-paths-helper v1.6.1/go.mod h1:V82BWgAAp4IbmlybxQdk9Bpkz8M4Qyx+RAFKaG9NuvU= +github.com/arduino/go-paths-helper v1.7.0 h1:S9l5BP2aogz1CgyqqnncXt0PLpK4yvwOW/wu/LaR3tc= +github.com/arduino/go-paths-helper v1.7.0/go.mod h1:V82BWgAAp4IbmlybxQdk9Bpkz8M4Qyx+RAFKaG9NuvU= github.com/arduino/go-properties-orderedmap v1.6.0 h1:gp2JoWRETtqwsZ+UHu/PBuYWYH2x2+d+uipDxS4WmvM= github.com/arduino/go-properties-orderedmap v1.6.0/go.mod h1:DKjD2VXY/NZmlingh4lSFMEYCVubfeArCsGPGDwb2yk= github.com/arduino/go-timeutils v0.0.0-20171220113728-d1dd9e313b1b h1:9hDi4F2st6dbLC3y4i02zFT5quS4X6iioWifGlVwfy4= diff --git a/go.mod b/go.mod index b6c856494f0..5ec202d67b7 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.16 require ( github.com/arduino/board-discovery v0.0.0-20180823133458-1ba29327fb0c - github.com/arduino/go-paths-helper v1.6.1 + github.com/arduino/go-paths-helper v1.7.0 github.com/arduino/go-properties-orderedmap v1.6.0 github.com/arduino/go-timeutils v0.0.0-20171220113728-d1dd9e313b1b github.com/arduino/go-win32-utils v0.0.0-20180330194947-ed041402e83b diff --git a/go.sum b/go.sum index c7bc636df8d..7226e9660d5 100644 --- a/go.sum +++ b/go.sum @@ -48,8 +48,8 @@ github.com/arduino/board-discovery v0.0.0-20180823133458-1ba29327fb0c h1:agh2JT9 github.com/arduino/board-discovery v0.0.0-20180823133458-1ba29327fb0c/go.mod h1:HK7SpkEax/3P+0w78iRQx1sz1vCDYYw9RXwHjQTB5i8= github.com/arduino/go-paths-helper v1.0.1/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck= github.com/arduino/go-paths-helper v1.2.0/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck= -github.com/arduino/go-paths-helper v1.6.1 h1:lha+/BuuBsx0qTZ3gy6IO1kU23lObWdQ/UItkzVWQ+0= -github.com/arduino/go-paths-helper v1.6.1/go.mod h1:V82BWgAAp4IbmlybxQdk9Bpkz8M4Qyx+RAFKaG9NuvU= +github.com/arduino/go-paths-helper v1.7.0 h1:S9l5BP2aogz1CgyqqnncXt0PLpK4yvwOW/wu/LaR3tc= +github.com/arduino/go-paths-helper v1.7.0/go.mod h1:V82BWgAAp4IbmlybxQdk9Bpkz8M4Qyx+RAFKaG9NuvU= github.com/arduino/go-properties-orderedmap v1.6.0 h1:gp2JoWRETtqwsZ+UHu/PBuYWYH2x2+d+uipDxS4WmvM= github.com/arduino/go-properties-orderedmap v1.6.0/go.mod h1:DKjD2VXY/NZmlingh4lSFMEYCVubfeArCsGPGDwb2yk= github.com/arduino/go-timeutils v0.0.0-20171220113728-d1dd9e313b1b h1:9hDi4F2st6dbLC3y4i02zFT5quS4X6iioWifGlVwfy4= diff --git a/legacy/builder/builder.go b/legacy/builder/builder.go index 10588b341f0..7bf8b81926c 100644 --- a/legacy/builder/builder.go +++ b/legacy/builder/builder.go @@ -30,10 +30,6 @@ import ( var tr = i18n.Tr -var MAIN_FILE_VALID_EXTENSIONS = map[string]bool{".ino": true, ".pde": true} -var ADDITIONAL_FILE_VALID_EXTENSIONS = map[string]bool{".h": true, ".c": true, ".hpp": true, ".hh": true, ".cpp": true, ".S": true} -var ADDITIONAL_FILE_VALID_EXTENSIONS_NO_HEADERS = map[string]bool{".c": true, ".cpp": true, ".S": true} - const DEFAULT_DEBUG_LEVEL = 5 const DEFAULT_WARNINGS_LEVEL = "none" const DEFAULT_SOFTWARE = "ARDUINO" diff --git a/legacy/builder/builder_utils/utils.go b/legacy/builder/builder_utils/utils.go index 05634f796da..27ee64d7e6e 100644 --- a/legacy/builder/builder_utils/utils.go +++ b/legacy/builder/builder_utils/utils.go @@ -16,6 +16,7 @@ package builder_utils import ( + "fmt" "os" "os/exec" "path/filepath" @@ -23,6 +24,7 @@ import ( "strings" "sync" + "github.com/arduino/arduino-cli/arduino/globals" "github.com/arduino/arduino-cli/i18n" "github.com/arduino/arduino-cli/legacy/builder/constants" "github.com/arduino/arduino-cli/legacy/builder/types" @@ -35,93 +37,6 @@ import ( var tr = i18n.Tr -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) - if err != nil { - return nil, errors.WithStack(err) - } - - folders, err := utils.ReadDirFiltered(sourcePath.String(), utils.FilterDirs) - if err != nil { - return nil, errors.WithStack(err) - } - - for _, folder := range folders { - subFolderObjectFiles, err := CompileFilesRecursive(ctx, sourcePath.Join(folder.Name()), buildPath.Join(folder.Name()), buildProperties, includes) - if err != nil { - return nil, errors.WithStack(err) - } - objectFiles.AddAll(subFolderObjectFiles) - } - - return objectFiles, nil -} - -func CompileFiles(ctx *types.Context, sourcePath *paths.Path, recurse bool, buildPath *paths.Path, buildProperties *properties.Map, includes []string) (paths.PathList, error) { - sSources, err := findFilesInFolder(sourcePath, ".S", recurse) - if err != nil { - return nil, errors.WithStack(err) - } - cSources, err := findFilesInFolder(sourcePath, ".c", recurse) - if err != nil { - return nil, errors.WithStack(err) - } - cppSources, err := findFilesInFolder(sourcePath, ".cpp", recurse) - if err != nil { - return nil, errors.WithStack(err) - } - - 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) - if err != nil { - return nil, errors.WithStack(err) - } - cObjectFiles, err := compileFilesWithRecipe(ctx, sourcePath, cSources, buildPath, buildProperties, includes, constants.RECIPE_C_PATTERN) - if err != nil { - return nil, errors.WithStack(err) - } - cppObjectFiles, err := compileFilesWithRecipe(ctx, sourcePath, cppSources, buildPath, buildProperties, includes, constants.RECIPE_CPP_PATTERN) - if err != nil { - return nil, errors.WithStack(err) - } - - objectFiles := paths.NewPathList() - objectFiles.AddAll(sObjectFiles) - objectFiles.AddAll(cObjectFiles) - objectFiles.AddAll(cppObjectFiles) - return objectFiles, nil -} - -func findFilesInFolder(sourcePath *paths.Path, extension string, recurse bool) (paths.PathList, error) { - files, err := utils.ReadDirFiltered(sourcePath.String(), utils.FilterFilesWithExtensions(extension)) - if err != nil { - return nil, errors.WithStack(err) - } - var sources paths.PathList - for _, file := range files { - sources = append(sources, sourcePath.Join(file.Name())) - } - - if recurse { - folders, err := utils.ReadDirFiltered(sourcePath.String(), utils.FilterDirs) - if err != nil { - return nil, errors.WithStack(err) - } - - for _, folder := range folders { - otherSources, err := findFilesInFolder(sourcePath.Join(folder.Name()), extension, recurse) - if err != nil { - return nil, errors.WithStack(err) - } - sources = append(sources, otherSources...) - } - } - - return sources, nil -} - func findAllFilesInFolder(sourcePath string, recurse bool) ([]string, error) { files, err := utils.ReadDirFiltered(sourcePath, utils.FilterFiles()) if err != nil { @@ -153,17 +68,46 @@ 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 CompileFiles(ctx *types.Context, sourcePath *paths.Path, buildPath *paths.Path, buildProperties *properties.Map, includes []string) (paths.PathList, error) { + return compileFiles(ctx, sourcePath, false, buildPath, buildProperties, includes) +} + +func CompileFilesRecursive(ctx *types.Context, sourcePath *paths.Path, buildPath *paths.Path, buildProperties *properties.Map, includes []string) (paths.PathList, error) { + return compileFiles(ctx, sourcePath, true, buildPath, buildProperties, includes) +} + +func compileFiles(ctx *types.Context, sourcePath *paths.Path, recurse bool, buildPath *paths.Path, buildProperties *properties.Map, includes []string) (paths.PathList, error) { + var sources paths.PathList + var err error + if recurse { + sources, err = sourcePath.ReadDirRecursive() + } else { + sources, err = sourcePath.ReadDir() + } + if err != nil { + return nil, err + } + + validExtensions := []string{} + for ext := range globals.SourceFilesValidExtensions { + validExtensions = append(validExtensions, ext) + } + + sources.FilterSuffix(validExtensions...) + ctx.Progress.AddSubSteps(len(sources)) + defer ctx.Progress.RemoveSubSteps() + objectFiles := paths.NewPathList() + var objectFilesMux sync.Mutex if len(sources) == 0 { return objectFiles, nil } - var objectFilesMux sync.Mutex var errorsList []error var errorsMux sync.Mutex queue := make(chan *paths.Path) job := func(source *paths.Path) { + recipe := fmt.Sprintf("recipe%s.o.pattern", source.Ext()) objectFile, err := compileFileWithRecipe(ctx, sourcePath, source, buildPath, buildProperties, includes, recipe) if err != nil { errorsMux.Lock() @@ -233,7 +177,7 @@ func compileFileWithRecipe(ctx *types.Context, sourcePath *paths.Path, source *p return nil, errors.WithStack(err) } - objIsUpToDate, err := ObjFileIsUpToDate(ctx, source, objectFile, depsFile) + objIsUpToDate, err := ObjFileIsUpToDate(source, objectFile, depsFile) if err != nil { return nil, errors.WithStack(err) } @@ -260,7 +204,7 @@ func compileFileWithRecipe(ctx *types.Context, sourcePath *paths.Path, source *p return objectFile, nil } -func ObjFileIsUpToDate(ctx *types.Context, sourceFile, objectFile, dependencyFile *paths.Path) (bool, error) { +func ObjFileIsUpToDate(sourceFile, objectFile, dependencyFile *paths.Path) (bool, error) { logrus.Debugf("Checking previous results for %v (result = %v, dep = %v)", sourceFile, objectFile, dependencyFile) if objectFile == nil || dependencyFile == nil { logrus.Debugf("Not found: nil") @@ -371,10 +315,7 @@ func unescapeDep(s string) string { } func removeEndingBackSlash(s string) string { - if strings.HasSuffix(s, "\\") { - s = s[:len(s)-1] - } - return s + return strings.TrimSuffix(s, "\\") } func nonEmptyString(s string) bool { diff --git a/legacy/builder/constants/constants.go b/legacy/builder/constants/constants.go index 464bdc46937..e1266930fe3 100644 --- a/legacy/builder/constants/constants.go +++ b/legacy/builder/constants/constants.go @@ -66,10 +66,7 @@ const PLATFORM_URL = "url" const PLATFORM_VERSION = "version" const RECIPE_AR_PATTERN = "recipe.ar.pattern" const RECIPE_C_COMBINE_PATTERN = "recipe.c.combine.pattern" -const RECIPE_C_PATTERN = "recipe.c.o.pattern" -const RECIPE_CPP_PATTERN = "recipe.cpp.o.pattern" const RECIPE_PREPROC_MACROS = "recipe.preproc.macros" -const RECIPE_S_PATTERN = "recipe.S.o.pattern" const REWRITING_DISABLED = "disabled" const REWRITING = "rewriting" const SPACE = " " diff --git a/legacy/builder/container_find_includes.go b/legacy/builder/container_find_includes.go index c8c5325eac9..6ddfbab48ff 100644 --- a/legacy/builder/container_find_includes.go +++ b/legacy/builder/container_find_includes.go @@ -98,6 +98,7 @@ import ( "os/exec" "time" + "github.com/arduino/arduino-cli/arduino/globals" "github.com/arduino/arduino-cli/arduino/libraries" "github.com/arduino/arduino-cli/legacy/builder/builder_utils" "github.com/arduino/arduino-cli/legacy/builder/types" @@ -312,7 +313,7 @@ func findIncludesUntilDone(ctx *types.Context, cache *includeCache, sourceFile t // TODO: This reads the dependency file, but the actual building // does it again. Should the result be somehow cached? Perhaps // remove the object file if it is found to be stale? - unchanged, err := builder_utils.ObjFileIsUpToDate(ctx, sourcePath, objPath, depPath) + unchanged, err := builder_utils.ObjFileIsUpToDate(sourcePath, objPath, depPath) if err != nil { return errors.WithStack(err) } @@ -406,16 +407,17 @@ func findIncludesUntilDone(ctx *types.Context, cache *includeCache, sourceFile t } func queueSourceFilesFromFolder(ctx *types.Context, queue *types.UniqueSourceFileQueue, origin interface{}, folder *paths.Path, recurse bool) error { - extensions := func(ext string) bool { return ADDITIONAL_FILE_VALID_EXTENSIONS_NO_HEADERS[ext] } - - filePaths := []string{} - err := utils.FindFilesInFolder(&filePaths, folder.String(), extensions, recurse) + sourceFileExtensions := []string{} + for k := range globals.SourceFilesValidExtensions { + sourceFileExtensions = append(sourceFileExtensions, k) + } + filePaths, err := utils.FindFilesInFolder(folder, recurse, sourceFileExtensions) if err != nil { return errors.WithStack(err) } for _, filePath := range filePaths { - sourceFile, err := types.MakeSourceFile(ctx, origin, paths.New(filePath)) + sourceFile, err := types.MakeSourceFile(ctx, origin, filePath) if err != nil { return errors.WithStack(err) } diff --git a/legacy/builder/create_cmake_rule.go b/legacy/builder/create_cmake_rule.go index 87b1be674d1..7e689c6f943 100644 --- a/legacy/builder/create_cmake_rule.go +++ b/legacy/builder/create_cmake_rule.go @@ -17,30 +17,38 @@ package builder import ( "fmt" - "io/ioutil" - "os" "path/filepath" "regexp" "strings" properties "github.com/arduino/go-properties-orderedmap" + "github.com/arduino/arduino-cli/arduino/globals" "github.com/arduino/arduino-cli/legacy/builder/builder_utils" "github.com/arduino/arduino-cli/legacy/builder/constants" "github.com/arduino/arduino-cli/legacy/builder/types" "github.com/arduino/arduino-cli/legacy/builder/utils" ) -var VALID_EXPORT_EXTENSIONS = map[string]bool{".h": true, ".c": true, ".hpp": true, ".hh": true, ".cpp": true, ".S": true, ".a": true, ".properties": true} -var DOTHEXTENSION = map[string]bool{".h": true, ".hh": true, ".hpp": true} -var DOTAEXTENSION = map[string]bool{".a": true} - type ExportProjectCMake struct { // Was there an error while compiling the sketch? SketchError bool } +var lineMatcher = regexp.MustCompile(`^#line\s\d+\s"`) + func (s *ExportProjectCMake) Run(ctx *types.Context) error { + var validExportExtensions = []string{".a", ".properties"} + for ext := range globals.SourceFilesValidExtensions { + validExportExtensions = append(validExportExtensions, ext) + } + var validHeaderExtensions = []string{} + for ext := range globals.HeaderFilesValidExtensions { + validExportExtensions = append(validExportExtensions, ext) + validHeaderExtensions = append(validHeaderExtensions, ext) + } + var validStaticLibExtensions = []string{".a"} + if s.SketchError || !canExportCmakeProject(ctx) { return nil } @@ -63,13 +71,11 @@ func (s *ExportProjectCMake) Run(ctx *types.Context) error { cmakeFile := cmakeFolder.Join("CMakeLists.txt") dynamicLibsFromPkgConfig := map[string]bool{} - extensions := func(ext string) bool { return VALID_EXPORT_EXTENSIONS[ext] } - staticLibsExtensions := func(ext string) bool { return DOTAEXTENSION[ext] } for _, library := range ctx.ImportedLibraries { // Copy used libraries in the correct folder libDir := libBaseFolder.Join(library.Name) mcu := ctx.BuildProperties.Get(constants.BUILD_PROPERTIES_BUILD_MCU) - utils.CopyDir(library.InstallDir.String(), libDir.String(), extensions) + utils.CopyDir(library.InstallDir.String(), libDir.String(), validExportExtensions) // Read cmake options if available isStaticLib := true @@ -89,22 +95,21 @@ func (s *ExportProjectCMake) Run(ctx *types.Context) error { } // Remove stray folders contining incompatible or not needed libraries archives - var files []string - utils.FindFilesInFolder(&files, libDir.Join("src").String(), staticLibsExtensions, true) + files, _ := utils.FindFilesInFolder(libDir.Join("src"), true, validStaticLibExtensions) for _, file := range files { - staticLibDir := filepath.Dir(file) - if !isStaticLib || !strings.Contains(staticLibDir, mcu) { - os.RemoveAll(staticLibDir) + staticLibDir := file.Parent() + if !isStaticLib || !strings.Contains(staticLibDir.String(), mcu) { + staticLibDir.RemoveAll() } } } // Copy core + variant in use + preprocessed sketch in the correct folders - err := utils.CopyDir(ctx.BuildProperties.Get("build.core.path"), coreFolder.String(), extensions) + err := utils.CopyDir(ctx.BuildProperties.Get("build.core.path"), coreFolder.String(), validExportExtensions) if err != nil { fmt.Println(err) } - err = utils.CopyDir(ctx.BuildProperties.Get("build.variant.path"), coreFolder.Join("variant").String(), extensions) + err = utils.CopyDir(ctx.BuildProperties.Get("build.variant.path"), coreFolder.Join("variant").String(), validExportExtensions) if err != nil { fmt.Println(err) } @@ -120,17 +125,16 @@ func (s *ExportProjectCMake) Run(ctx *types.Context) error { command.Run(ctx) } - err = utils.CopyDir(ctx.SketchBuildPath.String(), cmakeFolder.Join("sketch").String(), extensions) + err = utils.CopyDir(ctx.SketchBuildPath.String(), cmakeFolder.Join("sketch").String(), validExportExtensions) if err != nil { fmt.Println(err) } // remove "#line 1 ..." from exported c_make folder sketch - var sketchFiles []string - utils.FindFilesInFolder(&sketchFiles, cmakeFolder.Join("sketch").String(), extensions, false) + sketchFiles, _ := utils.FindFilesInFolder(cmakeFolder.Join("sketch"), false, validExportExtensions) for _, file := range sketchFiles { - input, err := ioutil.ReadFile(file) + input, err := file.ReadFile() if err != nil { fmt.Println(err) continue @@ -139,12 +143,12 @@ func (s *ExportProjectCMake) Run(ctx *types.Context) error { lines := strings.Split(string(input), "\n") for i, line := range lines { - if lineToRemove, _ := regexp.MatchString(`^#line\s\d+\s"`, line); lineToRemove == true { + if lineMatcher.MatchString(line) { lines[i] = "" } } output := strings.Join(lines, "\n") - err = ioutil.WriteFile(file, []byte(output), 0644) + err = file.WriteFile([]byte(output)) if err != nil { fmt.Println(err) } @@ -157,18 +161,15 @@ func (s *ExportProjectCMake) Run(ctx *types.Context) error { var linkDirectories []string extractCompileFlags(ctx, constants.RECIPE_C_COMBINE_PATTERN, &defines, &dynamicLibsFromGccMinusL, &linkerflags, &linkDirectories) - extractCompileFlags(ctx, constants.RECIPE_C_PATTERN, &defines, &dynamicLibsFromGccMinusL, &linkerflags, &linkDirectories) - extractCompileFlags(ctx, constants.RECIPE_CPP_PATTERN, &defines, &dynamicLibsFromGccMinusL, &linkerflags, &linkDirectories) + extractCompileFlags(ctx, "recipe.c.o.pattern", &defines, &dynamicLibsFromGccMinusL, &linkerflags, &linkDirectories) + extractCompileFlags(ctx, "recipe.cpp.o.pattern", &defines, &dynamicLibsFromGccMinusL, &linkerflags, &linkDirectories) // Extract folders with .h in them for adding in include list - var headerFiles []string - isHeader := func(ext string) bool { return DOTHEXTENSION[ext] } - utils.FindFilesInFolder(&headerFiles, cmakeFolder.String(), isHeader, true) - foldersContainingDotH := findUniqueFoldersRelative(headerFiles, cmakeFolder.String()) + headerFiles, _ := utils.FindFilesInFolder(cmakeFolder, true, validHeaderExtensions) + foldersContainingHeaders := findUniqueFoldersRelative(headerFiles.AsStrings(), cmakeFolder.String()) // Extract folders with .a in them for adding in static libs paths list - var staticLibs []string - utils.FindFilesInFolder(&staticLibs, cmakeFolder.String(), staticLibsExtensions, true) + staticLibs, _ := utils.FindFilesInFolder(cmakeFolder, true, validStaticLibExtensions) // Generate the CMakeLists global file @@ -178,7 +179,7 @@ func (s *ExportProjectCMake) Run(ctx *types.Context) error { cmakelist += "INCLUDE(FindPkgConfig)\n" cmakelist += "project (" + projectName + " C CXX)\n" cmakelist += "add_definitions (" + strings.Join(defines, " ") + " " + strings.Join(linkerflags, " ") + ")\n" - cmakelist += "include_directories (" + foldersContainingDotH + ")\n" + cmakelist += "include_directories (" + foldersContainingHeaders + ")\n" // Make link directories relative // We can totally discard them since they mostly are outside the core folder @@ -208,13 +209,13 @@ func (s *ExportProjectCMake) Run(ctx *types.Context) error { cmakelist += "link_directories (" + strings.Join(relLinkDirectories, " ") + " ${EXTRA_LIBS_DIRS})\n" for _, staticLib := range staticLibs { // Static libraries are fully configured - lib := filepath.Base(staticLib) + lib := staticLib.Base() lib = strings.TrimPrefix(lib, "lib") lib = strings.TrimSuffix(lib, ".a") if !utils.SliceContains(dynamicLibsFromGccMinusL, lib) { linkGroup += " " + lib cmakelist += "add_library (" + lib + " STATIC IMPORTED)\n" - location := strings.TrimPrefix(staticLib, cmakeFolder.String()) + location := strings.TrimPrefix(staticLib.String(), cmakeFolder.String()) cmakelist += "set_property(TARGET " + lib + " PROPERTY IMPORTED_LOCATION " + "${PROJECT_SOURCE_DIR}" + location + " )\n" } } diff --git a/legacy/builder/ctags/ctags_has_issues.go b/legacy/builder/ctags/ctags_has_issues.go index 57819279a44..7cc693f2af6 100644 --- a/legacy/builder/ctags/ctags_has_issues.go +++ b/legacy/builder/ctags/ctags_has_issues.go @@ -26,7 +26,7 @@ import ( func (p *CTagsParser) FixCLinkageTagsDeclarations(tags []*types.CTag) { linesMap := p.FindCLinkageLines(tags) - for i, _ := range tags { + for i := range tags { if sliceContainsInt(linesMap[tags[i].Filename], tags[i].Line) && !strings.Contains(tags[i].PrototypeModifiers, EXTERN) { @@ -51,7 +51,7 @@ func (p *CTagsParser) prototypeAndCodeDontMatch(tag *types.CTag) bool { code := removeSpacesAndTabs(tag.Code) - if strings.Index(code, ")") == -1 { + if !strings.Contains(code, ")") { // Add to code non-whitespace non-comments tokens until we find a closing round bracket file, err := os.Open(tag.Filename) if err == nil { @@ -70,7 +70,7 @@ func (p *CTagsParser) prototypeAndCodeDontMatch(tag *types.CTag) bool { temp := "" code, multilinecomment = removeComments(scanner.Text(), multilinecomment) - for scanner.Scan() && line < (tag.Line+10) && strings.Index(temp, ")") == -1 { + for scanner.Scan() && line < (tag.Line+10) && !strings.Contains(temp, ")") { temp, multilinecomment = removeComments(scanner.Text(), multilinecomment) code += temp } @@ -189,13 +189,13 @@ func getFunctionProtoWithNPreviousCharacters(tag *types.CTag, code string, n int func removeComments(text string, multilinecomment bool) (string, bool) { // Remove C++ style comments - if strings.Index(text, "//") != -1 { + if strings.Contains(text, "//") { text = text[0:strings.Index(text, "//")] } // Remove C style comments - if strings.Index(text, "*/") != -1 { - if strings.Index(text, "/*") != -1 { + if strings.Contains(text, "*/") { + if strings.Contains(text, "/*") { // C style comments on the same line text = text[0:strings.Index(text, "/*")] + text[strings.Index(text, "*/")+1:len(text)-1] } else { @@ -205,7 +205,7 @@ func removeComments(text string, multilinecomment bool) (string, bool) { } if multilinecomment { - if strings.Index(text, "/*") != -1 { + if strings.Contains(text, "/*") { text = text[0:strings.Index(text, "/*")] multilinecomment = false } else { @@ -267,7 +267,7 @@ func (p *CTagsParser) FindCLinkageLines(tags []*types.CTag) map[string][]int { } // check if we are on the first non empty line after externCDecl in case 3 - if enteringScope == true { + if enteringScope { enteringScope = false } @@ -279,13 +279,13 @@ func (p *CTagsParser) FindCLinkageLines(tags []*types.CTag) map[string][]int { enteringScope = true } } - if inScope == true { + if inScope { lines[tag.Filename] = append(lines[tag.Filename], line) } indentLevels += strings.Count(str, "{") - strings.Count(str, "}") // Bail out if indentLevel is zero and we are not in case 3 - if indentLevels == 0 && enteringScope == false { + if indentLevels == 0 && !enteringScope { inScope = false } } diff --git a/legacy/builder/ctags/ctags_parser.go b/legacy/builder/ctags/ctags_parser.go index 97a2a2a5ee1..4ced464ae1e 100644 --- a/legacy/builder/ctags/ctags_parser.go +++ b/legacy/builder/ctags/ctags_parser.go @@ -90,7 +90,7 @@ func addPrototype(tag *types.CTag) { } tag.PrototypeModifiers = "" - if strings.Index(tag.Code, STATIC+" ") != -1 { + if strings.Contains(tag.Code, STATIC+" ") { tag.PrototypeModifiers = tag.PrototypeModifiers + " " + STATIC } @@ -121,7 +121,7 @@ func (p *CTagsParser) skipDuplicates() { definedPrototypes := make(map[string]bool) for _, tag := range p.tags { - if !definedPrototypes[tag.Prototype] && tag.SkipMe == false { + if !definedPrototypes[tag.Prototype] && !tag.SkipMe { definedPrototypes[tag.Prototype] = true } else { tag.SkipMe = true diff --git a/legacy/builder/ctags/ctags_to_prototypes.go b/legacy/builder/ctags/ctags_to_prototypes.go index d0a24695b8a..dea077ff0aa 100644 --- a/legacy/builder/ctags/ctags_to_prototypes.go +++ b/legacy/builder/ctags/ctags_to_prototypes.go @@ -55,10 +55,10 @@ func (p *CTagsParser) firstFunctionPointerUsedAsArgument() int { func functionNameUsedAsFunctionPointerIn(tag *types.CTag, functionTags []*types.CTag) bool { for _, functionTag := range functionTags { - if tag.Line != functionTag.Line && strings.Index(tag.Code, "&"+functionTag.FunctionName) != -1 { + if tag.Line != functionTag.Line && strings.Contains(tag.Code, "&"+functionTag.FunctionName) { return true } - if tag.Line != functionTag.Line && strings.Index(strings.TrimSpace(tag.Code), "("+functionTag.FunctionName+")") != -1 { + if tag.Line != functionTag.Line && strings.Contains(tag.Code, "("+functionTag.FunctionName+")") { return true } } diff --git a/legacy/builder/filter_sketch_source.go b/legacy/builder/filter_sketch_source.go index 38649845aea..507615a55b2 100644 --- a/legacy/builder/filter_sketch_source.go +++ b/legacy/builder/filter_sketch_source.go @@ -34,9 +34,7 @@ type FilterSketchSource struct { func (s *FilterSketchSource) Run(ctx *types.Context) error { fileNames := paths.NewPathList() fileNames.Add(ctx.Sketch.MainFile) - for _, file := range ctx.Sketch.OtherSketchFiles { - fileNames = append(fileNames, file) - } + fileNames.AddAll(ctx.Sketch.OtherSketchFiles) inSketch := false filtered := "" diff --git a/legacy/builder/gcc_preproc_runner.go b/legacy/builder/gcc_preproc_runner.go index 45507d34e17..5066cd6f1f0 100644 --- a/legacy/builder/gcc_preproc_runner.go +++ b/legacy/builder/gcc_preproc_runner.go @@ -66,7 +66,7 @@ func prepareGCCPreprocRecipeProperties(ctx *types.Context, sourceFilePath *paths if properties.Get(constants.RECIPE_PREPROC_MACROS) == "" { //generate PREPROC_MACROS from RECIPE_CPP_PATTERN - properties.Set(constants.RECIPE_PREPROC_MACROS, GeneratePreprocPatternFromCompile(properties.Get(constants.RECIPE_CPP_PATTERN))) + properties.Set(constants.RECIPE_PREPROC_MACROS, GeneratePreprocPatternFromCompile(properties.Get("recipe.cpp.o.pattern"))) } cmd, err := builder_utils.PrepareCommandForRecipe(properties, constants.RECIPE_PREPROC_MACROS, true, ctx.PackageManager.GetEnvVarsForSpawnedProcess()) diff --git a/legacy/builder/includes_finder_with_regexp.go b/legacy/builder/includes_finder_with_regexp.go index 0ad876a26e3..03017c67048 100644 --- a/legacy/builder/includes_finder_with_regexp.go +++ b/legacy/builder/includes_finder_with_regexp.go @@ -34,7 +34,7 @@ func findIncludeForOldCompilers(source string) string { lines := strings.Split(source, "\n") for _, line := range lines { splittedLine := strings.Split(line, ":") - for i, _ := range splittedLine { + for i := range splittedLine { if strings.Contains(splittedLine[i], "fatal error") { return strings.TrimSpace(splittedLine[i+1]) } diff --git a/legacy/builder/phases/core_builder.go b/legacy/builder/phases/core_builder.go index c1c8a2fb63c..76cb731062c 100644 --- a/legacy/builder/phases/core_builder.go +++ b/legacy/builder/phases/core_builder.go @@ -81,7 +81,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.CompileFilesRecursive(ctx, variantFolder, buildPath, buildProperties, includes) if err != nil { return nil, nil, errors.WithStack(err) } @@ -108,7 +108,7 @@ 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.CompileFilesRecursive(ctx, coreFolder, buildPath, buildProperties, includes) if err != nil { return nil, nil, errors.WithStack(err) } diff --git a/legacy/builder/phases/libraries_builder.go b/legacy/builder/phases/libraries_builder.go index 84ce972c4de..2a01ff60f3b 100644 --- a/legacy/builder/phases/libraries_builder.go +++ b/legacy/builder/phases/libraries_builder.go @@ -65,7 +65,7 @@ func findExpectedPrecompiledLibFolder(ctx *types.Context, library *libraries.Lib // Add fpu specifications if they exist // To do so, resolve recipe.cpp.o.pattern, // search for -mfpu=xxx -mfloat-abi=yyy and add to a subfolder - command, _ := builder_utils.PrepareCommandForRecipe(ctx.BuildProperties, constants.RECIPE_CPP_PATTERN, true, ctx.PackageManager.GetEnvVarsForSpawnedProcess()) + command, _ := builder_utils.PrepareCommandForRecipe(ctx.BuildProperties, "recipe.cpp.o.pattern", true, ctx.PackageManager.GetEnvVarsForSpawnedProcess()) fpuSpecs := "" for _, el := range strings.Split(command.String(), " ") { if strings.Contains(el, FPU_CFLAG) { @@ -201,7 +201,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, libraryBuildPath, buildProperties, includes) if err != nil { return nil, errors.WithStack(err) } @@ -209,7 +209,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, utilityBuildPath, buildProperties, includes) if err != nil { return nil, errors.WithStack(err) } diff --git a/legacy/builder/phases/sketch_builder.go b/legacy/builder/phases/sketch_builder.go index 8fea0f129c0..d60f8ab9a0c 100644 --- a/legacy/builder/phases/sketch_builder.go +++ b/legacy/builder/phases/sketch_builder.go @@ -33,7 +33,7 @@ func (s *SketchBuilder) Run(ctx *types.Context) error { return errors.WithStack(err) } - objectFiles, err := builder_utils.CompileFiles(ctx, sketchBuildPath, false, sketchBuildPath, buildProperties, includes) + objectFiles, err := builder_utils.CompileFiles(ctx, sketchBuildPath, sketchBuildPath, buildProperties, includes) if err != nil { return errors.WithStack(err) } @@ -41,7 +41,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.CompileFilesRecursive(ctx, sketchSrcPath, sketchSrcPath, buildProperties, includes) if err != nil { return errors.WithStack(err) } diff --git a/legacy/builder/test/builder_test.go b/legacy/builder/test/builder_test.go index 31570f21277..8fd13f9509b 100644 --- a/legacy/builder/test/builder_test.go +++ b/legacy/builder/test/builder_test.go @@ -22,6 +22,7 @@ import ( "time" "github.com/arduino/go-paths-helper" + "github.com/sirupsen/logrus" "github.com/arduino/arduino-cli/legacy/builder" "github.com/arduino/arduino-cli/legacy/builder/constants" @@ -306,6 +307,7 @@ func TestBuilderSketchWithOldLib(t *testing.T) { func TestBuilderSketchWithSubfolders(t *testing.T) { DownloadCoresAndToolsAndLibraries(t) + logrus.SetLevel(logrus.DebugLevel) ctx := prepareBuilderTestContext(t, paths.New("sketch_with_subfolders", "sketch_with_subfolders.ino"), "arduino:avr:uno") buildPath := SetupBuildPath(t, ctx) diff --git a/legacy/builder/test/builder_utils_test.go b/legacy/builder/test/builder_utils_test.go index db10abf4b93..d3c8e5a360e 100644 --- a/legacy/builder/test/builder_utils_test.go +++ b/legacy/builder/test/builder_utils_test.go @@ -21,7 +21,6 @@ import ( "time" "github.com/arduino/arduino-cli/legacy/builder/builder_utils" - "github.com/arduino/arduino-cli/legacy/builder/types" paths "github.com/arduino/go-paths-helper" "github.com/stretchr/testify/require" ) @@ -40,33 +39,27 @@ func tempFile(t *testing.T, prefix string) *paths.Path { } func TestObjFileIsUpToDateObjMissing(t *testing.T) { - ctx := &types.Context{} - sourceFile := tempFile(t, "source") defer sourceFile.RemoveAll() - upToDate, err := builder_utils.ObjFileIsUpToDate(ctx, sourceFile, nil, nil) + upToDate, err := builder_utils.ObjFileIsUpToDate(sourceFile, nil, nil) NoError(t, err) require.False(t, upToDate) } func TestObjFileIsUpToDateDepMissing(t *testing.T) { - ctx := &types.Context{} - sourceFile := tempFile(t, "source") defer sourceFile.RemoveAll() objFile := tempFile(t, "obj") defer objFile.RemoveAll() - upToDate, err := builder_utils.ObjFileIsUpToDate(ctx, sourceFile, objFile, nil) + upToDate, err := builder_utils.ObjFileIsUpToDate(sourceFile, objFile, nil) NoError(t, err) require.False(t, upToDate) } func TestObjFileIsUpToDateObjOlder(t *testing.T) { - ctx := &types.Context{} - objFile := tempFile(t, "obj") defer objFile.RemoveAll() depFile := tempFile(t, "dep") @@ -77,14 +70,12 @@ func TestObjFileIsUpToDateObjOlder(t *testing.T) { sourceFile := tempFile(t, "source") defer sourceFile.RemoveAll() - upToDate, err := builder_utils.ObjFileIsUpToDate(ctx, sourceFile, objFile, depFile) + upToDate, err := builder_utils.ObjFileIsUpToDate(sourceFile, objFile, depFile) NoError(t, err) require.False(t, upToDate) } func TestObjFileIsUpToDateObjNewer(t *testing.T) { - ctx := &types.Context{} - sourceFile := tempFile(t, "source") defer sourceFile.RemoveAll() @@ -95,14 +86,12 @@ func TestObjFileIsUpToDateObjNewer(t *testing.T) { depFile := tempFile(t, "dep") defer depFile.RemoveAll() - upToDate, err := builder_utils.ObjFileIsUpToDate(ctx, sourceFile, objFile, depFile) + upToDate, err := builder_utils.ObjFileIsUpToDate(sourceFile, objFile, depFile) NoError(t, err) require.True(t, upToDate) } func TestObjFileIsUpToDateDepIsNewer(t *testing.T) { - ctx := &types.Context{} - sourceFile := tempFile(t, "source") defer sourceFile.RemoveAll() @@ -121,14 +110,12 @@ func TestObjFileIsUpToDateDepIsNewer(t *testing.T) { data := objFile.String() + ": \\\n\t" + sourceFile.String() + " \\\n\t" + headerFile.String() depFile.WriteFile([]byte(data)) - upToDate, err := builder_utils.ObjFileIsUpToDate(ctx, sourceFile, objFile, depFile) + upToDate, err := builder_utils.ObjFileIsUpToDate(sourceFile, objFile, depFile) NoError(t, err) require.False(t, upToDate) } func TestObjFileIsUpToDateDepIsOlder(t *testing.T) { - ctx := &types.Context{} - sourceFile := tempFile(t, "source") defer sourceFile.RemoveAll() @@ -145,14 +132,12 @@ func TestObjFileIsUpToDateDepIsOlder(t *testing.T) { res := objFile.String() + ": \\\n\t" + sourceFile.String() + " \\\n\t" + headerFile.String() depFile.WriteFile([]byte(res)) - upToDate, err := builder_utils.ObjFileIsUpToDate(ctx, sourceFile, objFile, depFile) + upToDate, err := builder_utils.ObjFileIsUpToDate(sourceFile, objFile, depFile) NoError(t, err) require.True(t, upToDate) } func TestObjFileIsUpToDateDepIsWrong(t *testing.T) { - ctx := &types.Context{} - sourceFile := tempFile(t, "source") defer sourceFile.RemoveAll() @@ -171,7 +156,7 @@ func TestObjFileIsUpToDateDepIsWrong(t *testing.T) { res := sourceFile.String() + ": \\\n\t" + sourceFile.String() + " \\\n\t" + headerFile.String() depFile.WriteFile([]byte(res)) - upToDate, err := builder_utils.ObjFileIsUpToDate(ctx, sourceFile, objFile, depFile) + upToDate, err := builder_utils.ObjFileIsUpToDate(sourceFile, objFile, depFile) NoError(t, err) require.False(t, upToDate) } diff --git a/legacy/builder/test/helper_tools_downloader.go b/legacy/builder/test/helper_tools_downloader.go index b4bca1614e8..a4be3843655 100644 --- a/legacy/builder/test/helper_tools_downloader.go +++ b/legacy/builder/test/helper_tools_downloader.go @@ -70,66 +70,66 @@ type Core struct { func DownloadCoresAndToolsAndLibraries(t *testing.T) { cores := []Core{ - Core{Maintainer: "arduino", Arch: "avr", Version: "1.6.10"}, - Core{Maintainer: "arduino", Arch: "sam", Version: "1.6.7"}, + {Maintainer: "arduino", Arch: "avr", Version: "1.6.10"}, + {Maintainer: "arduino", Arch: "sam", Version: "1.6.7"}, } boardsManagerCores := []Core{ - Core{Maintainer: "arduino", Arch: "samd", Version: "1.6.5"}, + {Maintainer: "arduino", Arch: "samd", Version: "1.6.5"}, } boardsManagerRedBearCores := []Core{ - Core{Maintainer: "RedBearLab", Arch: "avr", Version: "1.0.0", Url: "https://redbearlab.github.io/arduino/Blend/blend_boards.zip"}, + {Maintainer: "RedBearLab", Arch: "avr", Version: "1.0.0", Url: "https://redbearlab.github.io/arduino/Blend/blend_boards.zip"}, } toolsMultipleVersions := []Tool{ - Tool{Name: "bossac", Version: "1.6.1-arduino"}, - Tool{Name: "bossac", Version: "1.5-arduino"}, + {Name: "bossac", Version: "1.6.1-arduino"}, + {Name: "bossac", Version: "1.5-arduino"}, } tools := []Tool{ - Tool{Name: "avrdude", Version: "6.0.1-arduino5"}, - Tool{Name: "avr-gcc", Version: "4.8.1-arduino5"}, - Tool{Name: "arm-none-eabi-gcc", Version: "4.8.3-2014q1"}, - Tool{Name: "ctags", Version: "5.8-arduino11", + {Name: "avrdude", Version: "6.0.1-arduino5"}, + {Name: "avr-gcc", Version: "4.8.1-arduino5"}, + {Name: "arm-none-eabi-gcc", Version: "4.8.3-2014q1"}, + {Name: "ctags", Version: "5.8-arduino11", OsUrls: []OsUrl{ - OsUrl{Os: "i686-pc-linux-gnu", Url: "http://downloads.arduino.cc/tools/ctags-5.8-arduino11-i686-pc-linux-gnu.tar.bz2"}, - OsUrl{Os: "x86_64-pc-linux-gnu", Url: "http://downloads.arduino.cc/tools/ctags-5.8-arduino11-x86_64-pc-linux-gnu.tar.bz2"}, - OsUrl{Os: "i686-mingw32", Url: "http://downloads.arduino.cc/tools/ctags-5.8-arduino11-i686-mingw32.zip"}, - OsUrl{Os: "x86_64-apple-darwin", Url: "http://downloads.arduino.cc/tools/ctags-5.8-arduino11-x86_64-apple-darwin.zip"}, - OsUrl{Os: "arm-linux-gnueabihf", Url: "http://downloads.arduino.cc/tools/ctags-5.8-arduino11-armv6-linux-gnueabihf.tar.bz2"}, - OsUrl{Os: "aarch64-linux-gnu", Url: "http://downloads.arduino.cc/tools/ctags-5.8-arduino11-aarch64-linux-gnu.tar.bz2"}, + {Os: "i686-pc-linux-gnu", Url: "http://downloads.arduino.cc/tools/ctags-5.8-arduino11-i686-pc-linux-gnu.tar.bz2"}, + {Os: "x86_64-pc-linux-gnu", Url: "http://downloads.arduino.cc/tools/ctags-5.8-arduino11-x86_64-pc-linux-gnu.tar.bz2"}, + {Os: "i686-mingw32", Url: "http://downloads.arduino.cc/tools/ctags-5.8-arduino11-i686-mingw32.zip"}, + {Os: "x86_64-apple-darwin", Url: "http://downloads.arduino.cc/tools/ctags-5.8-arduino11-x86_64-apple-darwin.zip"}, + {Os: "arm-linux-gnueabihf", Url: "http://downloads.arduino.cc/tools/ctags-5.8-arduino11-armv6-linux-gnueabihf.tar.bz2"}, + {Os: "aarch64-linux-gnu", Url: "http://downloads.arduino.cc/tools/ctags-5.8-arduino11-aarch64-linux-gnu.tar.bz2"}, }, }, - Tool{Name: "arduino-preprocessor", Version: "0.1.5", + {Name: "arduino-preprocessor", Version: "0.1.5", OsUrls: []OsUrl{ - OsUrl{Os: "i686-pc-linux-gnu", Url: "https://github.com/arduino/arduino-preprocessor/releases/download/0.1.5/arduino-preprocessor-0.1.5-i686-pc-linux-gnu.tar.bz2"}, - OsUrl{Os: "x86_64-pc-linux-gnu", Url: "https://github.com/arduino/arduino-preprocessor/releases/download/0.1.5/arduino-preprocessor-0.1.5-x86_64-pc-linux-gnu.tar.bz2"}, - OsUrl{Os: "i686-mingw32", Url: "https://github.com/arduino/arduino-preprocessor/releases/download/0.1.5/arduino-preprocessor-0.1.5-i686-w64-mingw32.tar.bz2"}, - OsUrl{Os: "x86_64-apple-darwin", Url: "https://github.com/arduino/arduino-preprocessor/releases/download/0.1.5/arduino-preprocessor-0.1.5-x86_64-apple-darwin11.tar.bz2"}, - OsUrl{Os: "arm-linux-gnueabihf", Url: "https://github.com/arduino/arduino-preprocessor/releases/download/0.1.5/arduino-preprocessor-0.1.5-arm-linux-gnueabihf.tar.bz2"}, - OsUrl{Os: "aarch64-linux-gnu", Url: "https://github.com/arduino/arduino-preprocessor/releases/download/0.1.5/arduino-preprocessor-0.1.5-aarch64-linux-gnu.tar.bz2"}, + {Os: "i686-pc-linux-gnu", Url: "https://github.com/arduino/arduino-preprocessor/releases/download/0.1.5/arduino-preprocessor-0.1.5-i686-pc-linux-gnu.tar.bz2"}, + {Os: "x86_64-pc-linux-gnu", Url: "https://github.com/arduino/arduino-preprocessor/releases/download/0.1.5/arduino-preprocessor-0.1.5-x86_64-pc-linux-gnu.tar.bz2"}, + {Os: "i686-mingw32", Url: "https://github.com/arduino/arduino-preprocessor/releases/download/0.1.5/arduino-preprocessor-0.1.5-i686-w64-mingw32.tar.bz2"}, + {Os: "x86_64-apple-darwin", Url: "https://github.com/arduino/arduino-preprocessor/releases/download/0.1.5/arduino-preprocessor-0.1.5-x86_64-apple-darwin11.tar.bz2"}, + {Os: "arm-linux-gnueabihf", Url: "https://github.com/arduino/arduino-preprocessor/releases/download/0.1.5/arduino-preprocessor-0.1.5-arm-linux-gnueabihf.tar.bz2"}, + {Os: "aarch64-linux-gnu", Url: "https://github.com/arduino/arduino-preprocessor/releases/download/0.1.5/arduino-preprocessor-0.1.5-aarch64-linux-gnu.tar.bz2"}, }, }, } boardsManagerTools := []Tool{ - Tool{Name: "openocd", Version: "0.9.0-arduino", Package: "arduino"}, - Tool{Name: "CMSIS", Version: "4.0.0-atmel", Package: "arduino"}, + {Name: "openocd", Version: "0.9.0-arduino", Package: "arduino"}, + {Name: "CMSIS", Version: "4.0.0-atmel", Package: "arduino"}, } boardsManagerRFduinoTools := []Tool{ - Tool{Name: "arm-none-eabi-gcc", Version: "4.8.3-2014q1", Package: "RFduino"}, + {Name: "arm-none-eabi-gcc", Version: "4.8.3-2014q1", Package: "RFduino"}, } libraries := []Library{ - Library{Name: "Audio", Version: "1.0.4"}, - Library{Name: "Adafruit PN532", Version: "1.0.0"}, - Library{Name: "Bridge", Version: "1.6.1"}, - Library{Name: "CapacitiveSensor", Version: "0.5.0", VersionInLibProperties: "0.5"}, - Library{Name: "Ethernet", Version: "1.1.1"}, - Library{Name: "Robot IR Remote", Version: "2.0.0"}, - Library{Name: "FastLED", Version: "3.1.0"}, + {Name: "Audio", Version: "1.0.4"}, + {Name: "Adafruit PN532", Version: "1.0.0"}, + {Name: "Bridge", Version: "1.6.1"}, + {Name: "CapacitiveSensor", Version: "0.5.0", VersionInLibProperties: "0.5"}, + {Name: "Ethernet", Version: "1.1.1"}, + {Name: "Robot IR Remote", Version: "2.0.0"}, + {Name: "FastLED", Version: "3.1.0"}, } download(t, cores, boardsManagerCores, boardsManagerRedBearCores, tools, toolsMultipleVersions, boardsManagerTools, boardsManagerRFduinoTools, libraries) diff --git a/legacy/builder/test/unused_compiled_libraries_remover_test.go b/legacy/builder/test/unused_compiled_libraries_remover_test.go index 1201c0b4d0c..f6965cee0ff 100644 --- a/legacy/builder/test/unused_compiled_libraries_remover_test.go +++ b/legacy/builder/test/unused_compiled_libraries_remover_test.go @@ -36,7 +36,7 @@ func TestUnusedCompiledLibrariesRemover(t *testing.T) { ctx := &types.Context{} ctx.LibrariesBuildPath = temp - ctx.ImportedLibraries = []*libraries.Library{&libraries.Library{Name: "Bridge"}} + ctx.ImportedLibraries = []*libraries.Library{{Name: "Bridge"}} cmd := builder.UnusedCompiledLibrariesRemover{} err = cmd.Run(ctx) @@ -56,7 +56,7 @@ func TestUnusedCompiledLibrariesRemover(t *testing.T) { func TestUnusedCompiledLibrariesRemoverLibDoesNotExist(t *testing.T) { ctx := &types.Context{} ctx.LibrariesBuildPath = paths.TempDir().Join("test") - ctx.ImportedLibraries = []*libraries.Library{&libraries.Library{Name: "Bridge"}} + ctx.ImportedLibraries = []*libraries.Library{{Name: "Bridge"}} cmd := builder.UnusedCompiledLibrariesRemover{} err := cmd.Run(ctx) diff --git a/legacy/builder/test/utils_test.go b/legacy/builder/test/utils_test.go index 81e869e2687..b6f88555283 100644 --- a/legacy/builder/test/utils_test.go +++ b/legacy/builder/test/utils_test.go @@ -67,13 +67,13 @@ func TestQuoteCppString(t *testing.T) { } func TestParseCppString(t *testing.T) { - str, rest, ok := utils.ParseCppString(`foo`) + _, _, ok := utils.ParseCppString(`foo`) require.Equal(t, false, ok) - str, rest, ok = utils.ParseCppString(`"foo`) + _, _, ok = utils.ParseCppString(`"foo`) require.Equal(t, false, ok) - str, rest, ok = utils.ParseCppString(`"foo"`) + str, rest, ok := utils.ParseCppString(`"foo"`) require.Equal(t, true, ok) require.Equal(t, `foo`, str) require.Equal(t, ``, rest) diff --git a/legacy/builder/utils/utils.go b/legacy/builder/utils/utils.go index 2f60ff75719..c7ef7524ac0 100644 --- a/legacy/builder/utils/utils.go +++ b/legacy/builder/utils/utils.go @@ -34,6 +34,7 @@ import ( "github.com/arduino/arduino-cli/legacy/builder/types" paths "github.com/arduino/go-paths-helper" "github.com/pkg/errors" + "golang.org/x/text/runes" "golang.org/x/text/transform" "golang.org/x/text/unicode/norm" ) @@ -86,28 +87,37 @@ func FilterFiles() filterFiles { var SOURCE_CONTROL_FOLDERS = map[string]bool{"CVS": true, "RCS": true, ".git": true, ".github": true, ".svn": true, ".hg": true, ".bzr": true, ".vscode": true, ".settings": true, ".pioenvs": true, ".piolibdeps": true} +// FilterOutHiddenFiles is a ReadDirFilter that exclude files with a "." prefix in their name +var FilterOutHiddenFiles = paths.FilterOutPrefixes(".") + +// FilterOutSCCS is a ReadDirFilter that excludes known VSC or project files +func FilterOutSCCS(file *paths.Path) bool { + return !SOURCE_CONTROL_FOLDERS[file.Base()] +} + +// FilterReadableFiles is a ReadDirFilter that accepts only readable files +func FilterReadableFiles(file *paths.Path) bool { + // See if the file is readable by opening it + f, err := file.Open() + if err != nil { + return false + } + f.Close() + return true +} + func IsSCCSOrHiddenFile(file os.FileInfo) bool { return IsSCCSFile(file) || IsHiddenFile(file) } func IsHiddenFile(file os.FileInfo) bool { name := filepath.Base(file.Name()) - - if name[0] == '.' { - return true - } - - return false + return name[0] == '.' } func IsSCCSFile(file os.FileInfo) bool { name := filepath.Base(file.Name()) - - if SOURCE_CONTROL_FOLDERS[name] { - return true - } - - return false + return SOURCE_CONTROL_FOLDERS[name] } func SliceContains(slice []string, target string) bool { @@ -233,72 +243,22 @@ func AbsolutizePaths(files []string) ([]string, error) { return files, nil } -type CheckExtensionFunc func(ext string) bool - -func FindAllSubdirectories(folder string, output *[]string) error { - walkFunc := func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - // Skip source control and hidden files and directories - if IsSCCSOrHiddenFile(info) { - if info.IsDir() { - return filepath.SkipDir - } - return nil - } - - // Skip directories unless recurse is on, or this is the - // root directory - if info.IsDir() { - *output = AppendIfNotPresent(*output, path) - } - return nil - } - return gohasissues.Walk(folder, walkFunc) -} - -func FindFilesInFolder(files *[]string, folder string, extensions CheckExtensionFunc, recurse bool) error { - walkFunc := func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - // Skip source control and hidden files and directories - if IsSCCSOrHiddenFile(info) { - if info.IsDir() { - return filepath.SkipDir - } - return nil - } - - // Skip directories unless recurse is on, or this is the - // root directory - if info.IsDir() { - if recurse || path == folder { - return nil - } else { - return filepath.SkipDir - } - } - - // Check (lowercased) extension against list of extensions - if extensions != nil && !extensions(strings.ToLower(filepath.Ext(path))) { - return nil - } - - // See if the file is readable by opening it - currentFile, err := os.Open(path) - if err != nil { - return nil - } - currentFile.Close() - - *files = append(*files, path) - return nil - } - return gohasissues.Walk(folder, walkFunc) +func FindFilesInFolder(dir *paths.Path, recurse bool, extensions []string) (paths.PathList, error) { + fileFilter := paths.AndFilter( + paths.FilterSuffixes(extensions...), + FilterOutHiddenFiles, + FilterOutSCCS, + paths.FilterOutDirectories(), + FilterReadableFiles, + ) + if recurse { + dirFilter := paths.AndFilter( + FilterOutHiddenFiles, + FilterOutSCCS, + ) + return dir.ReadDirRecursiveFiltered(dirFilter, fileFilter) + } + return dir.ReadDir(fileFilter) } func AppendIfNotPresent(target []string, elements ...string) []string { @@ -375,34 +335,28 @@ func ParseCppString(line string) (string, string, bool) { c, width := utf8.DecodeRuneInString(line[i:]) switch c { - // Backslash, next character is used unmodified case '\\': + // Backslash, next character is used unmodified i += width if i >= len(line) { return "", line, false } res += string(line[i]) - break - // Quote, end of string case '"': + // Quote, end of string return res, line[i+width:], true default: res += string(c) - break } i += width } } -func isMn(r rune) bool { - return unicode.Is(unicode.Mn, r) // Mn: nonspacing marks -} - // Normalizes an UTF8 byte slice // TODO: use it more often troughout all the project (maybe on logger interface?) func NormalizeUTF8(buf []byte) []byte { - t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC) + t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC) result, _, _ := transform.Bytes(t, buf) return result } @@ -454,7 +408,17 @@ func CopyFile(src, dst string) (err error) { // CopyDir recursively copies a directory tree, attempting to preserve permissions. // Source directory must exist, destination directory must *not* exist. // Symlinks are ignored and skipped. -func CopyDir(src string, dst string, extensions CheckExtensionFunc) (err error) { +func CopyDir(src string, dst string, extensions []string) (err error) { + isAcceptedExtension := func(ext string) bool { + ext = strings.ToLower(ext) + for _, valid := range extensions { + if ext == valid { + return true + } + } + return false + } + src = filepath.Clean(src) dst = filepath.Clean(dst) @@ -499,7 +463,7 @@ func CopyDir(src string, dst string, extensions CheckExtensionFunc) (err error) continue } - if extensions != nil && !extensions(strings.ToLower(filepath.Ext(srcPath))) { + if !isAcceptedExtension(filepath.Ext(srcPath)) { continue }