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"); } }
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); }
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(); }
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; }
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; }
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)); } }
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); } }
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"); }
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)); }
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)); }
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()); }
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); }
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)); }
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)); }
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; }
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); }
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"; } }
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()); }
public static IProject makeProject(SetupData setup, LibManager libManager) { return(new Project(setup, libManager)); }
public Project(SetupData setup, LibManager libManager) { this.setup = setup; this.libManager = libManager; this._configurations = new List <IConfiguration>(); }
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()); }
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()); }
static public void mkGenerator(IProject project, LibManager libManager, SetupData setup) { // copy makefile ---------------------------------------------------------------------- }
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)); }
static public void ardGenerator(IProject project, LibManager libManager, SetupData setup) { }
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"); }