summaryrefslogtreecommitdiffstats
path: root/Source/cmMakefileTargetGenerator.cxx
diff options
context:
space:
mode:
authorNils Gladitz <nilsgladitz@gmail.com>2013-11-15 20:41:11 (GMT)
committerBrad King <brad.king@kitware.com>2013-11-19 14:39:50 (GMT)
commit3a8f34b98cbbe8001f1645516701623a78504611 (patch)
tree68678c00429521936c0cd3f1c3d0e310a5027155 /Source/cmMakefileTargetGenerator.cxx
parent958367e10cee44d2dbce72f9393168746099ebd1 (diff)
downloadCMake-3a8f34b98cbbe8001f1645516701623a78504611.zip
CMake-3a8f34b98cbbe8001f1645516701623a78504611.tar.gz
CMake-3a8f34b98cbbe8001f1645516701623a78504611.tar.bz2
Makefile: Remove "forbidden" flags only as a whole
Fix CMAKE_<LANG>_CREATE_SHARED_LIBRARY_FORBIDDEN_FLAGS implementation to only remove whole flags. Without this n the Mac we were incorrectly removing -w from -Wno-write-strings.
Diffstat (limited to 'Source/cmMakefileTargetGenerator.cxx')
-rw-r--r--Source/cmMakefileTargetGenerator.cxx35
1 files changed, 34 insertions, 1 deletions
diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx
index 6770e10..2fcad79 100644
--- a/Source/cmMakefileTargetGenerator.cxx
+++ b/Source/cmMakefileTargetGenerator.cxx
@@ -27,6 +27,7 @@
#include "cmMakefileLibraryTargetGenerator.h"
#include "cmMakefileUtilityTargetGenerator.h"
+#include <ctype.h>
cmMakefileTargetGenerator::cmMakefileTargetGenerator(cmTarget* target)
: OSXBundleGenerator(0)
@@ -1694,10 +1695,42 @@ void cmMakefileTargetGenerator::RemoveForbiddenFlags(const char* flagVar,
this->Makefile->GetSafeDefinition(removeFlags.c_str());
std::vector<std::string> removeList;
cmSystemTools::ExpandListArgument(removeflags, removeList);
+
for(std::vector<std::string>::iterator i = removeList.begin();
i != removeList.end(); ++i)
{
- cmSystemTools::ReplaceString(linkFlags, i->c_str(), "");
+ std::string tmp;
+ std::string::size_type lastPosition = 0;
+
+ for(;;)
+ {
+ std::string::size_type position = linkFlags.find(*i, lastPosition);
+
+ if(position == std::string::npos)
+ {
+ tmp += linkFlags.substr(lastPosition);
+ break;
+ }
+ else
+ {
+ std::string::size_type prefixLength = position - lastPosition;
+ tmp += linkFlags.substr(lastPosition, prefixLength);
+ lastPosition = position + i->length();
+
+ bool validFlagStart = position == 0 ||
+ isspace(linkFlags[position - 1]);
+
+ bool validFlagEnd = lastPosition == linkFlags.size() ||
+ isspace(linkFlags[lastPosition]);
+
+ if(!validFlagStart || !validFlagEnd)
+ {
+ tmp += *i;
+ }
+ }
+ }
+
+ linkFlags = tmp;
}
}