cmake flags

[CMake] Selecting runtime library on Visual Studio projects Sylvain Benner benner at virtools.com Tue Jul 18 06:11:21 EDT 2006

Previous message: AW: [CMake] Selecting runtime library on Visual Studio projects
Next message: AW: [CMake] Selecting runtime library on Visual Studio projects
Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]

Hi,

I think you can't override a flag in the current version of CMake (release or CVS) because the loop that parses the flag string do not provide this. I changed this function in order to override easily the flags in the low level configuration files.

I attached the modified flag table for compiler and the modified function that loop on this table Note that there are imaginery flags that do not exist in VS. With these imaginery flags we can set the default options without forcing them in the code. There are also some flags for VS2005 (especially for exception handling).

With this code you can override a flag with this macro :

MACRO(ADD_FLAG where flag)

SET(${where} "${flag} ${${where}}")

ENDMACRO(ADD_FLAG)

// example : override a subsystem flag

ADD_FLAG(CMAKE_EXE_LINKER_FLAGS /SUBSYSTEM:CONSOLE) -------------- next part -------------- Flag Table ================================================================================

cmVS7FlagTable cmLocalVisualStudio7GeneratorMPCompilerFlagTable[] =

{

// option flags (some flags map to the same option)

// C/C++ ----------------------------------------------------------------------------------------------

// General

{"DebugInformationFormat", "Z7", "debug format", "1"},

{"DebugInformationFormat", "Zd", "debug format", "2"},

{"DebugInformationFormat", "Zi", "debug format", "3"},

{"DebugInformationFormat", "ZI", "debug format", "4"},

{"SuppressStartupBanner", "logo", "DO not SuppressStartupBanner", "FALSE"},

{"SuppressStartupBanner", "nologo", "SuppressStartupBanner", "TRUE"},

{"WarningLevel", "W1", "Warning level", "1"},

{"WarningLevel", "W2", "Warning level", "2"},

{"WarningLevel", "W3", "Warning level", "3"},

{"WarningLevel", "W4", "Warning level", "4"},

{"Detect64BitPortabilityProblems", "Wp64", "Detect 64-bit Portability Issues", "TRUE"},

{"Detect64BitPortabilityProblems", "noWp64", "Do not Detect 64-bit Portability Issues", "FALSE"},

{"WarnAsError", "WX", "Treat warnings as errors", "TRUE"},

{"WarnAsError", "noWX", "Do not Treat warnings as errors", "FALSE"},

// Optimization

{"Optimization", "Od", "Non Debug", "0"},

{"Optimization", "O1", "Min Size", "1"},

{"Optimization", "O2", "Max Speed", "2"},

{"Optimization", "Ox", "Max Optimization", "3"},

{"GlobalOptimizations", "Og", "Global Optimizations", "TRUE"},

{"GlobalOptimizations", "noOg", "Do not Global Optimizations", "FALSE"},

{"InlineFunctionExpansion", "Ob0", "no inlines", "0"},

{"InlineFunctionExpansion", "Ob1", "when inline keyword", "1"},

{"InlineFunctionExpansion", "Ob2", "any time you can inline", "2"},

{"EnableIntrinsicFunctions", "Oi", "EnableIntrinsicFunctions", "TRUE"},

{"EnableIntrinsicFunctions", "noOi", "Do not EnableIntrinsicFunctions", "FALSE"},

{"ImproveFloatingPointConsistency", "Op", "ImproveFloatingPointConsistency", "TRUE"},

{"ImproveFloatingPointConsistency", "noOp", "Do not ImproveFloatingPointConsistency", "FALSE"},

{"FavorSizeOrSpeed", "Ot", "Favor fast code", "1"},

{"FavorSizeOrSpeed", "Os", "Favor small code", "2"},

{"OmitFramePointers", "Oy", "OmitFramePointers", "TRUE"},

{"OmitFramePointers", "noOy", "Do not OmitFramePointers", "FALSE"},

{"EnableFibreSafeOptimization", "GT", "OmitFramePointers", "TRUE"},

{"EnableFibreSafeOptimization", "noGT", "Don't OmitFramePointers", "FALSE"},

{"OptimizeForProcessor", "GB", "Blended processor mode", "0"},

{"OptimizeForProcessor", "G5", "Pentium", "1"},

{"OptimizeForProcessor", "G6", "PPro PII PIII", "2"},

{"OptimizeForProcessor", "G7", "Pentium 4 or Athlon", "3"},

{"OptimizeForWindowsApplication", "GA", "Optimize for windows", "TRUE"},

{"OptimizeForWindowsApplication", "noGA", "Do not Optimize for windows", "FALSE"},

// Code Generation

{"StringPooling", "noGF", "Disable read-only string pooling", "FALSE"},

{"StringPooling", "GF", "Enable read-only string pooling", "TRUE"},

{"MinimalRebuild", "Gm", "minimal rebuild", "TRUE"},

{"MinimalRebuild", "noGm", "Do not minimal rebuild", "FALSE"},

{"ExceptionHandling", "EHsc2005", "Enable c++ exceptions", "1"},

{"ExceptionHandling", "noEHsc2005", "Do not enable c++ exceptions", "0"},

{"ExceptionHandling", "EHa", "Enable c++ exceptions with SEH exceptions", "2"},

{"ExceptionHandling", "EHsc", "enable c++ exceptions", "TRUE"},

{"ExceptionHandling", "noEHsc", "Do not enable c++ exceptions", "FALSE"},

{"ExceptionHandling", "GX", "enable c++ exceptions", "TRUE"},

{"ExceptionHandling", "noGX", "Do not enable c++ exceptions", "FALSE"},

{"SmallerTypeCheck", "RTCc", "smaller type check", "TRUE"},

{"SmallerTypeCheck", "noRTCc", "Do not smaller type check", "FALSE"},

{"BasicRuntimeChecks", "GZ", "Stack frame checks", "1"},

{"BasicRuntimeChecks", "RTCsu", "Both stack and uninitialized checks ", "3"},

{"BasicRuntimeChecks", "RTC1", "Both stack and uninitialized checks ", "3"},

{"BasicRuntimeChecks", "RTCs", "Stack frame checks", "1"},

{"BasicRuntimeChecks", "RTCu", "Uninitialized Variables ", "2"},

{"RuntimeLibrary", "MTd", "Multithreded debug", "1"},

{"RuntimeLibrary", "MT", "Multithreded", "0"},

{"RuntimeLibrary", "MDd", "Multithreded dll debug", "3"},

{"RuntimeLibrary", "MD", "Multithreded dll", "2"},

{"RuntimeLibrary", "MLd", "Sinble Thread debug", "5"},

{"RuntimeLibrary", "ML", "Sinble Thread", "4"},

{"StructMemberAlignment", "Zp16", "struct align 16 byte ", "5"},

{"StructMemberAlignment", "Zp1", "struct align 1 byte ", "1"},

{"StructMemberAlignment", "Zp2", "struct align 2 byte ", "2"},

{"StructMemberAlignment", "Zp4", "struct align 4 byte ", "3"},

{"StructMemberAlignment", "Zp8", "struct align 8 byte ", "4"},

{"BufferSecurityCheck", "GS", "Buffer security check", "TRUE"},

{"BufferSecurityCheck", "noGS", "Don't Buffer security check", "FALSE"},

{"EnableFunctionLevelLinking", "Gy", "EnableFunctionLevelLinking", "TRUE"},

{"EnableFunctionLevelLinking", "noGy", "Do not EnableFunctionLevelLinking", "FALSE"},

{"EnableEnhancedInstructionSet", "arch:SSE2", "Use sse2 instructions", "2"},

{"EnableEnhancedInstructionSet", "arch:SSE", "Use sse instructions", "1"},

{"OpenMP", "openmp", "Enable OpenMP support", "TRUE"},

{"OpenMP", "noopenmp", "Do not enable OpenMP support", "FALSE"},

// Language

{"TreatWChar_tAsBuiltInType", "Zc:wchar_t", "Treats wchar_t as a built-in type", "TRUE"},

{"TreatWChar_tAsBuiltInType", "noZc:wchar_t", "Do not Treats wchar_t as a built-in type", "FALSE"},

{"ForceConformanceInForLoopScope", "Zc:forScope", "force conform local scope in for loop", "TRUE"},

{"ForceConformanceInForLoopScope", "noZc:forScope","No force conform local scope in for loop", "FALSE"},

{"RuntimeTypeInfo", "GR", "Turn on Run time type information for c++", "TRUE"},

{"RuntimeTypeInfo", "noGR", "Turn off Run time type information for c++","FALSE"},

// Precompiled Headers

{"UsePrecompiledHeader", "Yc", "Create precompiled header", "1"},

{"UsePrecompiledHeader", "YX", "Automatically generate precompiled header", "2"},

{"UsePrecompiledHeader", "Yu2005", "Use precompiled header", "2"},

{"UsePrecompiledHeader", "Yu", "Use precompiled header", "3"},

{0,0,0,0 }

};

Loop Function ================================================================================

void cmLocalVisualStudio7GeneratorMP::FillFlagMapFromCommandFlags(

std::map<cmStdString, cmStdString>& flagMap,

cmVS7FlagTable* flagTable,

std::string& flags)

{

std::string option;

std::string optionwithSpace;

const int POS_MAX = 65535;

int iBestPos = POS_MAX;

int iCurPos = 0;

std::string curCommand(flagTable->IDEName);

std::string value;

while(flagTable->IDEName)

{

   while(flagTable->IDEName && (curCommand == flagTable->IDEName))

   {

      // while it's the same command, we seek the best flag to write

      option.reserve(strlen(flagTable->commandFlag)+1);

      optionwithSpace.reserve(strlen(flagTable->commandFlag)+2);

      // first do the - version

      option = "-";

      option += flagTable->commandFlag;

      optionwithSpace = option + " ";

      // check the option with a space first

      while((iCurPos = flags.find(optionwithSpace)) != flags.npos)

      {

        // replace the flag

        cmSystemTools::ReplaceString(flags, optionwithSpace.c_str(), "");

        // now put value into flag map

        if (iCurPos < iBestPos)

        {

           value = flagTable->value;

           iBestPos = iCurPos;



        }

      }

      // now do the / version

      optionwithSpace[0] = '/';

      while((iCurPos = flags.find(optionwithSpace)) != flags.npos)

      {

        // replace the flag

        cmSystemTools::ReplaceString(flags, optionwithSpace.c_str(), "");

        // now put value into flag map

        if (iCurPos < iBestPos)

        {

           value = flagTable->value;

           iBestPos = iCurPos;

        }

      }

      while((iCurPos = flags.find(option)) != flags.npos)

      {

        // replace the flag

        cmSystemTools::ReplaceString(flags, option.c_str(), "");

        // now put value into flag map

        if (iCurPos < iBestPos)

        {

           value = flagTable->value;

           iBestPos = iCurPos;

        }

      }

      // now do the / version

      option[0] = '/';

      while((iCurPos = flags.find(option)) != flags.npos)

      {

        // replace the flag

        cmSystemTools::ReplaceString(flags, option.c_str(), "");

        // now put value into flag map

        if (iCurPos < iBestPos)

        {

           value = flagTable->value;

           iBestPos = iCurPos;

        }

      }

      flagTable++;

   }



   if(iBestPos != POS_MAX)

   {

     flagMap[curCommand] = value;

   }

   if (flagTable->IDEName)

   {

      curCommand = flagTable->IDEName;

      iBestPos = POS_MAX;

   }

}

// If verbose makefiles have been requested and the /nologo option

// was not given explicitly in the flags we want to add an attribute

// to the generated project to disable logo suppression. Otherwise

// the GUI default is to enable suppression.

if(this->Makefile->IsOn("CMAKE_VERBOSE_MAKEFILE"))

{

if(flagMap.find("SuppressStartupBanner") == flagMap.end())

  {

  flagMap["SuppressStartupBanner"] = "FALSE";

  }

}

}

Previous message: AW: [CMake] Selecting runtime library on Visual Studio projects
Next message: AW: [CMake] Selecting runtime library on Visual Studio projects
Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]

More information about the CMake mailing list

转载于:https://my.oschina.net/lyr/blog/84580

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值