This kind of option is not fully supported by CMake. Although it still
works because it is placed in the command line.
To handle this kind of flags, I attached several files.
The flags must be declared like this in the array cmVS7FlagTable
cmLocalVisualStudio7GeneratorLinkerFlagTable[]
// Input
{"IgnoreDefaultLibraryNames", "NODEFAULTLIB", "default libraries to
ignore", "PARAMETERS"},
{"DelayLoadDLLs", "DELAYLOAD", "delayed laoding of
the DLLS", "PARAMETERS"},
Attached you'll find an updated flag table and the new parser function.
This new function supports:
-the override of a flag.
eg.
a CMakeLists.txt sets default settings like this:
SET(CMAKE_EXE_LINKER_FLAGS /SUBSYSTEM:WINDOWS /MACHINE:X86)
a sub-level CMakeLists.txt can override the SUBSYSTEM flag like this :
SET(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE)
-the flag /FLAG:"param1;param2"
Sylvain
Yianis Nikolaou a écrit :
hi all,
I would like to exclude some libraries from my project
The command
SET(CMAKE_EXE_LINKER_FLAGS /NODEFAULTLIB:LIBC;LIBCMT;MSVCRT)
used to work for VS6 but it does not for VS2005
When the project is created this parameter is included in the [Command
Line] section of the Project's Linker properties, but not in the
section [Linker\Input\Ignore Specific Library] where the value should
be placed.
Note that the syntax of the parameter is
/NODEFAULTLIB:[name,name,...], but the explanation says that multiple
libraries should separated by semi-colons.
environment:
Windows XP, VS2005, CMake 2.4.5
thanks!
------------------------------------------------------------------------
_______________________________________________
CMake mailing list
CMake@cmake.org
http://www.cmake.org/mailman/listinfo/cmake
--
Sylvain Benner
www.virtools.com <http://www.virtools.com> | [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>
*Virtools SA* | Developer | R&D department
93 rue vieille du temple
75003 PARIS
France
*Tel:* +33 1 42 71 46 86
*Fax:* +33 1 42 71 86 53
void cmLocalVisualStudio7Generator::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)
{
if(0 == strcmp(value.c_str(), "PARAMETERS"))
{
// flags with parameters
int firstPos = flags.find("\"", iBestPos) + 1;
int lastPos = flags.find("\"", firstPos);
std::string parameters = flags.substr(firstPos,
lastPos-firstPos);
value = parameters;
std::string stringToReplace = ":\"" +
parameters + "\"";
cmSystemTools::ReplaceString(flags, stringToReplace.c_str(), "");
}
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";
}
}
}
cmVS7FlagTable cmLocalVisualStudio7GeneratorCompilerFlagTable[] =
{
// 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"},
// Xbox 360
{"RegisterReservation", "QVMXReserve", "VMX registers
reservation", "TRUE"},
{"RegisterReservation", "noQVMXReserve", "VMX registers
reservation", "FALSE"},
{"TrapIntegerDivides", "Oc", "trap instructions
around integer divides", "TRUE"},
{"TrapIntegerDivides", "noOc", "trap instructions
around integer divides", "FALSE"},
{"Prescheduling", "Ou", "perform an
additional code scheduling pass", "TRUE"},
{"Prescheduling", "noOu", "perform an
additional code scheduling pass", "FALSE"},
{"InlineAssembly", "Oz", "reorder inline
assembly instruction", "TRUE"},
{"InlineAssembly", "noOz", "reorder inline
assembly instruction", "FALSE"},
{"Stalls", "QXSTALLS", "listing with cycle
count from pipeline emu", "TRUE"},
{"Stalls", "noQXSTALLS", "listing with cycle
count from pipeline emu", "FALSE"},
{"CallAttributedProfiling", "fastcap", "Call profiler around
function calls", "1"},
{"CallAttributedProfiling", "callcap", "Call profiler within
function calls", "2"},
{0,0,0,0 }
};
cmVS7FlagTable cmLocalVisualStudio7GeneratorMPLinkerFlagTable[] =
{
// Linker
----------------------------------------------------------------------------------------------
// General
{"LinkIncremental", "INCREMENTAL:NO", "link
incremental", "1"},
{"LinkIncremental", "INCREMENTAL:YES", "link
incremental", "2"},
{"LinkIncremental", "INCREMENTAL", "link
incremental", "2"},
{"IgnoreImportLibrary", "IGNOREIMPORTLIBRARY",
"IgnoreImportLibrary", "TRUE"},
{"IgnoreImportLibrary", "NOIGNOREIMPORTLIBRARY",
"IgnoreImportLibrary", "FALSE"},
{"RegisterOutput", "REGISTEROUTPUT", "Register the
primary output", "TRUE"},
{"RegisterOutput", "NOREGISTEROUTPUT", "Register the
primary output", "FALSE"},
// Input
{"IgnoreDefaultLibraryNames", "NODEFAULTLIB",
"default libraries to ignore", "PARAMETERS"},
{"DelayLoadDLLs", "DELAYLOAD",
"delayed laoding of the DLLS", "PARAMETERS"},
// Debugging
{"GenerateDebugInformation", "DEBUG", "Generate Debug
Info", "TRUE"},
{"GenerateDebugInformation", "NODEBUG", "Don't Generate
Debug Info", "FALSE"},
// System
{"SubSystem", "SUBSYSTEM:CONSOLE", "Sub system",
"1"},
{"SubSystem", "SUBSYSTEM:WINDOWS", "Sub system",
"2"},
// Optimization
{"OptimizeReferences", "OPT:NOREF", "Keep Unreferenced
Data", "1"},
{"OptimizeReferences", "OPT:REF", "Eliminate
Unreferenced Data", "2"},
{"EnableCOMDATFolding", "OPT:NOICF", "Do
not Remove Redundant COMDATs", "1"},
{"EnableCOMDATFolding", "OPT:ICF",
"Remove Redundant COMDATs", "2"},
// Advanced
{"TargetMachine", "MACHINE:X86", "Target Machine",
"1"},
{0,0,0,0 }
};
_______________________________________________
CMake mailing list
CMake@cmake.org
http://www.cmake.org/mailman/listinfo/cmake