Ejemplo n.º 1
0
        internal VcxProject CreateVcxTemplate()
        {
            VcxProject proj = new VcxProject();
            {
                _proj_config = ProjectConfigKind.Debug;

                ConfigSetup();
                ProjectConfiguration projConfig = NewProjectConfig();
                proj.Configurations.Add(projConfig);
            }
            {
                _proj_config = ProjectConfigKind.Release;

                ConfigSetup();
                ProjectConfiguration projConfig = NewProjectConfig();
                proj.Configurations.Add(projConfig);
            }

            GlobalsPropertyGroup globalsProp = proj.GlobalsPropertyGroup;

            globalsProp.ProjectGuid = "{" + Guid.NewGuid() + "}";
            globalsProp.WindowsTargetPlatformVersion = "10.0.18362.0";
            globalsProp.Keyword     = "Win32Proj";
            globalsProp.Platform    = _platform;
            globalsProp.ProjectName = ProjectName; //TODO:
            globalsProp.VCProjectUpgraderObjectName = "NoUpgrade";

            //
            proj.ProjectFileVersion = _projFileVersion;
            proj.CppDefaultProp     = new Import {
                Project = @"$(VCTargetsPath)\Microsoft.Cpp.Default.props"
            };
            proj.CppProp = new Import {
                Project = @"$(VCTargetsPath)\Microsoft.Cpp.props"
            };
            //---------------

            proj.InputItems = _inputs;


            foreach (InputItem item in _inputs)
            {
                //resolve path to abs path
                if (!Path.IsPathRooted(item.Include) ||
                    !File.Exists(item.Include))
                {
                    throw new NotSupportedException();
                }
            }

            proj.PropertySheets = new PropertySheets()
            {
                Import = new Import()
                {
                    Label     = "LocalAppDataPlatform",
                    Project   = @"$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props",
                    Condition = @"exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')",
                }
            };

            return(proj);
        }
Ejemplo n.º 2
0
        public static void GenerateOutput(this VcxProject proj, XmlOutputGen output)
        {
            output.AddXmlHeader();
            output.BeginElem("Project");
            {
                //----
                output.AddAttribute(nameof(proj.DefaultTargets), proj.DefaultTargets);
                output.AddAttribute(nameof(proj.ToolVersion), proj.ToolVersion);
                output.AddAttribute("xmlns", "http://schemas.microsoft.com/developer/msbuild/2003");
                //----
                output.BeginElem(PROPERTY_GROUP);
                output.AppendSimpleElem(nameof(proj.PreferredToolArchitecture), proj.PreferredToolArchitecture);
                output.EndElem();
            }
            //----
            //1.
            GenPropertyConfigs(output, proj.Configurations);
            //2. global prop
            GenGlobalsProp(output, proj.GlobalsPropertyGroup);
            //3.
            GenImport(output, proj.CppDefaultProp);
            //4. gen property groups's condition config
            GenPropertyConfigs2(output, proj.Configurations);
            //5. import
            GenImport(output, proj.CppProp);
            //6.
            GenPropertySheet(output, proj.PropertySheets);
            //7.
            GenOutputConfigs(output, proj.ProjectFileVersion, proj.Configurations);
            //8.
            GenerateItemGroupDef(output, proj.Configurations);

            //9.
            output.BeginElem(ITEM_GROUP);
            {
                foreach (InputItem inputItem in proj.InputItems)
                {
                    string elem_name = "";
                    switch (inputItem.InputKind)
                    {
                    default: throw new NotSupportedException();

                    case InputKind.ClCompile:
                        elem_name = nameof(InputKind.ClCompile);
                        break;

                    case InputKind.ClInclude:
                        elem_name = nameof(InputKind.ClInclude);
                        break;

                    case InputKind.Object:
                        elem_name = nameof(InputKind.Object);
                        break;
                    }
                    output.BeginElem(elem_name);
                    output.AddAttribute(nameof(inputItem.Include), inputItem.Include);
                    output.EndElem();
                }
            }
            output.EndElem();//item group
            //-----
            //10.
            GenImport(output, new Import {
                Project = @"$(VCTargetsPath)\Microsoft.Cpp.targets"
            });
            output.BeginElem(IMPORT_GROUP);
            output.AddAttribute("Label", "ExtensionTargets");
            output.EndElem();
            //
            //<ImportGroup Label="ExtensionTargets">

            output.EndElem(); //Project
        }
Ejemplo n.º 3
0
        public void RebuildLibraryAndAPI()
        {
            UpdateMsBuildPath();


            ProjectConfigKind configKind = ProjectConfigKind;
            SimpleVcxProjGen  gen        = new SimpleVcxProjGen();
            //set some proprties

            //eg. IspcFilename=> simple.ispc

            string onlyProjectName = ProjectName;

            gen.ProjectName = onlyProjectName; //project name and output

            string current_dir = Directory.GetCurrentDirectory();
            string tmp_dir     = current_dir + "/temp";

            gen.FullProjSrcPath   = current_dir;
            gen.FullProjBuildPath = tmp_dir;
            string finalProductName = gen.GetFinalProductName(configKind);

            //build ispc
            if (!Directory.Exists(tmp_dir))
            {
                Directory.CreateDirectory(tmp_dir);
            }
            //-------------
            //save primary source and header
            string prim_src_filename    = tmp_dir + "/main_src.cpp";
            string prim_header_filename = tmp_dir + "/main_src.h";

            File.WriteAllText(prim_src_filename, PrimarySource);
            File.WriteAllText(prim_header_filename, PrimaryHeader);
            gen.AddCompileFile(prim_src_filename);
            gen.AddIncludeFile(prim_header_filename);

            //string c_interface_filename = gen.FullProjSrcPath + "/" + onlyProjectName + ".cpp";

            //CodeCompilationUnit cu = ParseAutoGenHeaderFromFile(ispc_header);

            //GenerateCBinder(cu, ispc_header, c_interface_filename);

            //string cs_method_invoke_filename = onlyProjectName + ".cs"; //save to

            //GenerateCsBinder(cu, ispc_header, cs_method_invoke_filename, Path.GetFileName(finalProductName));

            ////move cs code to src folder
            //if (AutoCsTargetFile != null)
            //{
            //    MoveFileOrReplaceIfExists(cs_method_invoke_filename, AutoCsTargetFile);
            //}

            //-------------

            if (AdditionalInputItems != null)
            {
                foreach (string s in AdditionalInputItems)
                {
                    switch (Path.GetExtension(s))
                    {
                    default: throw new NotSupportedException();

                    case ".c":
                    case ".cpp":
                        gen.AddCompileFile(s);
                        break;

                    case ".h":
                    case ".hpp":
                        gen.AddIncludeFile(s);
                        break;

                    case ".obj":
                        gen.AddObjectFile(s);
                        break;
                    }
                }
            }

            VcxProject   project   = gen.CreateVcxTemplate();
            XmlOutputGen xmlOutput = new XmlOutputGen();

            project.GenerateOutput(xmlOutput);

            string vxs_projOutputFilename = "myvcx_autogen.xml.vcxproj";

            File.WriteAllText(vxs_projOutputFilename, xmlOutput.Output.ToString());

            //debug build or release build

            string p_config = "";

            switch (configKind)
            {
            default: throw new NotSupportedException();

            case ProjectConfigKind.Debug:
                p_config = " /p:configuration=debug";
                break;

            case ProjectConfigKind.Release:
                p_config = " /p:configuration=release";
                break;
            }

            System.Diagnostics.Process proc1 = System.Diagnostics.Process.Start(s_MsBuildPath, vxs_projOutputFilename + p_config);
            proc1.WaitForExit();
            int exit_code1 = proc1.ExitCode;

            if (exit_code1 != 0)
            {
                throw new NotSupportedException();
            }
            //build pass, then copy the result dll back
            MoveFileOrReplaceIfExists(finalProductName, Path.GetFileName(finalProductName));
        }