func (s *ContainerFindIncludes) Run(ctx *types.Context) error { cachePath := filepath.Join(ctx.BuildPath, constants.FILE_INCLUDES_CACHE) cache := readCache(cachePath) appendIncludeFolder(ctx, cache, "", "", ctx.BuildProperties[constants.BUILD_PROPERTIES_BUILD_CORE_PATH]) if ctx.BuildProperties[constants.BUILD_PROPERTIES_BUILD_VARIANT_PATH] != constants.EMPTY_STRING { appendIncludeFolder(ctx, cache, "", "", ctx.BuildProperties[constants.BUILD_PROPERTIES_BUILD_VARIANT_PATH]) } sketch := ctx.Sketch mergedfile, err := types.MakeSourceFile(ctx, sketch, filepath.Base(sketch.MainFile.Name)+".cpp") if err != nil { return i18n.WrapError(err) } ctx.CollectedSourceFiles.Push(mergedfile) sourceFilePaths := ctx.CollectedSourceFiles queueSourceFilesFromFolder(ctx, sourceFilePaths, sketch, ctx.SketchBuildPath, false /* recurse */) srcSubfolderPath := filepath.Join(ctx.SketchBuildPath, constants.SKETCH_FOLDER_SRC) if info, err := os.Stat(srcSubfolderPath); err == nil && info.IsDir() { queueSourceFilesFromFolder(ctx, sourceFilePaths, sketch, srcSubfolderPath, true /* recurse */) } for !sourceFilePaths.Empty() { err := findIncludesUntilDone(ctx, cache, sourceFilePaths.Pop()) if err != nil { os.Remove(cachePath) return i18n.WrapError(err) } } // Finalize the cache cache.ExpectEnd() err = writeCache(cache, cachePath) if err != nil { return i18n.WrapError(err) } err = runCommand(ctx, &FailIfImportedLibraryIsWrong{}) if err != nil { return i18n.WrapError(err) } return nil }
func queueSourceFilesFromFolder(ctx *types.Context, queue *types.UniqueSourceFileQueue, origin interface{}, folder string, recurse bool) error { extensions := func(ext string) bool { return ADDITIONAL_FILE_VALID_EXTENSIONS_NO_HEADERS[ext] } filePaths := []string{} err := utils.FindFilesInFolder(&filePaths, folder, extensions, recurse) if err != nil { return i18n.WrapError(err) } for _, filePath := range filePaths { sourceFile, err := types.MakeSourceFile(ctx, origin, filePath) if err != nil { return i18n.WrapError(err) } queue.Push(sourceFile) } return nil }