Example #1
0
        static void AddPath(FileCompilationInfo entry, string prefix, string path)
        {
            if (string.IsNullOrWhiteSpace(path))
            {
                return;
            }

            foreach (var s in path?.Split(Path.PathSeparator))
            {
                entry.AddArg(prefix + QuatePath(s));
            }
        }
Example #2
0
        static FileCompilationInfo ProcessVCFile(ProgramOptions options, FileCompilationInfo entry, VCFile file, VCFileConfiguration fileConfig, string arch, bool isWin64)
        {
            //WriteLine($"{file.RelativePath}: {file.FileType},{file.Kind},{file.SubType},{file.ItemName},{file.UnexpandedRelativePath}");
            if (fileConfig.ExcludedFromBuild)
            {
                Console.Error.WriteLine($"warning: `{file.Name}` Excluded FromBuild.");
                return(null);
            }

            switch (file.FileType)
            {
            case eFileType.eFileTypeCppClass:
            case eFileType.eFileTypeCppCode:
            case eFileType.eFileTypeCppControl:
            case eFileType.eFileTypeCppForm:
            case eFileType.eFileTypeCppHeader:
            case eFileType.eFileTypeCppWebService:
                break;

            default:
                return(null);
            }
            var isHeader = (file.FileType == eFileType.eFileTypeCppHeader);

            WriteLine(file.RelativePath);
            if (options.OnlyConvertToUtf8 || options.ConvertToUtf8OnTheFly)
            {
                ConverToUtf8(file.FullPath);
                if (options.OnlyConvertToUtf8)
                {
                    return(null);
                }
            }

            entry.file = StripCurrentDir(file.RelativePath);

            VCConfiguration projectConfig = fileConfig.ProjectConfiguration;
            var             projectTool   = projectConfig.Tools.Item(VCCLCompilerToolName) is WCE.VCCLWCECompilerToolBase ?
                                            new WCECompilerToolWrapper(projectConfig.Tools.Item(VCCLCompilerToolName)) :
                                            projectConfig.Tools.Item(VCCLCompilerToolName) as VCCLCompilerTool;

            var fileTool = fileConfig.Tool is WCE.VCCLWCECompilerToolBase ?
                           new WCECompilerToolWrapper(fileConfig.Tool) :
                           fileConfig.Tool as VCCLCompilerTool;

            // if file is header, filetool is null.
            var tool = fileTool ?? projectTool;

            if (isHeader && !options.IncludesHeaderFiles)
            {
                return(null);
            }

            var createPch   = tool.UsePrecompiledHeader == pchOption.pchCreateUsingSpecific;
            var pchFilePath = fileConfig.Evaluate(tool.PrecompiledHeaderFile);

            entry.AddArg(isWin64 ? "-m64" : "-m32");
            entry.AddArg("--target=" + arch + "-pc-windows-msvc");

            entry.AddArg("-fshort-wchar");

            AddPath(entry, "-D ", fileConfig.Evaluate(projectTool.PreprocessorDefinitions + fileTool?.PreprocessorDefinitions) ?? "");
            AddPath(entry, "-U ", fileConfig.Evaluate(projectTool.UndefinePreprocessorDefinitions + fileTool?.UndefinePreprocessorDefinitions) ?? "");
            AddPath(entry, "-I ", tool.FullIncludePath);
            AddPath(entry, "-include ", fileConfig.Evaluate(tool.ForcedIncludeFiles ?? projectTool.ForcedIncludeFiles));

            if (createPch)
            {
                entry.output = pchFilePath;
                entry.AddArg("-o");
                entry.AddArg(QuatePath(entry.output));
            }
            else if (isHeader)
            {
                entry.AddArg("-S"); // Only run preprocess and compilation steps
                // fsyntax-only
            }
            else
            {
                entry.AddArg("-c"); // Only run preprocess, compile, and assemble steps

                entry.output = Path.Combine(fileConfig.Evaluate(tool.ObjectFile), Path.ChangeExtension(file.Name, ".obj"));
                entry.AddArg("-o");
                entry.AddArg(QuatePath(entry.output));
            }

            if (tool.UsePrecompiledHeader == pchOption.pchUseUsingSpecific)
            {
                entry.AddArg("-include-pch");
                entry.AddArg(QuatePath(pchFilePath));
            }


            switch (tool.WarningLevel)
            {
            case warningLevelOption.warningLevel_4:
                entry.AddArg("-Wall");
                entry.AddArg("-Wextra");
                entry.AddArg("-Wno-undef");
                entry.AddArg("-Wno-c++11-extensions");
                entry.AddArg("-Wno-unknown-pragmas");

                //entry.AddArg("-Wno-old-style-cast");
                //entry.AddArg("-Wno-gnu-anonymous-struct");
                //entry.AddArg("-Wno-gnu-zero-variadic-macro-arguments");
                //entry.AddArg("-Wno-reserved-id-macro");
                //entry.AddArg("-Wno-c++11-long-long");
                //entry.AddArg("-Wno-language-extension-token");
                //entry.AddArg("-Wno-non-virtual-dtor");
                //entry.AddArg("-Wno-dollar-in-identifier-extension");
                //entry.AddArg("-Wno-zero-length-array");
                break;

            case warningLevelOption.warningLevel_3:
            case warningLevelOption.warningLevel_2:
            case warningLevelOption.warningLevel_1:
                entry.AddArg("-Wall");

                break;
            }

            if (!options.NowWarnAsError && tool.WarnAsError)
            {
                entry.AddArg("-Werror");
            }

            switch (tool.Optimization)
            {
            case optimizeOption.optimizeFull:
                entry.AddArg("-O3");
                break;

            case optimizeOption.optimizeMaxSpeed:
                entry.AddArg("-O2");
                break;

            case optimizeOption.optimizeMinSpace:
                entry.AddArg("-O1");
                break;
            }

            if (tool.DebugInformationFormat != debugOption.debugDisabled)
            {
                entry.AddArg("-g");
            }

            entry.AddArg(tool.RuntimeTypeInfo ? "-frtti" : "-fno-rtti");

            switch (tool.ExceptionHandling)
            {
            case cppExceptionHandling.cppExceptionHandlingYesWithSEH:
                entry.AddArg("-fseh-exceptions");
                if (tool.CompileAs == CompileAsOptions.compileAsCPlusPlus)
                {
                    entry.AddArg("-fcxx-exceptions");
                }
                break;

            case cppExceptionHandling.cppExceptionHandlingYes:
                entry.AddArg("-fcxx-exceptions");
                break;

            case cppExceptionHandling.cppExceptionHandlingNo:
                entry.AddArg("-fno-cxx-exceptions");
                break;
            }

            switch (tool.InlineFunctionExpansion)
            {
            case inlineExpansionOption.expandDisable:
                entry.AddArg("-fno-inline-functions");
                break;

            case inlineExpansionOption.expandOnlyInline:
                entry.AddArg("-finline-hint-functions");
                break;

            case inlineExpansionOption.expandAnySuitable:
                entry.AddArg("-finline-functions");
                break;
            }

            if (tool.EnableIntrinsicFunctions)
            {
                entry.AddArg("-fbuiltin");
            }

            switch (tool.CompileAs)
            {
            case CompileAsOptions.compileAsC:
                entry.AddArg("-x c" + (createPch ? "-header" : ""));
                entry.AddArg("-std=c99");
                break;

            case CompileAsOptions.compileAsCPlusPlus:
                entry.AddArg("-x c++" + (createPch ? "-header" : ""));
                entry.AddArg("-std=c++03");
                break;
            }

            {
                string msvcVer = default;
                (file.project as VCProject).Version(out var major, out var minor);
                switch ($"{ major}.{minor}")
                {
                case "8.0":
                    msvcVer = "14.00";
                    break;

                case "7.1":
                    msvcVer = "13.10";
                    break;

                case "7.0":
                    msvcVer = "13.00";
                    break;

                default:
                case "9.0":
                    msvcVer = "15.00";
                    break;
                }
                entry.AddArg("-fms-compatibility-version=" + msvcVer);
            }

            switch (tool.CallingConvention)
            {
            case callingConventionOption.callConventionCDecl:
                //entry.AddArg("-fdefault-calling-conv=cdecl");
                break;

            case callingConventionOption.callConventionStdCall:
                entry.AddArg("-mrtd");
                //entry.AddArg("-fdefault-calling-conv=stdcall");
                break;

            case callingConventionOption.callConventionFastCall:
                Console.Error.WriteLine($"warning: Not supported CallingConvention: {tool.CallingConvention}.");
                //entry.AddArg("-fdefault-calling-conv=fastcall");
                break;
            }

            string crt = default;

            switch (tool.RuntimeLibrary)
            {
            case runtimeLibraryOption.rtMultiThreaded:
                entry.AddArg("-D_MT");
                crt = "--dependent-lib=libcmt";
                break;

            case runtimeLibraryOption.rtMultiThreadedDebug:
                entry.AddArg("-D_MT");
                crt = "--dependent-lib=libcmtd";
                break;

            case runtimeLibraryOption.rtMultiThreadedDLL:
                entry.AddArg("-D_MT");
                entry.AddArg("-D_DLL");
                crt = "--dependent-lib=msvcrt";
                break;

            case runtimeLibraryOption.rtMultiThreadedDebugDLL:
                entry.AddArg("-D_MT");
                entry.AddArg("-D_DLL");
                crt = "--dependent-lib=msvcrtd";
                break;
            }
            if (tool.OmitDefaultLibName)
            {
                entry.AddArg("-D_VC_NODEFAULTLIB");
            }
            else
            {
                //TODO entry.AddArg(crt);
            }

            if (!tool.DisableLanguageExtensions)
            {
                entry.AddArg("-fms-extensions");
                entry.AddArg("-Wno-microsoft-goto");
                entry.AddArg("-Wno-microsoft-exception-spec");
                entry.AddArg("-Wno-microsoft-enum-value");
                entry.AddArg("-Wno-microsoft-comment-paste");
                entry.AddArg("-Wno-microsoft-cast");
                entry.AddArg("-Wno-microsoft-anon-tag");
            }

            if (tool.BufferSecurityCheck)
            {
                entry.AddArg("-fstack-protector");
            }

            if (tool.ShowIncludes)
            {
                entry.AddArg("--trace-includes");
            }

            if (tool.UndefineAllPreprocessorDefinitions)
            {
                entry.AddArg("-undef");
            }

            if (!tool.StringPooling)
            {
                entry.AddArg("-fwritable-strings");
            }

            if (tool.DefaultCharIsUnsigned)
            {
                entry.AddArg("-fno-signed-char");
            }

            switch (tool.StructMemberAlignment)
            {
            case structMemberAlignOption.alignSingleByte:
                entry.AddArg("-fpack-struct=1");
                break;

            case structMemberAlignOption.alignTwoBytes:
                entry.AddArg("-fpack-struct=2");
                break;

            case structMemberAlignOption.alignFourBytes:
                entry.AddArg("-fpack-struct=4");
                break;

            case structMemberAlignOption.alignEightBytes:
                entry.AddArg("-fpack-struct=8");
                break;

            case structMemberAlignOption.alignSixteenBytes:
                entry.AddArg("-fpack-struct=16");
                break;

            case structMemberAlignOption.alignNotSet:
                break;
            }

            if (tool.OmitFramePointers)
            {
                entry.AddArg("-momit-leaf-frame-pointer");
            }

            switch (tool.floatingPointModel)
            {
            case floatingPointModel.FloatingPointFast:
                entry.AddArg("-ffast-math");
                break;
            }

            if (tool.EnablePREfast)
            {
                entry.AddArg("--analyze");
            }

            entry.AddArg(QuatePath(entry.file));

            if (options.PrintClangCommand)
            {
                Console.Error.WriteLine(entry.ToString());
            }

            return(entry);
        }