diff --git a/src/arduino.cc/builder/container_find_includes.go b/src/arduino.cc/builder/container_find_includes.go index 9341248c..35408f21 100644 --- a/src/arduino.cc/builder/container_find_includes.go +++ b/src/arduino.cc/builder/container_find_includes.go @@ -33,9 +33,7 @@ import ( "arduino.cc/builder/constants" "arduino.cc/builder/types" "arduino.cc/builder/utils" - "math/rand" "path/filepath" - "strconv" ) type ContainerFindIncludes struct{} @@ -100,12 +98,12 @@ func runCommand(context map[string]interface{}, command types.Command) error { } func findIncludesUntilDone(context map[string]interface{}, sourceFilePath string) error { - targetFileName := filepath.Base(sourceFilePath) + "_" + strconv.Itoa(rand.Int()) + "_preprocessed.cpp" + targetFilePath := utils.NULLFile() importedLibraries := context[constants.CTX_IMPORTED_LIBRARIES].([]*types.Library) done := false for !done { commands := []types.Command{ - &GCCPreprocRunnerForDiscoveringIncludes{SourceFilePath: sourceFilePath, TargetFileName: targetFileName}, + &GCCPreprocRunnerForDiscoveringIncludes{SourceFilePath: sourceFilePath, TargetFilePath: targetFilePath}, &IncludesFinderWithRegExp{ContextField: constants.CTX_GCC_MINUS_E_SOURCE}, &IncludesToIncludeFolders{}, } diff --git a/src/arduino.cc/builder/gcc_preproc_runner.go b/src/arduino.cc/builder/gcc_preproc_runner.go index d67e322a..8950c12c 100644 --- a/src/arduino.cc/builder/gcc_preproc_runner.go +++ b/src/arduino.cc/builder/gcc_preproc_runner.go @@ -65,11 +65,11 @@ func (s *GCCPreprocRunner) Run(context map[string]interface{}) error { type GCCPreprocRunnerForDiscoveringIncludes struct { SourceFilePath string - TargetFileName string + TargetFilePath string } func (s *GCCPreprocRunnerForDiscoveringIncludes) Run(context map[string]interface{}) error { - properties, _, err := prepareGCCPreprocRecipeProperties(context, s.SourceFilePath, s.TargetFileName) + properties, _, err := prepareGCCPreprocRecipeProperties(context, s.SourceFilePath, s.TargetFilePath) if err != nil { return utils.WrapError(err) } @@ -86,13 +86,15 @@ func (s *GCCPreprocRunnerForDiscoveringIncludes) Run(context map[string]interfac return nil } -func prepareGCCPreprocRecipeProperties(context map[string]interface{}, sourceFilePath string, targetFileName string) (map[string]string, string, error) { - preprocPath := context[constants.CTX_PREPROC_PATH].(string) - err := utils.EnsureFolderExists(preprocPath) - if err != nil { - return nil, "", utils.WrapError(err) +func prepareGCCPreprocRecipeProperties(context map[string]interface{}, sourceFilePath string, targetFilePath string) (map[string]string, string, error) { + if !filepath.IsAbs(targetFilePath) { + preprocPath := context[constants.CTX_PREPROC_PATH].(string) + err := utils.EnsureFolderExists(preprocPath) + if err != nil { + return nil, "", utils.WrapError(err) + } + targetFilePath = filepath.Join(preprocPath, targetFilePath) } - targetFilePath := filepath.Join(preprocPath, targetFileName) buildProperties := utils.GetMapStringStringOrDefault(context, constants.CTX_BUILD_PROPERTIES) properties := utils.MergeMapsOfStrings(make(map[string]string), buildProperties) diff --git a/src/arduino.cc/builder/utils/utils.go b/src/arduino.cc/builder/utils/utils.go index ce01fdc3..f41561b0 100644 --- a/src/arduino.cc/builder/utils/utils.go +++ b/src/arduino.cc/builder/utils/utils.go @@ -462,3 +462,10 @@ func TagHasAtLeastOneField(tag map[string]string, fields []string) (string, bool } return "", false } + +func NULLFile() string { + if runtime.GOOS == "windows" { + return "nul" + } + return "/dev/null" +}