Exemplo n.º 1
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);
        }
Exemplo n.º 2
0
 static public void mkGenerator(IProject project, LibManager libManager, SetupData setup)
 {
     // copy makefile ----------------------------------------------------------------------
 }
Exemplo n.º 3
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");
        }
Exemplo n.º 4
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);
     }
 }
Exemplo n.º 5
0
 static public void ardGenerator(IProject project, LibManager libManager, SetupData setup)
 {
 }
Exemplo n.º 6
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.coreStrategy == LibStrategy.copy)  ///Todo: other settings....
            {
                tasks.Add(new CopyCore(project));
            }

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

            return(tasks);
        }
Exemplo n.º 7
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;
        }
Exemplo n.º 8
0
        static public string generate(IProject project, LibManager libManager, SetupData setup)
        {
            var cfg = project.selectedConfiguration;

            if (!cfg.isOk)
            {
                return("ERROR");
            }
            var board   = cfg.selectedBoard;
            var options = board.getAllOptions();

            var v = System.Reflection.Assembly.GetEntryAssembly().GetName().Version;

            StringBuilder mf = new StringBuilder();

            mf.Append($"#******************************************************************************\n");
            mf.Append($"# Generated by VisualTeensy V{v.Major}.{v.Minor}.{v.Build} on {DateTime.Now.ToShortDateString()} at {DateTime.Now.ToShortTimeString()}\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($"# https://github.com/luni64/VisualTeensy\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.targetFolder} ");
            }
            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
            {
                switch (cfg.coreStrategy)
                {
                case LibStrategy.link:
                    mf.Append($"CORE_BASE        := {Helpers.getShortPath(Path.Combine(cfg.coreBase.path , "cores", cfg.selectedBoard.core))}\n");
                    break;

                case LibStrategy.copy:
                case LibStrategy.clone:
                    mf.Append($"CORE_BASE        := {Path.Combine("cores", cfg.selectedBoard.core)}\n");
                    break;
                }
                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");

            if (makeEntry("dummy", "build.flags.ld", options).Contains("TIME_SYM"))
            {
                mf.Append("TIME_SYM    := $(shell powershell [int][double]::Parse((Get-Date -UFormat %s)))" + "\n");
            }

            mf.Append("\n");
            mf.Append(makeEntry("FLAGS_CPU   := ", "build.flags.cpu", options) + "\n");


            string opt = makeEntry("FLAGS_OPT   := ", "build.flags.optimize", options);

            if (cfg.setupType == SetupTypes.expert && cfg.stdLib == StdLibType.nanolib && !opt.Contains("nano.specs"))
            {
                opt += " --specs=nano.specs";
            }
            mf.Append(opt + "\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("\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)/%.s.o) $(USR_C_FILES:$(USR_SRC)/%.c=$(USR_BIN)/%.c.o) $(USR_CPP_FILES:$(USR_SRC)/%.cpp=$(USR_BIN)/%.cpp.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)/%.s.o) $(CORE_C_FILES:$(CORE_SRC)/%.c=$(CORE_BIN)/%.c.o) $(CORE_CPP_FILES:$(CORE_SRC)/%.cpp=$(CORE_BIN)/%.cpp.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)/%.cpp.o)  $(LIB_CPP_LOCAL:$(LIBS_LOCAL_BASE)/%.cpp=$(LIB_BIN)/%.cpp.o)\n");
            mf.Append("LIB_OBJ         += $(LIB_C_SHARED:$(LIBS_SHARED_BASE)/%.c=$(LIB_BIN)/%.c.o)  $(LIB_C_LOCAL:$(LIBS_LOCAL_BASE)/%.c=$(LIB_BIN)/%.c.o)\n");
            mf.Append("LIB_OBJ         += $(LIB_S_SHARED:$(LIBS_SHARED_BASE)/%.S=$(LIB_BIN)/%.s.o)  $(LIB_S_LOCAL:$(LIBS_LOCAL_BASE)/%.S=$(LIB_BIN)/%.s.o)\n");

            mf.Append("\n");
            mf.Append("# Includes -------------------------------------------------------------\n");
            mf.Append("INCLUDE         := -I./$(USR_SRC) -I$(CORE_SRC)\n");
            mf.Append("INCLUDE         += $(foreach d, $(LIBS_LOCAL),-I$(LIBS_LOCAL_BASE)/$d/ -I$(LIBS_LOCAL_BASE)/$d/src -I$(LIBS_LOCAL_BASE)/$d/utility/)\n");
            mf.Append("INCLUDE         += $(foreach d, $(LIBS_SHARED), -I$(LIBS_SHARED_BASE)/$d/ -I$(LIBS_SHARED_BASE)/$d/src -I$(LIBS_SHARED_BASE)/$d/utility/)\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)/%.s.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)/%.c.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)/%.cpp.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)/%.s.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)/%.cpp.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)/%.c.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)/%.s.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)/%.cpp.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)/%.c.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)/%.s.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)/%.c.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)/%.cpp.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());
        }
Exemplo n.º 9
0
        static public string generate(IProject project, SetupData setup)
        {
            string make            = Path.Combine(setup.makeExeBase.path, "make.exe").Replace('\\', '/');
            string parallelExecute = project.buildSystem == BuildSystem.makefile ? "-j -Otarget" : "";

            var tasklist = new
            {
                patterns = new
                {
                    P1 = new { expression = "(path)\\(line)" }
                },

                commands = new[]
                {
                    new {
                        namspace     = "process-palette",
                        action       = "Build",
                        command      = make,
                        arguments    = new [] { "all", parallelExecute },
                        cwd          = "{projectPath}",
                        saveOption   = "all",
                        promptToSave = false,
                        keystroke    = "ctrl-shift-b",
                        group        = new Group(),
                        stream       = true,
                        patterns     = new  [] { "default" },
                        menus        = new[] { "vsTeensy" },
                    },
                    new {
                        namspace     = "process-palette",
                        action       = "Clean",
                        command      = make,
                        arguments    = new [] { "clean" },
                        cwd          = "{projectPath}",
                        saveOption   = "all",
                        promptToSave = false,
                        keystroke    = "ctrl-shift-c",
                        group        = new Group(),
                        stream       = true,
                        patterns     = new  [] { "default" },
                        menus        = new[] { "vsTeensy" },
                    },
                    new {
                        namspace     = "process-palette",
                        action       = "Upload (PJRC)",
                        command      = make,
                        arguments    = new [] { "upload", parallelExecute },
                        cwd          = "{projectPath}",
                        saveOption   = "all",
                        promptToSave = false,
                        keystroke    = "ctrl-shift-p",
                        group        = new Group(),
                        stream       = true,
                        patterns     = new  [] { "default" },
                        menus        = new[] { "vsTeensy" },
                    },
                    new {
                        namspace     = "process-palette",
                        action       = "Upload (TY-Tools)",
                        command      = make,
                        arguments    = new [] { "uploadTy", parallelExecute },
                        cwd          = "{projectPath}",
                        saveOption   = "all",
                        promptToSave = false,
                        keystroke    = "ctrl-shift-u",
                        group        = new Group(),
                        stream       = true,
                        patterns     = new  [] { "default" },
                        menus        = new[] { "vsTeensy" },
                    }
                }
            };

            return(JsonConvert.SerializeObject(tasklist, Formatting.Indented));
        }
Exemplo n.º 10
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);
        }
Exemplo n.º 11
0
 public LibManager(SetupData setup)
 {
     this.setup   = setup;
     repositories = new List <IRepository>();
     update();
 }
Exemplo n.º 12
0
 public static LibManager makeLibManager(SetupData setup)
 {
     return(new LibManager(setup));
 }
Exemplo n.º 13
0
 public static IProject makeProject(SetupData setup, LibManager libManager)
 {
     return(new Project(setup, libManager));
 }
Exemplo n.º 14
0
 public Project(SetupData setup, LibManager libManager)
 {
     this.setup           = setup;
     this.libManager      = libManager;
     this._configurations = new List <IConfiguration>();
 }
Exemplo n.º 15
0
        static public string generate(IProject project, SetupData setup)
        {
            string make = Path.Combine(setup.makeExeBase.path ?? "Error", "make.exe").Replace('\\', '/');
            string j    = project.buildSystem == BuildSystem.makefile ? "-j" : "";
            string O    = project.buildSystem == BuildSystem.makefile ? "-Otarget" : "";

            var tasks = new List <task>()
            {
                new task
                {
                    command = make,
                    label   = "Build",
                    args    = new List <string> {
                        "all", j, O
                    },
                },
                new task
                {
                    command = make,
                    label   = "Clean",
                    args    = new List <string> {
                        "clean"
                    },
                }
            };

            if (!String.IsNullOrWhiteSpace(setup.uplPjrcBase.path))
            {
                tasks.Add(new task
                {
                    command = make,
                    label   = "Upload (teensy.exe)",
                    args    = new List <string> {
                        "upload", j, O
                    }
                });
            }
            if (!String.IsNullOrWhiteSpace(setup.uplTyBase.path))
            {
                tasks.Add(new task
                {
                    command = make,
                    label   = "Upload (TyCommander)",
                    args    = new List <string> {
                        "uploadTy", j, O
                    }
                });
            }
            if (!String.IsNullOrWhiteSpace(setup.uplJLinkBase.path))
            {
                tasks.Add(new task
                {
                    command = make,
                    label   = "Upload (JLink)",
                    args    = new List <string> {
                        "uploadJLink", j, O
                    }
                });
            }
            if (!String.IsNullOrWhiteSpace(setup.uplCLIBase.path))
            {
                tasks.Add(new task
                {
                    command = make,
                    label   = "Upload (CLI)",
                    args    = new List <string> {
                        "uploadCLI", j, O
                    }
                });
            }

            var tasklist = new
            {
                tasks,
                version        = "2.0.0",
                type           = "shell",
                problemMatcher = "$gcc",
                presentation   = new
                {
                    echo             = true,
                    clear            = true,
                    reveal           = "always",
                    focus            = false,
                    panel            = "shared",
                    showReuseMessage = false,
                },
            };

            return(JsonConvert.SerializeObject(tasklist, Formatting.Indented));
        }
Exemplo n.º 16
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-arm",
                        cppStandard      = "gnu++14", // hack: might be better to extract from boards.txt
                        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));
        }