예제 #1
0
        public static string generate(IProject project, LibManager libManager, SetupData setup)
        {
            switch (project.target)
            {
            case Target.vsCode:
                if (project.buildSystem == BuildSystem.makefile)
                {
                    return(C_CPP_Props_make.generate(project, setup, libManager));
                }
                else
                {
                    return(C_CPP_Props_builder.generate(project, libManager, setup));
                }

            case Target.atom:
                return("TBD");

            case Target.sublimeText:
                return("TBD");

            case Target.vsFolder:
                return("TBD");

            default:
                return("Error");
            }
        }
예제 #2
0
        public IReadOnlyList <ITask> getTasks(IProject project, LibManager libManager, SetupData setup)
        {
            var tasks = new List <ITask>();

            tasks.Add(new PrepareFolders(project));

            tasks.Add(new GenerateSettings(project));
            tasks.Add(new GenerateIntellisense(project, libManager, setup));
            tasks.Add(new GenerateMakefile(project, libManager, setup));
            tasks.Add(new GenerateTasks(project, setup));
            tasks.Add(new CopyLibs(project));

            if (project.selectedConfiguration.copyCore)
            {
                tasks.Add(new CopyCore(project));
            }

            if (project.buildSystem == BuildSystem.makefile)
            {
                tasks.Add(new GenerateSketch(project));
            }
            tasks.Add(new CleanBinaries(project));

            return(tasks);
        }
예제 #3
0
        public Project(SetupData setup, LibManager libManager)
        {
            this.setup           = setup;
            this.libManager      = libManager;
            this._configurations = new List <Configuration>();

            //var userPackages = Directory.GetDirectories(Helpers.arduinoAppPath + "\\packages");
            //var builtInPackages = Directory.GetDirectories(Helpers.arduinoPath + "\\hardware");
            //var packages = userPackages.Select(p => new Package(p)).ToList();
        }
예제 #4
0
        public GenerateSettingsJson(IProject project, LibManager libManager, SetupData setup)
        {
            this.project    = project;
            this.libManager = libManager;
            this.setup      = setup;

            setupJsonFile = new FileInfo(Path.Combine(project.path, ".vscode", "settings.json"));
            exists        = setupJsonFile.Exists;
            done          = false;
        }
예제 #5
0
        public GenerateIntellisense(IProject project, LibManager libManager, SetupData setup)
        {
            this.project    = project;
            this.libManager = libManager;
            this.setup      = setup;

            c_cpp_propertiesFile = new FileInfo(Path.Combine(project.path, ".vscode", "c_cpp_properties.json"));
            exists = c_cpp_propertiesFile.Exists;
            done   = false;
        }
예제 #6
0
 public static string generate(IProject project, LibManager libManager, SetupData setup)
 {
     if (project.buildSystem == BuildSystem.makefile)
     {
         return(Makefile_Make.generate(project, libManager, setup));
     }
     else
     {
         return(Makefile_Builder.generate(project, libManager, setup));
     }
 }
예제 #7
0
 static public async Task ardGenerator(IProject project, LibManager libManager, SetupData setup, IProgress <string> progressHandler)
 {
     // generate make.cpp ------------------------------------------------------------------
     mainFile = Path.Combine(project.path, project.name + ".ino");
     if (!File.Exists(mainFile))
     {
         File.WriteAllText(mainFile, Strings.sketchIno);
         progressHandler.Report("Generate process-palette.json");
         progressHandler.Report("OK");
         await Task.Delay(1);
     }
 }
예제 #8
0
        public async Task generate(IProject project, LibManager libManager, SetupData setup, IProgress <string> progressHandler)
        {
            progressHandler.Report("Check or create folders");
            var tasksFolder    = project.path;
            var vsTeensyFolder = Path.Combine(project.path, ".vsteensy");
            var buildFolder    = Path.Combine(project.path, vsTeensyFolder, "build");

            Directory.CreateDirectory(vsTeensyFolder);
            Directory.CreateDirectory(buildFolder);

            progressHandler.Report("OK");
            await Task.Delay(1);

            //taskJsonFile = Path.Combine(tasksFolder, ".build-tools.cson");
            taskJsonFile = Path.Combine(tasksFolder, "process-palette.json");
            settingsFile = Path.Combine(vsTeensyFolder, "vsteensy.json");
            string makefile = Path.Combine(project.path, "makefile");

            // Copy makefile ----------------------------------------------------------------------
            File.WriteAllText(makefile, Makefile.generate(project, libManager, setup));
            progressHandler.Report("Generate makefile");
            progressHandler.Report("OK");
            await Task.Delay(1);

            // Task_json --------------------------------------------------------------------------
            var tasksJson = TaskFile.generate(project, setup);

            File.WriteAllText(taskJsonFile, tasksJson);
            progressHandler.Report("Generate process-palette.json");
            progressHandler.Report("OK");
            await Task.Delay(1);

            // Settings ---------------------------------------------------------------------------
            var projectSettingsJson = ProjectSettings.generate(project);

            File.WriteAllText(settingsFile, projectSettingsJson);

            if (project.buildSystem == BuildSystem.makefile)
            {
                await mkGenerator(project, libManager, setup, progressHandler);
            }
            else
            {
                await ardGenerator(project, libManager, setup, progressHandler);
            }

            progressHandler.Report("Start ATOM");
            await Task.Delay(1);

            Starter.start_atom(project.path, mainFile);
            progressHandler.Report("OK");
        }
예제 #9
0
        static public string generate(IProject project, LibManager libManager, SetupData setup)
        {
            var tasklist = new List <Task>();

            tasklist.Add(new Task()
            {
                label   = "Build (Arduino Builder)",
                group   = new Group(),
                command = Path.Combine(setup.arduinoBase, "arduino-builder").Replace('\\', '/'),
                args    = new List <string>
                {
                    "-verbose=0",
                    "-logger=human",
                    "-debug-level=0",
                    $"-hardware={setup.arduinoBase}\\hardware".Replace('\\', '/'),
                    "'-build-path=${workspaceFolder}/.vsTeensy/build'",
                    $"-tools={setup.arduinoBase}\\tools-builder".Replace('\\', '/'),
                    $"-tools={setup.arduinoBase}\\hardware\\tools\\avr".Replace('\\', '/'),
                    $"-fqbn={project.selectedConfiguration.selectedBoard.fqbn}",
                    $"-libraries={Path.Combine(setup.arduinoBase, "hardware", "teensy", "avr", "libraries")}".Replace('\\', '/'),
                    $"-libraries={Path.Combine(setup.arduinoBase ,"libraries")}".Replace('\\', '/'),
                    $"-libraries={Path.Combine(Helpers.getSketchbookFolder() ,"libraries")}".Replace('\\', '/'),
                    $"{project.name}.ino"
                }
            });

            tasklist.Add(new Task()
            {
                label   = "Upload (PJRC)",
                group   = new Group(),
                command = $"{setup.arduinoTools}/teensy_post_compile.exe".Replace('\\', '/'),
                args    = new List <string>
                {
                    $"-test",
                    $"-reboot",
                    "'-path=${workspaceFolder}/.vsTeensy/build'",
                    $"-board={project.selectedConfiguration.selectedBoard.id}",
                    $"-tools={setup.arduinoTools}".Replace('\\', '/'),
                    $"-file='{project.name}.ino'",
                },
            });

            var tasks = new tasksJson
            {
                tasks        = tasklist,
                presentation = new Presentation()
            };

            return(JsonConvert.SerializeObject(tasks, Formatting.Indented));
        }
예제 #10
0
        public static string generate(IProject project, LibManager libManager, SetupData setup)
        {
            var cfg = project.selectedConfiguration;

            var props = new PropertiesJson()
            {
                configurations = new List <ConfigurationJson>()
                {
                    new ConfigurationJson()
                    {
                        name             = "VisualTeensy",
                        compilerPath     = Path.Combine(cfg.compiler, "arm-none-eabi-gcc.exe").Replace('\\', '/'),
                        intelliSenseMode = "gcc-arm",
                        cppStandard      = "gnu++14", // hack: might be better to extract from boards.txt
                        includePath      = new List <string>()
                        {
                            $"{Path.Combine(setup.arduinoCoreBase,"cores",cfg.core).Replace('\\', '/') + "/**"}",
                            $"{Path.Combine(setup.arduinoBase, "hardware", "teensy", "avr", "libraries/**")}".Replace('\\', '/'),
                            $"{Path.Combine(setup.arduinoBase ,"libraries/**")}".Replace('\\', '/'),
                            $"{setup.sharedLibrariesFolder}/**".Replace('\\', '/'),
                        },

                        forcedInclude = new List <string>()
                        {
                            Path.Combine(setup.arduinoCoreBase, "cores", cfg.core, "arduino.h").Replace('\\', '/'),
                        },

                        defines = new List <string>()
                    }
                }
            };

            var options = cfg.selectedBoard.getAllOptions();
            var defines = options.FirstOrDefault(o => o.Key == "build.flags.defs");

            if (defines.Value != null)
            {
                foreach (var define in defines.Value.Split(new string[] { "-D" }, StringSplitOptions.RemoveEmptyEntries))
                {
                    props.configurations[0].defines.Add(define.Trim());
                }
            }

            addConfigOption(options, props, "F_CPU=", "build.fcpu");
            addConfigOption(options, props, "", "build.usbtype");
            addConfigOption(options, props, "LAYOUT_", "build.keylayout");
            props.configurations[0].defines.Add("ARDUINO=10813");

            return(JsonConvert.SerializeObject(props, Formatting.Indented));
        }
예제 #11
0
        static public string generate(IProject project, LibManager libManager, SetupData setup)
        {
            var cfg     = project.selectedConfiguration;
            var board   = cfg.selectedBoard;
            var options = board.getAllOptions();

            StringBuilder mf = new StringBuilder();

            mf.Append("#******************************************************************************\n");
            mf.Append("# Generated by VisualTeensy (https://github.com/luni64/VisualTeensy)\n");
            mf.Append("#\n");
            mf.Append($"# {"Board",-18} {cfg.selectedBoard.name}\n");
            foreach (var o in cfg.selectedBoard.optionSets)
            {
                mf.Append($"# {o.name,-18} {o.selectedOption?.name}\n");
            }
            mf.Append("#\n");
            mf.Append($"# {DateTime.Now.ToShortDateString()} {DateTime.Now.ToShortTimeString()}\n");
            mf.Append("#******************************************************************************\n");

            mf.Append($"SHELL            := cmd.exe\nexport SHELL\n\n");

            mf.Append($"SKETCH_NAME      := {project.name?.Replace(" ", "_")}.ino\n\n");
            mf.Append(makeEntry("BOARD_ID         := ", "build.board", options) + "\n");
            mf.Append(makeEntry("MCU              := ", "build.mcu", options) + "\n\n");

            mf.Append($"BUILDER_BASE     := {setup.arduinoBase}\n");
            mf.Append($"FLAGS            := -verbose=1 -warnings=all\n");

            mf.Append($"FQBN             := {cfg.selectedBoard.fqbn}\n");
            mf.Append($"BUILD_PATH       := $(abspath .vsTeensy/build)\n");

            mf.Append($"HARDWARE         := -hardware=\"{setup.arduinoBase}/hardware\"\n");
            // mf.Append($"TOOLS            := \"{Helpers.getShortPath(setup.arduinoBase+"\\tools-builder")}\"\n\n");
            mf.Append($"TOOLS            := -tools=\"{(setup.arduinoBase + "\\tools-builder")}\"\n\n");

            mf.Append($"LIBRARIES        := -libraries=\"{Helpers.getSketchbookFolder()}/libraries\"\n");
            mf.Append($"LIBRARIES        += -libraries=\"{setup.arduinoBase}/hardware/teensy/avr/libraries\"\n");
            mf.Append($"LIBRARIES        += -libraries=\"{setup.arduinoBase}/libraries\"\n\n");

            mf.Append($"UPL_PJRC_B       := {Helpers.getShortPath(setup.arduinoTools)}\n");
            mf.Append($"UPL_TYCMD_B      := {setup.uplTyBase.shortPath}\n");
            mf.Append($"UPL_CLICMD_B     := {setup.uplCLIBase.shortPath}\n\n");


            mf.Append(setup.makefile_builder);

            return(mf.ToString());
        }
예제 #12
0
        public static IReadOnlyList <ITask> getTasks(IProject project, LibManager libManager, SetupData setup)
        {
            var tasks = new List <ITask>();

            switch (project.target)
            {
            case Target.vsCode:
                tasks.Add(new PrepareFolders(project));
                tasks.Add(new GenerateSettings(project));
                tasks.Add(new GenerateMakefile(project, libManager, setup));
                tasks.Add(new GenerateTasks(project, setup));
                if (project.buildSystem == BuildSystem.makefile)
                {
                    tasks.Add(new CopyLibs(project));
                    switch (project.selectedConfiguration.coreStrategy)
                    {
                    case LibStrategy.copy: tasks.Add(new CopyCore(project)); break;

                    case LibStrategy.clone: tasks.Add(new CloneCore(project)); break;
                    }
                }
                if (project.debugSupport == DebugSupport.cortex_debug)
                {
                    tasks.Add(new GenerateDebugSupport(project, setup));
                }
                if (setup.additionalFiles.Any())
                {
                    tasks.Add(new CopyAdditionalFiles(project, setup));
                }
                if (true)     // make this optional
                {
                    tasks.Add(new GenerateSettingsJson(project, libManager, setup));
                }
                tasks.Add(new GenerateIntellisense(project, libManager, setup));     // needs to be added after libraries (checks for existence)

                tasks.Add(new CleanBinaries(project));
                tasks.Add(new GenerateSketch(project));
                break;

            case Target.atom:
                break;

            case Target.sublimeText:
                break;
            }

            return(tasks);
        }
예제 #13
0
        public static string generate(IProject project, LibManager libManager)
        {
            if (project.selectedConfiguration.compilerBase == null)
            {
                return("");                                                    // hack
            }
            var props = new PropertiesJson()
            {
                configurations = new List <ConfigurationJson>()
                {
                    new ConfigurationJson()
                    {
                        name             = "VisualTeensy",
                        compilerPath     = Path.Combine(project.selectedConfiguration.compilerBase, "bin", "arm-none-eabi-gcc.exe").Replace('\\', '/'),
                        intelliSenseMode = "gcc-x64",
                        includePath      = new List <string>()
                        {
                            "src/**",
                            "lib/**",
                            project.selectedConfiguration.coreBase?.Replace('\\', '/') + "/**",
                            libManager.sharedRepositoryPath.Replace('\\', '/') + "/**"
                        },
                        defines = new List <string>()
                    }
                }
            };

            var options = project.selectedConfiguration.selectedBoard.getAllOptions();
            var defines = options.FirstOrDefault(o => o.Key == "build.flags.defs");

            if (defines.Value != null)
            {
                foreach (var define in defines.Value.Split(new string[] { "-D" }, StringSplitOptions.RemoveEmptyEntries))
                {
                    props.configurations[0].defines.Add(define.Trim());
                }
            }

            addConfigOption(options, props, "F_CPU=", "build.fcpu");
            addConfigOption(options, props, "", "build.usbtype");
            addConfigOption(options, props, "LAYOUT_", "build.keylayout");
            props.configurations[0].defines.Add("ARDUINO");


            return(JsonConvert.SerializeObject(props, Formatting.Indented));
        }
예제 #14
0
        public static string generate(IProject project, LibManager libManager, SetupData setup)
        {
            var props = new PropertiesJson()
            {
                configurations = new List <ConfigurationJson>()
                {
                    new ConfigurationJson()
                    {
                        name             = "VisualTeensy",
                        compilerPath     = Path.Combine(project.selectedConfiguration.compilerBase, "bin", "arm-none-eabi-gcc.exe").Replace('\\', '/'),
                        intelliSenseMode = "gcc-x64",
                        includePath      = new List <string>()
                        {
                            project.selectedConfiguration.coreBase?.Replace('\\', '/') + "/*",
                            $"{Path.Combine(setup.arduinoBase, "hardware", "teensy", "avr", "libraries/**")}".Replace('\\', '/'),
                            $"{Path.Combine(setup.arduinoBase ,"libraries/**")}".Replace('\\', '/'),
                            $"{Path.Combine(Helpers.getSketchbookFolder() ,"libraries/**")}".Replace('\\', '/'),
                        },
                        forcedInclude = new List <string>()
                        {
                            Path.Combine(project.selectedConfiguration.coreBase, "arduino.h").Replace('\\', '/'),
                        },
                        defines = new List <string>()
                    }
                }
            };

            var options = project.selectedConfiguration.selectedBoard.getAllOptions();
            var defines = options.FirstOrDefault(o => o.Key == "build.flags.defs");

            if (defines.Value != null)
            {
                foreach (var define in defines.Value.Split(new string[] { "-D" }, StringSplitOptions.RemoveEmptyEntries))
                {
                    props.configurations[0].defines.Add(define.Trim());
                }
            }

            addConfigOption(options, props, "F_CPU=", "build.fcpu");
            addConfigOption(options, props, "", "build.usbtype");
            addConfigOption(options, props, "LAYOUT_", "build.keylayout");
            props.configurations[0].defines.Add("ARDUINO");

            return(JsonConvert.SerializeObject(props, Formatting.Indented));
        }
예제 #15
0
        static public async Task mkGenerator(IProject project, LibManager libManager, SetupData setup, IProgress <string> progressHandler)
        {
            //string srcFolder = Path.Combine(project.path, "src");
            //string libFolder = Path.Combine(project.path, "lib");
            //Directory.CreateDirectory(srcFolder);
            //Directory.CreateDirectory(libFolder);

            //// copy local libraries -----------------------------------------------------------
            //foreach (Library library in project.selectedConfiguration.localLibs)
            //{
            //    if (library.sourceType == Library.SourceType.local)
            //    {
            //        progressHandler.Report($"Copy library {library.name}");
            //        await Task.Delay(1);

            //        DirectoryInfo source = new DirectoryInfo(library.source);
            //        DirectoryInfo target = new DirectoryInfo(Path.Combine(libFolder, library.path));
            //        Helpers.copyFilesRecursively(source, target);

            //        progressHandler.Report($"OK");
            //        await Task.Delay(1);
            //    }
            //    else
            //    {
            //        progressHandler.Report($"Download library {library.name}");
            //        await Task.Delay(1);

            //        await Helpers.downloadLibrary(library, libBase);

            //        progressHandler.Report($"OK");
            //        await Task.Delay(1);
            //    }
            //}

            //// generate make.cpp ------------------------------------------------------------------
            //mainFile = Path.Combine(srcFolder, "main.cpp");
            //if (!File.Exists(mainFile))
            //{
            //    File.WriteAllText(mainFile, Strings.mainCpp);
            //}
            await Task.CompletedTask;
        }
예제 #16
0
        public static IReadOnlyList <ITask> getTasks(IProject project, LibManager libManager, SetupData setup)
        {
            var tasks = new List <ITask>();

            switch (project.target)
            {
            case Target.vsCode:
                tasks.Add(new PrepareFolders(project));
                tasks.Add(new GenerateSettings(project));
                tasks.Add(new GenerateIntellisense(project, libManager, setup));
                tasks.Add(new GenerateMakefile(project, libManager, setup));
                tasks.Add(new GenerateTasks(project, setup));
                if (project.buildSystem == BuildSystem.makefile)
                {
                    tasks.Add(new CopyLibs(project));
                    if (project.selectedConfiguration.copyCore)
                    {
                        tasks.Add(new CopyCore(project));
                    }
                }
                if (project.debugSupport == DebugSupport.cortex_debug)
                {
                    tasks.Add(new GenerateDebugSupport(project, setup));
                }
                tasks.Add(new CleanBinaries(project));
                tasks.Add(new GenerateSketch(project));
                break;

            case Target.atom:
                break;

            case Target.sublimeText:
                break;
            }

            return(tasks);
        }
예제 #17
0
        public GenerateMakefile(IProject project, LibManager libManager, SetupData setup)
        {
            string oldMakefile = "";

            file = new FileInfo(Path.Combine(project.path, "makefile"));
            if (file.Exists)
            {
                oldMakefile = File.ReadAllText(file.FullName);
            }
            newMakefile = Makefile.generate(project, libManager, setup);

            if (!file.Exists)
            {
                status = "Generate";
            }
            else if (String.Equals(oldMakefile.Substring(400), newMakefile.Substring(400)))
            {
                status = "Up-To-Date";
            }
            else
            {
                status = "Overwrite";
            }
        }
예제 #18
0
        static public string generate(IProject project, LibManager libManager, SetupData setup)
        {
            var cfg = project.selectedConfiguration;

            if (!cfg.isOk)
            {
                return("ERROR");
            }
            //if (cfg.setupType == SetupTypes.quick && (setup.arduinoBaseError != null)) return "Error: Arduino path not set!\n\nPlease switch to expert setup or define a \nvalid Arduino path in the Settings tab.";
            //if (cfg.setupType == SetupTypes.expert && !cfg.compilerBase.isOk) return "Error: Compiler path not set!";
            //if (cfg.setupType == SetupTypes.expert && !cfg.coreBase.isOk) return "Error: Hardware folder (folder containing boards.txt and the cores subfolder) is not set";
            var board = cfg.selectedBoard;
            //if (board == null) return "Error: No board selected";

            var options = board.getAllOptions();

            StringBuilder mf = new StringBuilder();

            mf.Append("#******************************************************************************\n");
            mf.Append("# Generated by VisualTeensy (https://github.com/luni64/VisualTeensy)\n");
            mf.Append("#\n");
            mf.Append($"# {"Board",-18} {board.name}\n");
            foreach (var o in board.optionSets)
            {
                mf.Append($"# {o.name,-18} {o.selectedOption?.name}\n");
            }
            mf.Append("#\n");
            mf.Append($"# {DateTime.Now.ToShortDateString()} {DateTime.Now.ToShortTimeString()}\n");
            mf.Append("#******************************************************************************\n");

            mf.Append($"SHELL            := cmd.exe\nexport SHELL\n\n");
            mf.Append($"TARGET_NAME      := {project.cleanName}\n");
            mf.Append(makeEntry("BOARD_ID         := ", "build.board", options) + "\n\n");
            mf.Append(makeEntry("MCU              := ", "build.mcu", options) + "\n\n");

            mf.Append($"LIBS_SHARED_BASE := {Helpers.getShortPath(libManager.sharedRepository?.repoPath)}\n");
            mf.Append($"LIBS_SHARED      := ");
            foreach (var lib in cfg.sharedLibs)
            {
                mf.Append($"{lib.sourceFolderName ?? "ERROR"} ");
            }
            mf.Append("\n\n");

            mf.Append($"LIBS_LOCAL_BASE  := lib\n");
            mf.Append($"LIBS_LOCAL       := ");
            foreach (var lib in cfg.localLibs)
            {
                mf.Append($"{lib.targetFolderName} ");
            }
            mf.Append("\n\n");

            //mf.Append($"CORE_BASE        := {Helpers.getShortPath(Path.Combine(setup.arduinoCoreBase ?? "Error", "cores", cfg.selectedBoard.core))}\n");

            if (cfg.setupType == SetupTypes.quick)
            {
                mf.Append($"CORE_BASE        := {Helpers.getShortPath(Path.Combine(setup.arduinoCoreBase ?? "Error", "cores", cfg.selectedBoard.core))}\n");
                mf.Append($"GCC_BASE         := {cfg.compiler}\n");
                mf.Append($"UPL_PJRC_B       := {Helpers.getShortPath(setup.arduinoTools)}\n");
            }
            else
            {
                mf.Append($"CORE_BASE        := {((cfg.copyCore || (Path.GetDirectoryName(cfg.coreBase.path) == project.path)) ? "core" : Helpers.getShortPath(cfg.core))}\n");
                mf.Append($"GCC_BASE         := {cfg.compiler}\n");
                if (!String.IsNullOrWhiteSpace(setup.uplPjrcBase.path))
                {
                    mf.Append($"UPL_PJRC_B       := {setup.uplPjrcBase.shortPath}\n");
                }
                //mf.Append($"UPL_PJRC_B       := {setup.uplPjrcBase.shortPath}\n");
            }
            if (!String.IsNullOrWhiteSpace(setup.uplTyBase.path))
            {
                mf.Append($"UPL_TYCMD_B      := {setup.uplTyBase.shortPath}\n");
            }
            if (!String.IsNullOrWhiteSpace(setup.uplJLinkBase.path))
            {
                mf.Append($"UPL_JLINK_B      := {setup.uplJLinkBase.shortPath}\n");
            }
            if (project.debugSupport != DebugSupport.none && !String.IsNullOrWhiteSpace(setup.uplCLIBase.path))
            {
                mf.Append($"UPL_CLICMD_B     := {setup.uplCLIBase.shortPath}\n");
            }


            mf.Append("\n#******************************************************************************\n");
            mf.Append("# Flags and Defines\n");
            mf.Append("#******************************************************************************\n");

            mf.Append(makeEntry("FLAGS_CPU   := ", "build.flags.cpu", options) + "\n");
            mf.Append(makeEntry("FLAGS_OPT   := ", "build.flags.optimize", options) + "\n");
            mf.Append(makeEntry("FLAGS_COM   := ", "build.flags.common", options) + makeEntry(" ", "build.flags.dep", options) + "\n");
            mf.Append(makeEntry("FLAGS_LSP   := ", "build.flags.ldspecs", options) + "\n");

            mf.Append("\n");
            mf.Append(makeEntry("FLAGS_CPP   := ", "build.flags.cpp", options) + "\n");
            mf.Append(makeEntry("FLAGS_C     := ", "build.flags.c", options) + "\n");
            mf.Append(makeEntry("FLAGS_S     := ", "build.flags.S", options) + "\n");

            mf.Append(makeEntry("FLAGS_LD    := ", "build.flags.ld", options).Replace("{build.core.path}", "$(CORE_BASE)") + "\n");

            mf.Append("\n");
            mf.Append(makeEntry("LIBS        := ", "build.flags.libs", options) + "\n");
            //mf.Append(makeEntry("LD_SCRIPT   := ", "build.mcu", options) + ".ld\n");

            mf.Append("\n");
            mf.Append(makeEntry("DEFINES     := ", "build.flags.defs", options) + makeEntry(" -DARDUINO_", "build.board", options) + " -DARDUINO=10807\n");
            mf.Append("DEFINES     += ");
            mf.Append(makeEntry("-DF_CPU=", "build.fcpu", options) + " " + makeEntry("-D", "build.usbtype", options) + " " + makeEntry("-DLAYOUT_", "build.keylayout", options) + "\n");

            mf.Append($"\n");
            mf.Append("CPP_FLAGS   := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_CPP)\n");
            mf.Append("C_FLAGS     := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_C)\n");
            mf.Append("S_FLAGS     := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_S)\n");
            mf.Append("LD_FLAGS    := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_LSP) $(FLAGS_LD)\n");
            mf.Append("AR_FLAGS    := rcs\n");

            if (cfg.setupType == SetupTypes.expert && !String.IsNullOrWhiteSpace(cfg.makefileExtension))
            {
                mf.Append("\n");
                mf.Append(cfg.makefileExtension);
                mf.Append("\n");
            }

            mf.Append("\n#******************************************************************************\n");
            mf.Append("# Colors\n");
            mf.Append("#******************************************************************************\n");
            if (setup.isColoredOutput)
            {
                mf.Append($"COL_CORE    := {colEsc(setup.colorCore)}\n");
                mf.Append($"COL_LIB     := {colEsc(setup.colorUserLib)}\n");
                mf.Append($"COL_SRC     := {colEsc(setup.colorUserSrc)}\n");
                mf.Append($"COL_LINK    := {colEsc(setup.colorLink)}\n");
                mf.Append($"COL_ERR     := {colEsc(setup.colorErr)}\n");
                mf.Append($"COL_OK      := {colEsc(setup.colorOk)}\n");
                mf.Append($"COL_RESET   := {colReset}\n");
            }
            else
            {
                mf.Append($"COL_CORE    := {colReset}\n");
                mf.Append($"COL_Lib     := {colReset}\n");
                mf.Append($"COL_SRC     := {colReset}\n");
                mf.Append($"COL_LINK    := {colReset}\n");
                mf.Append($"COL_ERR     := {colReset}\n");
                mf.Append($"COL_OK      := {colReset}\n");
                mf.Append($"COL_RESET   := {colReset}\n");
            }

            mf.Append("\n");
            mf.Append(setup.makefile_fixed);

            return(mf.ToString());
        }
예제 #19
0
 public static IProject makeProject(SetupData setup, LibManager libManager)
 {
     return(new Project(setup, libManager));
 }
예제 #20
0
 public Project(SetupData setup, LibManager libManager)
 {
     this.setup           = setup;
     this.libManager      = libManager;
     this._configurations = new List <IConfiguration>();
 }
예제 #21
0
        static public string generate(IProject project, LibManager libManager, SetupData setup)
        {
            var cfg = project.selectedConfiguration;

            if (!cfg.isOk)
            {
                return("ERROR");
            }
            //if (cfg.setupType == SetupTypes.quick && (setup.arduinoBaseError != null)) return "Error: Arduino path not set!\n\nPlease switch to expert setup or define a \nvalid Arduino path in the Settings tab.";
            //if (cfg.setupType == SetupTypes.expert && !cfg.compilerBase.isOk) return "Error: Compiler path not set!";
            //if (cfg.setupType == SetupTypes.expert && !cfg.coreBase.isOk) return "Error: Hardware folder (folder containing boards.txt and the cores subfolder) is not set";
            var board = cfg.selectedBoard;
            //if (board == null) return "Error: No board selected";

            var options = board.getAllOptions();

            StringBuilder mf = new StringBuilder();

            mf.Append("#******************************************************************************\n");
            mf.Append("# Generated by VisualTeensy (https://github.com/luni64/VisualTeensy)\n");
            mf.Append("#\n");
            mf.Append($"# {"Board",-18} {board.name}\n");
            foreach (var o in board.optionSets)
            {
                mf.Append($"# {o.name,-18} {o.selectedOption?.name}\n");
            }
            mf.Append("#\n");
            mf.Append($"# {DateTime.Now.ToShortDateString()} {DateTime.Now.ToShortTimeString()}\n");
            mf.Append("#******************************************************************************\n");

            mf.Append($"SHELL            := cmd.exe\nexport SHELL\n\n");
            mf.Append($"TARGET_NAME      := {project.cleanName}\n");
            mf.Append(makeEntry("BOARD_ID         := ", "build.board", options) + "\n\n");
            mf.Append(makeEntry("MCU              := ", "build.mcu", options) + "\n\n");

            mf.Append($"LIBS_SHARED_BASE := {Helpers.getShortPath(libManager.sharedRepository?.repoPath)}\n");
            mf.Append($"LIBS_SHARED      := ");
            foreach (var lib in cfg.sharedLibs)
            {
                mf.Append($"{lib.sourceFolderName ?? "ERROR"} ");
            }
            mf.Append("\n\n");

            mf.Append($"LIBS_LOCAL_BASE  := lib\n");
            mf.Append($"LIBS_LOCAL       := ");
            foreach (var lib in cfg.localLibs)
            {
                mf.Append($"{lib.targetFolderName} ");
            }
            mf.Append("\n\n");

            //mf.Append($"CORE_BASE        := {Helpers.getShortPath(Path.Combine(setup.arduinoCoreBase ?? "Error", "cores", cfg.selectedBoard.core))}\n");

            if (cfg.setupType == SetupTypes.quick)
            {
                mf.Append($"CORE_BASE        := {Helpers.getShortPath(Path.Combine(setup.arduinoCoreBase ?? "Error", "cores", cfg.selectedBoard.core))}\n");
                mf.Append($"GCC_BASE         := {cfg.compiler}\n");
                mf.Append($"UPL_PJRC_B       := {Helpers.getShortPath(setup.arduinoTools)}\n");
            }
            else
            {
                mf.Append($"CORE_BASE        := {((cfg.copyCore || (Path.GetDirectoryName(cfg.coreBase.path) == project.path)) ? "core" : Helpers.getShortPath(cfg.core))}\n");
                mf.Append($"GCC_BASE         := {cfg.compiler}\n");
                if (!String.IsNullOrWhiteSpace(setup.uplPjrcBase.path))
                {
                    mf.Append($"UPL_PJRC_B       := {setup.uplPjrcBase.shortPath}\n");
                }
                //mf.Append($"UPL_PJRC_B       := {setup.uplPjrcBase.shortPath}\n");
            }
            if (!String.IsNullOrWhiteSpace(setup.uplTyBase.path))
            {
                mf.Append($"UPL_TYCMD_B      := {setup.uplTyBase.shortPath}\n");
            }
            if (!String.IsNullOrWhiteSpace(setup.uplJLinkBase.path))
            {
                mf.Append($"UPL_JLINK_B      := {setup.uplJLinkBase.shortPath}\n");
            }
            if (project.debugSupport != DebugSupport.none && !String.IsNullOrWhiteSpace(setup.uplCLIBase.path))
            {
                mf.Append($"UPL_CLICMD_B     := {setup.uplCLIBase.shortPath}\n");
            }


            mf.Append("\n#******************************************************************************\n");
            mf.Append("# Flags and Defines\n");
            mf.Append("#******************************************************************************\n");

            mf.Append(makeEntry("FLAGS_CPU   := ", "build.flags.cpu", options) + "\n");
            mf.Append(makeEntry("FLAGS_OPT   := ", "build.flags.optimize", options) + "\n");
            mf.Append(makeEntry("FLAGS_COM   := ", "build.flags.common", options) + makeEntry(" ", "build.flags.dep", options) + "\n");
            mf.Append(makeEntry("FLAGS_LSP   := ", "build.flags.ldspecs", options) + "\n");

            mf.Append("\n");
            mf.Append(makeEntry("FLAGS_CPP   := ", "build.flags.cpp", options) + "\n");
            mf.Append(makeEntry("FLAGS_C     := ", "build.flags.c", options) + "\n");
            mf.Append(makeEntry("FLAGS_S     := ", "build.flags.S", options) + "\n");

            mf.Append(makeEntry("FLAGS_LD    := ", "build.flags.ld", options).Replace("{build.core.path}", "$(CORE_BASE)") + "\n");

            mf.Append("\n");
            mf.Append(makeEntry("LIBS        := ", "build.flags.libs", options) + "\n");
            //mf.Append(makeEntry("LD_SCRIPT   := ", "build.mcu", options) + ".ld\n");

            mf.Append("\n");
            mf.Append(makeEntry("DEFINES     := ", "build.flags.defs", options) + makeEntry(" -DARDUINO_", "build.board", options) + " -DARDUINO=10813\n");
            mf.Append("DEFINES     += ");
            mf.Append(makeEntry("-DF_CPU=", "build.fcpu", options) + " " + makeEntry("-D", "build.usbtype", options) + " " + makeEntry("-DLAYOUT_", "build.keylayout", options) + "\n");

            mf.Append($"\n");
            mf.Append("CPP_FLAGS   := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_CPP)\n");
            mf.Append("C_FLAGS     := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_C)\n");
            mf.Append("S_FLAGS     := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_S)\n");
            mf.Append("LD_FLAGS    := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_LSP) $(FLAGS_LD)\n");
            mf.Append("AR_FLAGS    := rcs\n");
            mf.Append("NM_FLAGS    := --numeric-sort --defined-only --demangle --print-size\n");

            if (cfg.setupType == SetupTypes.expert && !String.IsNullOrWhiteSpace(cfg.makefileExtension))
            {
                mf.Append("\n");
                mf.Append(cfg.makefileExtension);
                mf.Append("\n");
            }

            mf.Append("\n#******************************************************************************\n");
            mf.Append("# Colors\n");
            mf.Append("#******************************************************************************\n");
            if (setup.isColoredOutput)
            {
                mf.Append($"COL_CORE    := {colEsc(setup.colorCore)}\n");
                mf.Append($"COL_LIB     := {colEsc(setup.colorUserLib)}\n");
                mf.Append($"COL_SRC     := {colEsc(setup.colorUserSrc)}\n");
                mf.Append($"COL_LINK    := {colEsc(setup.colorLink)}\n");
                mf.Append($"COL_ERR     := {colEsc(setup.colorErr)}\n");
                mf.Append($"COL_OK      := {colEsc(setup.colorOk)}\n");
                mf.Append($"COL_RESET   := {colReset}\n");
            }
            else
            {
                mf.Append($"COL_CORE    := {colReset}\n");
                mf.Append($"COL_Lib     := {colReset}\n");
                mf.Append($"COL_SRC     := {colReset}\n");
                mf.Append($"COL_LINK    := {colReset}\n");
                mf.Append($"COL_ERR     := {colReset}\n");
                mf.Append($"COL_OK      := {colReset}\n");
                mf.Append($"COL_RESET   := {colReset}\n");
            }

            mf.Append("\n");
            mf.Append("#******************************************************************************\n");
            mf.Append("# Folders and Files\n");
            mf.Append("#******************************************************************************\n");
            //if (cfg.setupType == SetupTypes.expert && project.buildSystem == BuildSystem.makefile && project.useInoFiles)
            //{
            //    mf.Append("USR_SRC         := .\n");
            //}
            //else
            //{
            mf.Append("USR_SRC         := src\n");
            //}
            mf.Append("LIB_SRC         := lib\n");
            mf.Append("CORE_SRC        := $(CORE_BASE)\n\n");

            mf.Append("BIN             := .vsteensy/build\n");
            mf.Append("USR_BIN         := $(BIN)/src\n");
            mf.Append("CORE_BIN        := $(BIN)/core\n");
            mf.Append("LIB_BIN         := $(BIN)/lib\n");
            mf.Append("CORE_LIB        := $(BIN)/core.a\n");
            mf.Append("TARGET_HEX      := $(BIN)/$(TARGET_NAME).hex\n");
            mf.Append("TARGET_ELF      := $(BIN)/$(TARGET_NAME).elf\n");
            mf.Append("TARGET_LST      := $(BIN)/$(TARGET_NAME).lst\n");
            mf.Append("TARGET_SYM      := $(BIN)/$(TARGET_NAME).sym\n");

            mf.Append("\n");
            mf.Append("#******************************************************************************\n");
            mf.Append("# BINARIES\n");
            mf.Append("#******************************************************************************\n");
            mf.Append("CC              := $(GCC_BASE)/arm-none-eabi-gcc\n");
            mf.Append("CXX             := $(GCC_BASE)/arm-none-eabi-g++\n");
            mf.Append("AR              := $(GCC_BASE)/arm-none-eabi-gcc-ar\n");
            mf.Append("NM              := $(GCC_BASE)/arm-none-eabi-gcc-nm\n");
            mf.Append("SIZE            := $(GCC_BASE)/arm-none-eabi-size\n");
            mf.Append("OBJDUMP         := $(GCC_BASE)/arm-none-eabi-objdump\n");
            mf.Append("OBJCOPY         := $(GCC_BASE)/arm-none-eabi-objcopy\n");
            mf.Append("UPL_PJRC        := \"$(UPL_PJRC_B)/teensy_post_compile\" -test -file=$(TARGET_NAME) -path=$(BIN) -tools=\"$(UPL_PJRC_B)\" -board=$(BOARD_ID) -reboot\n");
            mf.Append("UPL_TYCMD       := $(UPL_TYCMD_B)/tyCommanderC upload $(TARGET_HEX) --autostart --wait --multi\n");
            mf.Append("UPL_CLICMD      := $(UPL_CLICMD_B)/teensy_loader_cli -mmcu=$(MCU) -v $(TARGET_HEX)\n");
            mf.Append("UPL_JLINK       := $(UPL_JLINK_B)/jlink -commanderscript .vsteensy/flash.jlink\n");

            mf.Append("\n");
            mf.Append("#******************************************************************************\n");
            mf.Append("# Source and Include Files\n");
            mf.Append("#******************************************************************************\n");
            mf.Append("# Recursively create list of source and object files in USR_SRC and CORE_SRC\n");
            mf.Append("# and corresponding subdirectories.\n");
            mf.Append("# The function rwildcard is taken from http://stackoverflow.com/a/12959694)\n");

            mf.Append("\n");
            mf.Append("rwildcard =$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))\n");

            mf.Append("\n");
            mf.Append("#User Sources -----------------------------------------------------------------\n");
            //          if (cfg.setupType == SetupTypes.expert && project.buildSystem == BuildSystem.makefile && project.useInoFiles) mf.Append("USR_INO_FILE    := $(USR_SRC)/$(TARGET_NAME).ino\n");
            mf.Append("USR_C_FILES     := $(call rwildcard,$(USR_SRC)/,*.c)\n");
            mf.Append("USR_CPP_FILES   := $(call rwildcard,$(USR_SRC)/,*.cpp)\n");
            mf.Append("USR_S_FILES     := $(call rwildcard,$(USR_SRC)/,*.S)\n");
            mf.Append("USR_OBJ         := $(USR_S_FILES:$(USR_SRC)/%.S=$(USR_BIN)/%.o) $(USR_C_FILES:$(USR_SRC)/%.c=$(USR_BIN)/%.o) $(USR_CPP_FILES:$(USR_SRC)/%.cpp=$(USR_BIN)/%.o)\n");
            //          if (cfg.setupType == SetupTypes.expert && project.buildSystem == BuildSystem.makefile && project.useInoFiles) mf.Append("USR_OBJ         += $(USR_INO_FILE:$(USR_SRC)/%.ino=$(USR_BIN)/%.o)\n");

            mf.Append("\n");
            mf.Append("# Core library sources --------------------------------------------------------\n");
            mf.Append("CORE_CPP_FILES  := $(call rwildcard,$(CORE_SRC)/,*.cpp)\n");
            mf.Append("CORE_C_FILES    := $(call rwildcard,$(CORE_SRC)/,*.c)\n");
            mf.Append("CORE_S_FILES    := $(call rwildcard,$(CORE_SRC)/,*.S)\n");
            mf.Append("CORE_OBJ        := $(CORE_S_FILES:$(CORE_SRC)/%.S=$(CORE_BIN)/%.o) $(CORE_C_FILES:$(CORE_SRC)/%.c=$(CORE_BIN)/%.o) $(CORE_CPP_FILES:$(CORE_SRC)/%.cpp=$(CORE_BIN)/%.o)\n");

            mf.Append("\n");
            mf.Append("# User library sources (see https://github.com/arduino/arduino/wiki/arduino-ide-1.5:-library-specification)\n");
            mf.Append("LIB_DIRS_SHARED := $(foreach d, $(LIBS_SHARED), $(LIBS_SHARED_BASE)/$d/ $(LIBS_SHARED_BASE)/$d/utility/)      # base and /utility\n");
            mf.Append("LIB_DIRS_SHARED += $(foreach d, $(LIBS_SHARED), $(LIBS_SHARED_BASE)/$d/src/ $(dir $(call rwildcard,$(LIBS_SHARED_BASE)/$d/src/,*/.)))                          # src and all subdirs of base\n");

            mf.Append("\n");
            mf.Append("LIB_DIRS_LOCAL  := $(foreach d, $(LIBS_LOCAL), $(LIBS_LOCAL_BASE)/$d/ $(LIBS_LOCAL_BASE)/$d/utility/ )        # base and /utility\n");
            mf.Append("LIB_DIRS_LOCAL  += $(foreach d, $(LIBS_LOCAL), $(LIBS_LOCAL_BASE)/$d/src/ $(dir $(call rwildcard,$(LIBS_LOCAL_BASE)/$d/src/,*/.)))                          # src and all subdirs of base\n");

            mf.Append("\n");
            mf.Append("LIB_CPP_SHARED  := $(foreach d, $(LIB_DIRS_SHARED),$(call wildcard,$d*.cpp))\n");
            mf.Append("LIB_C_SHARED    := $(foreach d, $(LIB_DIRS_SHARED),$(call wildcard,$d*.c))\n");
            mf.Append("LIB_S_SHARED    := $(foreach d, $(LIB_DIRS_SHARED),$(call wildcard,$d*.S))\n");

            mf.Append("\n");
            mf.Append("LIB_CPP_LOCAL   := $(foreach d, $(LIB_DIRS_LOCAL),$(call wildcard,$d/*.cpp))\n");
            mf.Append("LIB_C_LOCAL     := $(foreach d, $(LIB_DIRS_LOCAL),$(call wildcard,$d/*.c))\n");
            mf.Append("LIB_S_LOCAL     := $(foreach d, $(LIB_DIRS_LOCAL),$(call wildcard,$d/*.S))\n");

            mf.Append("\n");
            mf.Append("LIB_OBJ         := $(LIB_CPP_SHARED:$(LIBS_SHARED_BASE)/%.cpp=$(LIB_BIN)/%.o)  $(LIB_CPP_LOCAL:$(LIBS_LOCAL_BASE)/%.cpp=$(LIB_BIN)/%.o)\n");
            mf.Append("LIB_OBJ         += $(LIB_C_SHARED:$(LIBS_SHARED_BASE)/%.c=$(LIB_BIN)/%.o)  $(LIB_C_LOCAL:$(LIBS_LOCAL_BASE)/%.c=$(LIB_BIN)/%.o)\n");
            mf.Append("LIB_OBJ         += $(LIB_S_SHARED:$(LIBS_SHARED_BASE)/%.S=$(LIB_BIN)/%.o)  $(LIB_S_LOCAL:$(LIBS_LOCAL_BASE)/%.S=$(LIB_BIN)/%.o)\n");

            mf.Append("\n");
            mf.Append("# Includes -------------------------------------------------------------\n");
            mf.Append("INCLUDE         := -I./$(USR_SRC) -I$(CORE_SRC)\n");
            mf.Append("INCLUDE         += $(foreach d, $(LIB_DIRS_SHARED), -I$d)\n");
            mf.Append("INCLUDE         += $(foreach d, $(LIB_DIRS_LOCAL), -I$d)\n");

            mf.Append("\n");
            mf.Append("# Generate directories --------------------------------------------------------\n");
            mf.Append("DIRECTORIES     :=  $(sort $(dir $(CORE_OBJ) $(USR_OBJ) $(LIB_OBJ)))\n");
            mf.Append("generateDirs    := $(foreach d, $(DIRECTORIES), $(shell if not exist \"$d\" mkdir \"$d\"))\n");

            mf.Append("\n");
            mf.Append("#$(info dirs: $(DIRECTORIES))\n");
            //mf.Append("$(info$(COL_RESET))\n");

            mf.Append("\n");
            mf.Append("#******************************************************************************\n");
            mf.Append("# Rules:\n");
            mf.Append("#******************************************************************************\n");

            mf.Append("\n");
            mf.Append(".PHONY: directories all rebuild upload uploadTy uploadCLI clean cleanUser cleanCore\n");

            mf.Append("\n");
            mf.Append("all:  $(TARGET_LST) $(TARGET_SYM) $(TARGET_HEX)\n");

            mf.Append("\n");
            mf.Append("rebuild: cleanUser all\n");

            mf.Append("\n");
            mf.Append("clean: cleanUser cleanCore cleanLib\n");
            mf.Append("\t@echo $(COL_OK)cleaning done$(COL_RESET)\n");

            mf.Append("\n");
            mf.Append("upload: all\n");
            mf.Append("\t@$(UPL_PJRC)\n");

            mf.Append("\n");
            mf.Append("uploadTy: all\n");
            mf.Append("\t@$(UPL_TYCMD)\n");

            mf.Append("\n");
            mf.Append("uploadCLI: all\n");
            mf.Append("\t@$(UPL_CLICMD)\n");

            mf.Append("\n");
            mf.Append("uploadJLink: all\n");
            mf.Append("\t@$(UPL_JLINK)\n");

            mf.Append("\n");
            mf.Append("# Core library ----------------------------------------------------------------\n");
            mf.Append("$(CORE_BIN)/%.o: $(CORE_SRC)/%.S\n");
            mf.Append("\t@echo $(COL_CORE)CORE [ASM] $(notdir $<) $(COL_ERR)\n");
            mf.Append("\t@\"$(CC)\" $(S_FLAGS) $(INCLUDE) -o $@ -c $<\n");

            mf.Append("\n");
            mf.Append("$(CORE_BIN)/%.o: $(CORE_SRC)/%.c\n");
            mf.Append("\t@echo $(COL_CORE)CORE [CC]  $(notdir $<) $(COL_ERR)\n");
            mf.Append("\t@\"$(CC)\" $(C_FLAGS) $(INCLUDE) -o $@ -c $<\n");

            mf.Append("\n");
            mf.Append("$(CORE_BIN)/%.o: $(CORE_SRC)/%.cpp\n");
            mf.Append("\t@echo $(COL_CORE)CORE [CPP] $(notdir $<) $(COL_ERR)\n");
            mf.Append("\t@\"$(CXX)\" $(CPP_FLAGS) $(INCLUDE) -o $@ -c $<\n");

            mf.Append("\n");
            mf.Append("$(CORE_LIB) : $(CORE_OBJ)\n");
            mf.Append("\t@echo $(COL_LINK)CORE [AR] $@ $(COL_ERR)\n");
            mf.Append("\t@$(AR) $(AR_FLAGS) $@ $^\n");
            mf.Append("\t@echo $(COL_OK)Teensy core built successfully &&echo.\n");

            mf.Append("\n");
            mf.Append("# Shared Libraries ------------------------------------------------------------\n");
            mf.Append("$(LIB_BIN)/%.o: $(LIBS_SHARED_BASE)/%.S\n");
            mf.Append("\t@echo $(COL_LIB)LIB [ASM] $(notdir $<) $(COL_ERR)\n");
            mf.Append("\t@\"$(CC)\" $(S_FLAGS) $(INCLUDE) -o $@ -c $<\n");

            mf.Append("\n");
            mf.Append("$(LIB_BIN)/%.o: $(LIBS_SHARED_BASE)/%.cpp\n");
            mf.Append("\t@echo $(COL_LIB)LIB [CPP] $(notdir $<) $(COL_ERR)\n");
            mf.Append("\t@\"$(CXX)\" $(CPP_FLAGS) $(INCLUDE) -o $@ -c $<\n");

            mf.Append("\n");
            mf.Append("$(LIB_BIN)/%.o: $(LIBS_SHARED_BASE)/%.c\n");
            mf.Append("\t@echo $(COL_LIB)LIB [CC]  $(notdir $<) $(COL_ERR)\n");
            mf.Append("\t@\"$(CC)\" $(C_FLAGS) $(INCLUDE) -o $@ -c $<\n");

            mf.Append("\n");
            mf.Append("# Local Libraries -------------------------------------------------------------\n");
            mf.Append("$(LIB_BIN)/%.o: $(LIBS_LOCAL_BASE)/%.S\n");
            mf.Append("\t@echo $(COL_LIB)LIB [ASM] $(notdir $<) $(COL_ERR)\n");
            mf.Append("\t@\"$(CC)\" $(S_FLAGS) $(INCLUDE) -o $@ -c $<\n");

            mf.Append("\n");
            mf.Append("$(LIB_BIN)/%.o: $(LIBS_LOCAL_BASE)/%.cpp\n");
            mf.Append("\t@echo $(COL_LIB)LIB [CPP] $(notdir $<) $(COL_ERR)\n");
            mf.Append("\t@\"$(CXX)\" $(CPP_FLAGS) $(INCLUDE) -o $@ -c $<\n");

            mf.Append("\n");
            mf.Append("$(LIB_BIN)/%.o: $(LIBS_LOCAL_BASE)/%.c\n");
            mf.Append("\t@echo $(COL_LIB)LIB [CC]  $(notdir $<) $(COL_ERR)\n");
            mf.Append("\t@\"$(CC)\" $(C_FLAGS) $(INCLUDE) -o $@ -c $<\n");

            mf.Append("\n");
            mf.Append("# Handle user sources ---------------------------------------------------------\n");
            //if (cfg.setupType == SetupTypes.expert && project.buildSystem == BuildSystem.makefile && project.useInoFiles)
            //{
            //    mf.Append("$(USR_BIN)/%.o: $(USR_SRC)/%.ino\n");
            //    mf.Append("\t@echo $(COL_SRC)USER [INO] $< $(COL_ERR)\n");
            //    mf.Append("\t@\"$(CC)\" $(CPP_FLAGS) $(INCLUDE) -include $(CORE_BASE)/Arduino.h -x c++ -o \"$@\" -c $< -x none\n");
            //    mf.Append("\n");
            //}

            mf.Append("$(USR_BIN)/%.o: $(USR_SRC)/%.S\n");
            mf.Append("\t@echo $(COL_SRC)USER [ASM] $< $(COL_ERR)\n");
            mf.Append("\t@\"$(CC)\" $(S_FLAGS) $(INCLUDE) -o \"$@\" -c $<\n");

            mf.Append("\n");
            mf.Append("$(USR_BIN)/%.o: $(USR_SRC)/%.c\n");
            mf.Append("\t@echo $(COL_SRC)USER [CC]  $(notdir $<) $(COL_ERR)\n");
            mf.Append("\t@\"$(CC)\" $(C_FLAGS) $(INCLUDE) -o \"$@\" -c $<\n");

            mf.Append("\n");
            mf.Append("$(USR_BIN)/%.o: $(USR_SRC)/%.cpp\n");
            mf.Append("\t@echo $(COL_SRC)USER [CPP] $(notdir $<) $(COL_ERR)\n");
            mf.Append("\t@\"$(CXX)\" $(CPP_FLAGS) $(INCLUDE) -o \"$@\" -c $<\n");

            mf.Append("\n");
            mf.Append("# Linking ---------------------------------------------------------------------\n");
            mf.Append("$(TARGET_ELF): $(CORE_LIB) $(LIB_OBJ) $(USR_OBJ)\n");
            mf.Append("\t@echo $(COL_LINK)\n");
            mf.Append("\t@echo [LD]  $@ $(COL_ERR)\n");
            mf.Append("\t@$(CC) $(LD_FLAGS) -o \"$@\" $(USR_OBJ) $(LIB_OBJ) $(CORE_LIB) $(LIBS)\n");
            mf.Append("\t@echo $(COL_OK)User code built and linked to libraries &&echo.\n");

            mf.Append("\n");
            mf.Append("%.lst: %.elf\n");
            mf.Append("\t@echo [LST] $@\n");
            mf.Append("\t@$(OBJDUMP) -d -S --demangle --no-show-raw-insn \"$<\" > \"$@\"\n");
            mf.Append("\t@echo $(COL_OK)Sucessfully built project$(COL_RESET) &&echo.\n");

            mf.Append("\n");
            mf.Append("%.sym: %.elf\n");
            mf.Append("\t@echo [SYM] $@\n");
            mf.Append("\t@$(NM) $(NM_FLAGS) \"$<\" > \"$@\"\n");

            mf.Append("\n");
            mf.Append("%.hex: %.elf\n");
            mf.Append("\t@echo $(COL_LINK)[HEX] $@\n");
            mf.Append("\t@$(OBJCOPY) -O ihex -R.eeprom \"$<\" \"$@\"\n");

            mf.Append("\n");
            mf.Append("# Cleaning --------------------------------------------------------------------\n");
            mf.Append("cleanUser:\n");
            mf.Append("\t@echo $(COL_LINK)Cleaning user binaries...$(COL_RESET)\n");
            mf.Append("\t@if exist $(USR_BIN) rd /s/q \"$(USR_BIN)\"\n");
            mf.Append("\t@if exist \"$(TARGET_LST)\" del $(subst /,\\,$(TARGET_LST))\n");

            mf.Append("\n");
            mf.Append("cleanCore:\n");
            mf.Append("\t@echo $(COL_LINK)Cleaning core binaries...$(COL_RESET)\n");
            mf.Append("\t@if exist $(CORE_BIN) rd /s/q \"$(CORE_BIN)\"\n");
            mf.Append("\t@if exist $(CORE_LIB) del  $(subst /,\\,$(CORE_LIB))\n");

            mf.Append("\n");
            mf.Append("cleanLib:\n");
            mf.Append("\t@echo $(COL_LINK)Cleaning user library binaries...$(COL_RESET)\n");
            mf.Append("\t@if exist $(LIB_BIN) rd /s/q \"$(LIB_BIN)\"\n");

            mf.Append("\n");
            mf.Append("# compiler generated dependency info ------------------------------------------\n");
            mf.Append("-include $(CORE_OBJ:.o=.d)\n");
            mf.Append("-include $(USR_OBJ:.o=.d)\n");
            mf.Append("-include $(LIB_OBJ:.o=.d)");

            return(mf.ToString());
        }
예제 #22
0
        static public string generate(IProject project, LibManager libManager, SetupData setup)
        {
            var cfg     = project.selectedConfiguration;
            var options = cfg.selectedBoard?.getAllOptions();

            if (options == null)
            {
                return("");
            }

            StringBuilder mf = new StringBuilder();

            mf.Append("#******************************************************************************\n");
            mf.Append("# Generated by VisualTeensy (https://github.com/luni64/VisualTeensy)\n");
            mf.Append("#\n");
            mf.Append($"# {"Board",-18} {cfg.selectedBoard.name}\n");
            foreach (var o in cfg.selectedBoard.optionSets)
            {
                mf.Append($"# {o.name,-18} {o.selectedOption?.name}\n");
            }
            mf.Append("#\n");
            mf.Append($"# {DateTime.Now.ToShortDateString()} {DateTime.Now.ToShortTimeString()}\n");
            mf.Append("#******************************************************************************\n");

            mf.Append($"SHELL            := cmd.exe\nexport SHELL\n\n");
            mf.Append($"TARGET_NAME      := {project.name?.Replace(" ", "_")}\n");
            mf.Append(makeEntry("BOARD_ID         := ", "build.board", options) + "\n\n");
            mf.Append(makeEntry("MCU              := ", "build.mcu", options) + "\n\n");

            mf.Append($"LIBS_SHARED_BASE := {Helpers.getShortPath(libManager.sharedRepositoryPath)}\n");
            mf.Append($"LIBS_SHARED      := ");
            foreach (var lib in cfg.sharedLibs)
            {
                mf.Append($"{lib.path ?? "ERROR"} "); //hack, improve library to distinguish between libraries to download and loacal libs
            }
            mf.Append("\n\n");

            mf.Append($"LIBS_LOCAL_BASE  := lib\n");
            mf.Append($"LIBS_LOCAL       := ");
            foreach (var lib in cfg.localLibs)
            {
                mf.Append($"{lib.path ?? lib.name} "); //hack, improve library to distinguish between libraries to download and loacal libs
            }
            mf.Append("\n\n");

            if (cfg.setupType == SetupTypes.quick)
            {
                mf.Append($"CORE_BASE        := {Helpers.getShortPath(setup.arduinoCore)}\n");
                mf.Append($"GCC_BASE         := {Helpers.getShortPath(setup.arduinoCompiler)}\n");
                mf.Append($"UPL_PJRC_B       := {Helpers.getShortPath(setup.arduinoTools)}\n");
            }
            else
            {
                mf.Append($"CORE_BASE        := {((cfg.copyCore || (Path.GetDirectoryName(cfg.coreBase) == project.path)) ? "core" : Helpers.getShortPath(cfg.coreBase))}\n");
                mf.Append($"GCC_BASE         := {Helpers.getShortPath(cfg.compilerBase)}\n");
                mf.Append($"UPL_PJRC_B       := {Helpers.getShortPath(setup.uplPjrcBase)}\n");
            }
            mf.Append($"UPL_TYCMD_B      := {Helpers.getShortPath(setup.uplTyBase)}\n");
            mf.Append($"UPL_CLICMD_B     := {Helpers.getShortPath(setup.uplCLIBase)}\n\n");



            mf.Append(makeEntry("FLAGS_CPU   := ", "build.flags.cpu", options) + "\n");
            mf.Append(makeEntry("FLAGS_OPT   := ", "build.flags.optimize", options) + "\n");
            mf.Append(makeEntry("FLAGS_COM   := ", "build.flags.common", options) + makeEntry(" ", "build.flags.dep", options) + "\n");
            mf.Append(makeEntry("FLAGS_LSP   := ", "build.flags.ldspecs", options) + "\n");

            mf.Append("\n");
            mf.Append(makeEntry("FLAGS_CPP   := ", "build.flags.cpp", options) + "\n");
            mf.Append(makeEntry("FLAGS_C     := ", "build.flags.c", options) + "\n");
            mf.Append(makeEntry("FLAGS_S     := ", "build.flags.S", options) + "\n");
            mf.Append(makeEntry("FLAGS_LD    := ", "build.flags.ld", options) + "\n");

            mf.Append("\n");
            mf.Append(makeEntry("LIBS        := ", "build.flags.libs", options) + "\n");
            mf.Append(makeEntry("LD_SCRIPT   := ", "build.mcu", options) + ".ld\n");

            mf.Append("\n");
            mf.Append(makeEntry("DEFINES     := ", "build.flags.defs", options) + " -DARDUINO=10807\n");
            mf.Append("DEFINES     += ");
            mf.Append(makeEntry("-DF_CPU=", "build.fcpu", options) + " " + makeEntry("-D", "build.usbtype", options) + " " + makeEntry("-DLAYOUT_", "build.keylayout", options) + "\n");

            mf.Append($"\n");
            mf.Append("CPP_FLAGS   := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_CPP)\n");
            mf.Append("C_FLAGS     := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_C)\n");
            mf.Append("S_FLAGS     := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_COM) $(DEFINES) $(FLAGS_S)\n");
            mf.Append("LD_FLAGS    := $(FLAGS_CPU) $(FLAGS_OPT) $(FLAGS_LSP) $(FLAGS_LD)\n");
            mf.Append("AR_FLAGS    := rcs\n");

            if (cfg.setupType == SetupTypes.expert && !String.IsNullOrWhiteSpace(cfg.makefileExtension))
            {
                mf.Append("\n");
                mf.Append(cfg.makefileExtension);
                mf.Append("\n");
            }

            mf.Append(setup.makefile_fixed);

            return(mf.ToString());
        }
예제 #23
0
 static public void mkGenerator(IProject project, LibManager libManager, SetupData setup)
 {
     // copy makefile ----------------------------------------------------------------------
 }
예제 #24
0
        public static string generate(IProject project, SetupData setup, LibManager libManager)
        {
            var cfg = project.selectedConfiguration;

            if (!cfg.isOk)
            {
                return("ERROR");
            }

            ;            var brd = cfg.selectedBoard;
            // if (project.selectedConfiguration.compilerBase == null || brd == null) return ""; // hack

            var props = new PropertiesJson()
            {
                configurations = new List <ConfigurationJson>()
                {
                    new ConfigurationJson()
                    {
                        name             = "VisualTeensy",
                        compilerPath     = Path.Combine(cfg.compiler, "arm-none-eabi-gcc.exe").Replace('\\', '/'),
                        intelliSenseMode = "gcc-x64",
                        includePath      = new List <string>(),
                        defines          = new List <string>()
                    }
                }
            };


            var cfgp = props.configurations[0];

            // include path -------------------------------------------------------------
            cfgp.includePath.Add("src/**");
            cfgp.includePath.Add(cfg.core.Replace('\\', '/'));

            foreach (var lib in cfg.sharedLibs)
            {
                cfgp.includePath.Add(Path.Combine(lib.sourceUri.LocalPath, "**").Replace('\\', '/'));
            }

            foreach (var lib in cfg.localLibs)
            {
                cfgp.includePath.Add(Path.Combine("lib", lib.targetFolderName, "**").Replace('\\', '/'));
            }

            // Compiler switches ----------------------------------------------------------

            var options = project.selectedConfiguration?.selectedBoard?.getAllOptions();

            if (options == null)
            {
                return("");
            }
            var defines = options.FirstOrDefault(o => o.Key == "build.flags.defs");

            if (defines.Value != null)
            {
                foreach (var define in defines.Value.Split(new string[] { "-D" }, StringSplitOptions.RemoveEmptyEntries))
                {
                    props.configurations[0].defines.Add(define.Trim());
                }
            }

            var boardDef = "ARDUINO_" + options.FirstOrDefault(o => o.Key == "build.board").Value;

            props.configurations[0].defines.Add(boardDef);

            addConfigOption(options, props, "F_CPU=", "build.fcpu");
            addConfigOption(options, props, "", "build.usbtype");
            addConfigOption(options, props, "LAYOUT_", "build.keylayout");
            props.configurations[0].defines.Add("ARDUINO");


            return(JsonConvert.SerializeObject(props, Formatting.Indented));
        }
예제 #25
0
 static public void ardGenerator(IProject project, LibManager libManager, SetupData setup)
 {
 }
예제 #26
0
        static public async Task generate(IProject project, LibManager libManager, SetupData setup, IProgress <string> progressHandler)
        {
            progressHandler.Report("Check or create folders");
            var vsCodeFolder   = Path.Combine(project.path, ".vscode");
            var vsTeensyFolder = Path.Combine(project.path, ".vsteensy");
            var buildFolder    = Path.Combine(project.path, vsTeensyFolder, "build");

            Directory.CreateDirectory(vsCodeFolder);
            Directory.CreateDirectory(vsTeensyFolder);
            Directory.CreateDirectory(buildFolder);

            await Task.Delay(1);

            progressHandler.Report("OK");

            // Intellisense -----------------------------------------------------------------------
            progressHandler.Report("Generate c_cpp_properties.json");
            var c_cpp_propsFile = Path.Combine(vsCodeFolder, "c_cpp_properties.json");
            var c_cpp_props     = IntellisenseFile.generate(project, libManager, setup);

            File.WriteAllText(c_cpp_propsFile, c_cpp_props);
            progressHandler.Report("OK");
            await Task.Delay(1);

            // Settings ---------------------------------------------------------------------------
            progressHandler.Report("Generate vsteensy.json");
            var settingsFile        = Path.Combine(vsTeensyFolder, "vsteensy.json");
            var projectSettingsJson = ProjectSettings.generate(project);

            File.WriteAllText(settingsFile, projectSettingsJson);
            progressHandler.Report("OK");
            await Task.Delay(1);

            // Makefile ---------------------------------------------------------------------------
            progressHandler.Report("Generate makefile");
            var makefile = Path.Combine(project.path, "makefile");

            File.WriteAllText(makefile, Makefile.generate(project, libManager, setup));
            progressHandler.Report("OK");
            await Task.Delay(1);

            // Task_json --------------------------------------------------------------------------
            progressHandler.Report("Generate tasks.json");
            var taskJsonFile = Path.Combine(vsCodeFolder, "tasks.json");
            var tasks_json   = TaskFile.generate(project, libManager, setup);

            File.WriteAllText(taskJsonFile, tasks_json);
            progressHandler.Report("OK");
            await Task.Delay(1);

            // BuildSystem Makefile ---------------------------------------------------------------
            if (project.buildSystem == BuildSystem.makefile)
            {
                string srcFolder = Path.Combine(project.path, "src");
                string libFolder = Path.Combine(project.path, "lib");
                Directory.CreateDirectory(srcFolder);
                Directory.CreateDirectory(libFolder);


                // copy local libraries -----------------------------------------------------------
                foreach (Library library in project.selectedConfiguration.localLibs)
                {
                    if (library.sourceType == Library.SourceType.local)
                    {
                        progressHandler.Report($"Copy library {library.name}");
                        await Task.Delay(1);

                        DirectoryInfo source = new DirectoryInfo(library.source);
                        DirectoryInfo target = new DirectoryInfo(Path.Combine(libFolder, library.path));
                        Helpers.copyFilesRecursively(source, target);

                        progressHandler.Report($"OK");
                        await Task.Delay(1);
                    }
                    else
                    {
                        progressHandler.Report($"Download library {library.name}");
                        await Task.Delay(1);

                        Helpers.downloadLibrary(library, libFolder);

                        progressHandler.Report($"OK");
                        await Task.Delay(1);
                    }
                }

                mainFile = Path.Combine(srcFolder, "main.cpp");
                if (!File.Exists(mainFile))
                {
                    progressHandler.Report($"{mainFile} generated");
                    File.WriteAllText(mainFile, Strings.mainCpp);
                    progressHandler.Report($"OK");
                    await Task.Delay(1);
                }
            }
            else    // BuildSystem Arduino Builder-------------------------------------------------
            {
                mainFile = Path.Combine(project.path, project.name + ".ino");
                if (!File.Exists(mainFile))
                {
                    progressHandler.Report($"{mainFile} generated");
                    File.WriteAllText(mainFile, Strings.sketchIno);
                    progressHandler.Report("OK");
                    await Task.Delay(1);
                }
            }
            progressHandler.Report("Start vsCode");
            await Task.Delay(1);

            Starter.start_vsCode(project.path, mainFile);
            progressHandler.Report("OK");
        }