Пример #1
0
        private bool BuildSourceBuilder(SourceBuilder Builder)
        {
            if (Builder.Rules.DependencyModulesName != null)
            {
                foreach (string dep in Builder.Rules.DependencyModulesName)
                {
                    if (!sourceBuilders.ContainsKey(dep))
                    {
                        ConsoleHelper.WriteLineWarning("Dependency [" + dep + "] doesn't exists");
                        continue;
                    }

                    SourceBuilder builder = sourceBuilders[dep];

                    if (builder == null)
                    {
                        return(false);
                    }

                    if (!BuildSourceBuilder(builder))
                    {
                        return(false);
                    }
                }
            }

            return(Builder.Build());
        }
Пример #2
0
        private void GenerateAndBuildProjectFile()
        {
            LogInfo();

            VCProjectFileGenerator vcproj = new VCProjectFileGenerator();

            vcproj.AssemblyName       = rules.TargetName;
            vcproj.OutputType         = LibraryUseTypesToOutputType(rules.LibraryUseType);
            vcproj.OutputPath         = BinariesPath;
            vcproj.Optimization       = VCProjectFileGenerator.Optimizations.Disabled;
            vcproj.MinimalRebuild     = true;
            vcproj.PlatformType       = BuildSystem.PlatformType;
            vcproj.BuildConfiguration = BuildSystem.BuildConfiguration;

            if (vcproj.BuildConfiguration == VCProjectFileGenerator.BuildConfigurations.Debug)
            {
                vcproj.GenerateDebugInformation = true;

                //if (rules.LibraryUseType == BuildRules.LibraryUseTypes.Executable)
                //	vcproj.RuntimeLibrary = VCProjectFileGenerator.RuntimeLibraries.MultiThreadedDebug;
                //else
                vcproj.RuntimeLibrary = VCProjectFileGenerator.RuntimeLibraries.MultiThreadedDebugDLL;
            }
            else
            {
                vcproj.GenerateDebugInformation = false;
            }
            {
                //if (rules.LibraryUseType == BuildRules.LibraryUseTypes.Executable)
                //	vcproj.RuntimeLibrary = VCProjectFileGenerator.RuntimeLibraries.MultiThreaded;
                //else
                vcproj.RuntimeLibrary = VCProjectFileGenerator.RuntimeLibraries.MultiThreadedDLL;
            }

            vcproj.PlatformType = VCProjectFileGenerator.PlatformTypes.Win32;

            vcproj.IncludeDirectories += sourcePathRoot;
            vcproj.IncludeDirectories += generatedFilesPath;
            if (rules.DependencyModulesName != null)
            {
                foreach (string dep in rules.DependencyModulesName)
                {
                    if (!BuildSystem.SourceBuilders.ContainsKey(dep))
                    {
                        continue;
                    }

                    SourceBuilder builder = BuildSystem.SourceBuilders[dep];

                    vcproj.IncludeDirectories += builder.sourcePathRoot;

                    if (builder.rules.LibraryUseType == BuildRules.LibraryUseTypes.UseOnly)
                    {
                        string[] libFiles = builder.rules.OutputsFilePath;

                        if (libFiles != null)
                        {
                            foreach (string libFile in libFiles)
                            {
                                vcproj.IncludeLibraries += builder.sourcePathRoot + libFile;
                            }
                        }
                    }
                    else
                    {
                        vcproj.PreprocessorDefinitions += GetAPIPreprocessor(builder.rules, true);

                        string[] libFiles = FileSystemUtilites.GetAllFiles(builder.BinariesPath, "*" + LibExtension);

                        if (libFiles != null)
                        {
                            foreach (string libFile in libFiles)
                            {
                                vcproj.IncludeLibraries += libFile;
                            }
                        }
                    }
                }
            }

            vcproj.PreprocessorDefinitions += GetAPIPreprocessor(rules, false);
            if (rules.PreprocessorDefinitions != null)
            {
                foreach (string def in rules.PreprocessorDefinitions)
                {
                    vcproj.PreprocessorDefinitions += def;
                }
            }

            if (rules.DependencyStaticLibraries != null)
            {
                foreach (string lib in rules.DependencyStaticLibraries)
                {
                    vcproj.IncludeLibraries += lib;
                }
            }

            bool isThisCommonModule = (rules.TargetName == "Common");

            string[] files = FileSystemUtilites.GetAllFiles(sourcePathRoot, "*.h*");
            foreach (string file in files)
            {
                if (BuildSystem.GenerateReflection && !isThisCommonModule)
                {
                    string outputBaseFileName = generatedFilesPath + Path.GetFileNameWithoutExtension(file) + ".Reflection";
                    if (ParseForReflection(file, outputBaseFileName))
                    {
                        vcproj.AddIncludeFile(outputBaseFileName + ".h");
                        vcproj.AddCompileFile(outputBaseFileName + ".cpp");
                    }
                }

                vcproj.AddIncludeFile(file);
            }

            if (rules.IncludeModulesName != null)
            {
                foreach (string moduleName in rules.IncludeModulesName)
                {
                    SourceBuilder builder = BuildSystem.SourceBuilders[moduleName];

                    vcproj.IncludeDirectories      += builder.sourcePathRoot;
                    vcproj.PreprocessorDefinitions += GetEmptyAPIPreprocessor(builder.rules);
                }
            }

            if (rules.AdditionalCompileFile != null)
            {
                foreach (string file in rules.AdditionalCompileFile)
                {
                    string fileInfo = FileSystemUtilites.PathSeperatorCorrection(file);
                    int    index    = fileInfo.IndexOf(EnvironmentHelper.PathSeparator);

                    vcproj.AddCompileFile(BuildSystem.SourceBuilders[fileInfo.Remove(index)].sourcePathRoot + fileInfo.Substring(index + 1));
                }
            }

            files = FileSystemUtilites.GetAllFiles(sourcePathRoot, "*.c", "*.cpp", "*.cxx");
            foreach (string file in files)
            {
                vcproj.AddCompileFile(file);
            }

            string vcprojPath = intermediateModulePath + rules.TargetName + ".vcxproj";

            vcproj.Generate(vcprojPath);

            BuildProjectFile(vcprojPath);
        }