mirror of
https://github.com/reactos/CMake.git
synced 2025-01-31 17:12:49 +00:00
Merge topic 'target-include-directories'
d662dff Fix shadowed variable warning on dashboard results f66e735 Fix compiler warning reported on older Borland dashboard. d90eed4 Fix compiler error reported on older Borland dashboard. 8233636 Update the documentation regarding INCLUDE_DIRECTORIES. d899eb7 Call ExpandVariablesInString for each target's INCLUDE_DIRECTORIES c21db87 Make search paths ordered and unique 22021f0 Remove cmMakefile::GetIncludeDirectories 9106b56 Extract and use the INCLUDE_DIRECTORIES target properties. 840509b Keep the INCLUDE_DIRECTORIES target property up to date. a4d5f7b Add API to get the ordered includes for a target. 8adaee2 CMake: Eliminate cmMakefile::IncludeDirectories 7620932 Remove include flags memoization. 97a5faa Make it safe to call this method without creating duplicates. edd5303 Refactor GetIncludeFlags to take includes instead of fetching them
This commit is contained in:
commit
580171185b
@ -260,12 +260,27 @@ bool cmDepends::CheckDependencies(std::istream& internalDepends,
|
||||
//----------------------------------------------------------------------------
|
||||
void cmDepends::SetIncludePathFromLanguage(const char* lang)
|
||||
{
|
||||
// Look for the new per "TARGET_" variant first:
|
||||
const char * includePath = 0;
|
||||
std::string includePathVar = "CMAKE_";
|
||||
includePathVar += lang;
|
||||
includePathVar += "_INCLUDE_PATH";
|
||||
includePathVar += "_TARGET_INCLUDE_PATH";
|
||||
cmMakefile* mf = this->LocalGenerator->GetMakefile();
|
||||
if(const char* includePath = mf->GetDefinition(includePathVar.c_str()))
|
||||
includePath = mf->GetDefinition(includePathVar.c_str());
|
||||
if(includePath)
|
||||
{
|
||||
cmSystemTools::ExpandListArgument(includePath, this->IncludePath);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Fallback to the old directory level variable if no per-target var:
|
||||
includePathVar = "CMAKE_";
|
||||
includePathVar += lang;
|
||||
includePathVar += "_INCLUDE_PATH";
|
||||
includePath = mf->GetDefinition(includePathVar.c_str());
|
||||
if(includePath)
|
||||
{
|
||||
cmSystemTools::ExpandListArgument(includePath, this->IncludePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -596,16 +596,17 @@ void cmExtraCodeBlocksGenerator::AppendTarget(cmGeneratedFileStream& fout,
|
||||
|
||||
// the include directories for this target
|
||||
std::set<std::string> uniqIncludeDirs;
|
||||
const std::vector<std::string>& incDirs =
|
||||
target->GetMakefile()->GetIncludeDirectories();
|
||||
for(std::vector<std::string>::const_iterator dirIt=incDirs.begin();
|
||||
dirIt != incDirs.end();
|
||||
|
||||
std::vector<std::string> includes;
|
||||
target->GetMakefile()->GetLocalGenerator()->
|
||||
GetIncludeDirectories(includes, target);
|
||||
for(std::vector<std::string>::const_iterator dirIt=includes.begin();
|
||||
dirIt != includes.end();
|
||||
++dirIt)
|
||||
{
|
||||
uniqIncludeDirs.insert(*dirIt);
|
||||
}
|
||||
|
||||
|
||||
std::string systemIncludeDirs = makefile->GetSafeDefinition(
|
||||
"CMAKE_EXTRA_GENERATOR_C_SYSTEM_INCLUDE_DIRS");
|
||||
if (!systemIncludeDirs.empty())
|
||||
|
@ -893,9 +893,13 @@ void cmExtraEclipseCDT4Generator::CreateCProjectFile() const
|
||||
it != this->GlobalGenerator->GetLocalGenerators().end();
|
||||
++it)
|
||||
{
|
||||
const std::vector<std::string>& includeDirs
|
||||
= (*it)->GetMakefile()->GetIncludeDirectories();
|
||||
this->AppendIncludeDirectories(fout, includeDirs, emmited);
|
||||
cmTargets & targets = (*it)->GetMakefile()->GetTargets();
|
||||
for (cmTargets::iterator l = targets.begin(); l != targets.end(); ++l)
|
||||
{
|
||||
std::vector<std::string> includeDirs;
|
||||
(*it)->GetIncludeDirectories(includeDirs, &l->second);
|
||||
this->AppendIncludeDirectories(fout, includeDirs, emmited);
|
||||
}
|
||||
}
|
||||
// now also the system include directories, in case we found them in
|
||||
// CMakeSystemSpecificInformation.cmake. This makes Eclipse find the
|
||||
|
@ -1067,9 +1067,9 @@ void cmGlobalGenerator::CheckLocalGenerators()
|
||||
{
|
||||
manager = this->LocalGenerators[i]->GetMakefile()->GetCacheManager();
|
||||
this->LocalGenerators[i]->ConfigureFinalPass();
|
||||
const cmTargets & targets =
|
||||
cmTargets & targets =
|
||||
this->LocalGenerators[i]->GetMakefile()->GetTargets();
|
||||
for (cmTargets::const_iterator l = targets.begin();
|
||||
for (cmTargets::iterator l = targets.begin();
|
||||
l != targets.end(); l++)
|
||||
{
|
||||
const cmTarget::LinkLibraryVectorType& libs =
|
||||
@ -1095,27 +1095,28 @@ void cmGlobalGenerator::CheckLocalGenerators()
|
||||
notFoundMap[varName] = text;
|
||||
}
|
||||
}
|
||||
}
|
||||
const std::vector<std::string>& incs =
|
||||
this->LocalGenerators[i]->GetMakefile()->GetIncludeDirectories();
|
||||
std::vector<std::string> incs;
|
||||
this->LocalGenerators[i]->GetIncludeDirectories(incs, &l->second);
|
||||
|
||||
for( std::vector<std::string>::const_iterator incDir = incs.begin();
|
||||
incDir != incs.end(); ++incDir)
|
||||
{
|
||||
if(incDir->size() > 9 &&
|
||||
cmSystemTools::IsNOTFOUND(incDir->c_str()))
|
||||
for( std::vector<std::string>::const_iterator incDir = incs.begin();
|
||||
incDir != incs.end(); ++incDir)
|
||||
{
|
||||
std::string varName = incDir->substr(0, incDir->size()-9);
|
||||
cmCacheManager::CacheIterator it =
|
||||
manager->GetCacheIterator(varName.c_str());
|
||||
if(it.GetPropertyAsBool("ADVANCED"))
|
||||
if(incDir->size() > 9 &&
|
||||
cmSystemTools::IsNOTFOUND(incDir->c_str()))
|
||||
{
|
||||
varName += " (ADVANCED)";
|
||||
std::string varName = incDir->substr(0, incDir->size()-9);
|
||||
cmCacheManager::CacheIterator it =
|
||||
manager->GetCacheIterator(varName.c_str());
|
||||
if(it.GetPropertyAsBool("ADVANCED"))
|
||||
{
|
||||
varName += " (ADVANCED)";
|
||||
}
|
||||
std::string text = notFoundMap[varName];
|
||||
text += "\n used as include directory in directory ";
|
||||
text += this->LocalGenerators[i]
|
||||
->GetMakefile()->GetCurrentDirectory();
|
||||
notFoundMap[varName] = text;
|
||||
}
|
||||
std::string text = notFoundMap[varName];
|
||||
text += "\n used as include directory in directory ";
|
||||
text += this->LocalGenerators[i]->GetMakefile()->GetCurrentDirectory();
|
||||
notFoundMap[varName] = text;
|
||||
}
|
||||
}
|
||||
this->CMakeInstance->UpdateProgress
|
||||
|
@ -1811,7 +1811,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
|
||||
BuildObjectListOrString dirs(this, this->XcodeVersion >= 30);
|
||||
BuildObjectListOrString fdirs(this, this->XcodeVersion >= 30);
|
||||
std::vector<std::string> includes;
|
||||
this->CurrentLocalGenerator->GetIncludeDirectories(includes);
|
||||
this->CurrentLocalGenerator->GetIncludeDirectories(includes, &target);
|
||||
std::set<cmStdString> emitted;
|
||||
emitted.insert("/System/Library/Frameworks");
|
||||
for(std::vector<std::string>::iterator i = includes.begin();
|
||||
|
@ -58,13 +58,21 @@ public:
|
||||
{
|
||||
return
|
||||
" include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)\n"
|
||||
"Add the given directories to those searched by the compiler for "
|
||||
"include files. By default the directories are appended onto "
|
||||
"the current list of directories. This default behavior can be "
|
||||
"changed by setting CMAKE_INCLUDE_DIRECTORIES_BEFORE to ON. "
|
||||
"By using BEFORE or AFTER you can select between appending and "
|
||||
"prepending, independent from the default. "
|
||||
"If the SYSTEM option is given the compiler will be told that the "
|
||||
"Add the given directories to those the compiler uses to search "
|
||||
"for include files. "
|
||||
"These directories are added to the directory property "
|
||||
"INCLUDE_DIRECTORIES for the current CMakeLists file. "
|
||||
"They are also added to the target property INCLUDE_DIRECTORIES "
|
||||
"for each target in the current CMakeLists file. "
|
||||
"The target property values are the ones used by the generators."
|
||||
"\n"
|
||||
"By default the directories are appended onto the current list of "
|
||||
"directories. "
|
||||
"This default behavior can be changed by setting "
|
||||
"CMAKE_INCLUDE_DIRECTORIES_BEFORE to ON. "
|
||||
"By using AFTER or BEFORE explicitly, you can select between "
|
||||
"appending and prepending, independent of the default. "
|
||||
"If the SYSTEM option is given, the compiler will be told the "
|
||||
"directories are meant as system include directories on some "
|
||||
"platforms.";
|
||||
}
|
||||
|
@ -556,7 +556,7 @@ void cmLocalGenerator::GenerateTargetManifest()
|
||||
void cmLocalGenerator::AddCustomCommandToCreateObject(const char* ofname,
|
||||
const char* lang,
|
||||
cmSourceFile& source,
|
||||
cmTarget& )
|
||||
cmTarget& target)
|
||||
{
|
||||
std::string objectDir = cmSystemTools::GetFilenamePath(std::string(ofname));
|
||||
objectDir = this->Convert(objectDir.c_str(),START_OUTPUT,SHELL);
|
||||
@ -574,7 +574,11 @@ void cmLocalGenerator::AddCustomCommandToCreateObject(const char* ofname,
|
||||
std::string flags;
|
||||
flags += this->Makefile->GetSafeDefinition(varString.c_str());
|
||||
flags += " ";
|
||||
flags += this->GetIncludeFlags(lang);
|
||||
{
|
||||
std::vector<std::string> includes;
|
||||
this->GetIncludeDirectories(includes, &target, lang);
|
||||
flags += this->GetIncludeFlags(includes, lang);
|
||||
}
|
||||
flags += this->Makefile->GetDefineFlags();
|
||||
|
||||
// Construct the command lines.
|
||||
@ -1192,24 +1196,16 @@ cmLocalGenerator::ConvertToIncludeReference(std::string const& path)
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
const char* cmLocalGenerator::GetIncludeFlags(const char* lang,
|
||||
bool forResponseFile)
|
||||
std::string cmLocalGenerator::GetIncludeFlags(
|
||||
const std::vector<std::string> &includes,
|
||||
const char* lang, bool forResponseFile)
|
||||
{
|
||||
if(!lang)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
std::string key = lang;
|
||||
key += forResponseFile? "@" : "";
|
||||
if(this->LanguageToIncludeFlags.count(key))
|
||||
{
|
||||
return this->LanguageToIncludeFlags[key].c_str();
|
||||
}
|
||||
|
||||
cmOStringStream includeFlags;
|
||||
std::vector<std::string> includes;
|
||||
this->GetIncludeDirectories(includes, lang);
|
||||
std::vector<std::string>::iterator i;
|
||||
|
||||
std::string flagVar = "CMAKE_INCLUDE_FLAG_";
|
||||
flagVar += lang;
|
||||
@ -1251,6 +1247,7 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang,
|
||||
#ifdef __APPLE__
|
||||
emitted.insert("/System/Library/Frameworks");
|
||||
#endif
|
||||
std::vector<std::string>::const_iterator i;
|
||||
for(i = includes.begin(); i != includes.end(); ++i)
|
||||
{
|
||||
if(this->Makefile->IsOn("APPLE")
|
||||
@ -1311,16 +1308,12 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang,
|
||||
{
|
||||
flags[flags.size()-1] = ' ';
|
||||
}
|
||||
this->LanguageToIncludeFlags[key] = flags;
|
||||
|
||||
// Use this temorary variable for the return value to work-around a
|
||||
// bogus GCC 2.95 warning.
|
||||
const char* ret = this->LanguageToIncludeFlags[key].c_str();
|
||||
return ret;
|
||||
return flags;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
|
||||
cmTarget* target,
|
||||
const char* lang)
|
||||
{
|
||||
// Need to decide whether to automatically include the source and
|
||||
@ -1375,8 +1368,12 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
|
||||
// Store the automatic include paths.
|
||||
if(includeBinaryDir)
|
||||
{
|
||||
dirs.push_back(this->Makefile->GetStartOutputDirectory());
|
||||
emitted.insert(this->Makefile->GetStartOutputDirectory());
|
||||
if(emitted.find(
|
||||
this->Makefile->GetStartOutputDirectory()) == emitted.end())
|
||||
{
|
||||
dirs.push_back(this->Makefile->GetStartOutputDirectory());
|
||||
emitted.insert(this->Makefile->GetStartOutputDirectory());
|
||||
}
|
||||
}
|
||||
if(includeSourceDir)
|
||||
{
|
||||
@ -1402,9 +1399,12 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
|
||||
}
|
||||
}
|
||||
|
||||
// Get the project-specified include directories.
|
||||
std::vector<std::string>& includes =
|
||||
this->Makefile->GetIncludeDirectories();
|
||||
// Get the target-specific include directories.
|
||||
std::vector<std::string> includes;
|
||||
if(target)
|
||||
{
|
||||
includes = target->GetIncludeDirectories();
|
||||
}
|
||||
|
||||
// Support putting all the in-project include directories first if
|
||||
// it is requested by the project.
|
||||
@ -1412,7 +1412,7 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
|
||||
{
|
||||
const char* topSourceDir = this->Makefile->GetHomeDirectory();
|
||||
const char* topBinaryDir = this->Makefile->GetHomeOutputDirectory();
|
||||
for(std::vector<std::string>::iterator i = includes.begin();
|
||||
for(std::vector<std::string>::const_iterator i = includes.begin();
|
||||
i != includes.end(); ++i)
|
||||
{
|
||||
// Emit this directory only if it is a subdirectory of the
|
||||
@ -1431,7 +1431,7 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
|
||||
}
|
||||
|
||||
// Construct the final ordered include directory list.
|
||||
for(std::vector<std::string>::iterator i = includes.begin();
|
||||
for(std::vector<std::string>::const_iterator i = includes.begin();
|
||||
i != includes.end(); ++i)
|
||||
{
|
||||
if(emitted.insert(*i).second)
|
||||
|
@ -146,8 +146,8 @@ public:
|
||||
///! Append flags to a string.
|
||||
virtual void AppendFlags(std::string& flags, const char* newFlags);
|
||||
///! Get the include flags for the current makefile and language
|
||||
const char* GetIncludeFlags(const char* lang,
|
||||
bool forResponseFile = false);
|
||||
std::string GetIncludeFlags(const std::vector<std::string> &includes,
|
||||
const char* lang, bool forResponseFile = false);
|
||||
|
||||
/**
|
||||
* Encode a list of preprocessor definitions for the compiler
|
||||
@ -198,6 +198,7 @@ public:
|
||||
|
||||
/** Get the include flags for the current makefile and language. */
|
||||
void GetIncludeDirectories(std::vector<std::string>& dirs,
|
||||
cmTarget* target,
|
||||
const char* lang = "C");
|
||||
|
||||
/** Compute the language used to compile the given source file. */
|
||||
@ -395,7 +396,6 @@ protected:
|
||||
std::vector<std::string> StartOutputDirectoryComponents;
|
||||
cmLocalGenerator* Parent;
|
||||
std::vector<cmLocalGenerator*> Children;
|
||||
std::map<cmStdString, cmStdString> LanguageToIncludeFlags;
|
||||
std::map<cmStdString, cmStdString> UniqueObjectNamesMap;
|
||||
std::string::size_type ObjectPathMax;
|
||||
std::set<cmStdString> ObjectMaxPathViolations;
|
||||
|
@ -452,28 +452,6 @@ void cmLocalUnixMakefileGenerator3::WriteDirectoryInformationFile()
|
||||
<< "\n";
|
||||
}
|
||||
|
||||
// Store the include search path for this directory.
|
||||
infoFileStream
|
||||
<< "# The C and CXX include file search paths:\n";
|
||||
infoFileStream
|
||||
<< "SET(CMAKE_C_INCLUDE_PATH\n";
|
||||
std::vector<std::string> includeDirs;
|
||||
this->GetIncludeDirectories(includeDirs);
|
||||
for(std::vector<std::string>::iterator i = includeDirs.begin();
|
||||
i != includeDirs.end(); ++i)
|
||||
{
|
||||
infoFileStream
|
||||
<< " \"" << this->Convert(i->c_str(),HOME_OUTPUT).c_str() << "\"\n";
|
||||
}
|
||||
infoFileStream
|
||||
<< " )\n";
|
||||
infoFileStream
|
||||
<< "SET(CMAKE_CXX_INCLUDE_PATH ${CMAKE_C_INCLUDE_PATH})\n";
|
||||
infoFileStream
|
||||
<< "SET(CMAKE_Fortran_INCLUDE_PATH ${CMAKE_C_INCLUDE_PATH})\n";
|
||||
infoFileStream
|
||||
<< "SET(CMAKE_ASM_INCLUDE_PATH ${CMAKE_C_INCLUDE_PATH})\n";
|
||||
|
||||
// Store the include regular expressions for this directory.
|
||||
infoFileStream
|
||||
<< "\n"
|
||||
|
@ -103,52 +103,9 @@ void cmLocalVisualStudio6Generator::OutputDSPFile()
|
||||
}
|
||||
}
|
||||
|
||||
// Setup /I and /LIBPATH options for the resulting DSP file. VS 6
|
||||
// truncates long include paths so make it as short as possible if
|
||||
// the length threatens this problem.
|
||||
unsigned int maxIncludeLength = 3000;
|
||||
bool useShortPath = false;
|
||||
for(int j=0; j < 2; ++j)
|
||||
{
|
||||
std::vector<std::string> includes;
|
||||
this->GetIncludeDirectories(includes);
|
||||
std::vector<std::string>::iterator i;
|
||||
for(i = includes.begin(); i != includes.end(); ++i)
|
||||
{
|
||||
std::string tmp =
|
||||
this->ConvertToOptionallyRelativeOutputPath(i->c_str());
|
||||
if(useShortPath)
|
||||
{
|
||||
cmSystemTools::GetShortPath(tmp.c_str(), tmp);
|
||||
}
|
||||
this->IncludeOptions += " /I ";
|
||||
|
||||
// quote if not already quoted
|
||||
if (tmp[0] != '"')
|
||||
{
|
||||
this->IncludeOptions += "\"";
|
||||
this->IncludeOptions += tmp;
|
||||
this->IncludeOptions += "\"";
|
||||
}
|
||||
else
|
||||
{
|
||||
this->IncludeOptions += tmp;
|
||||
}
|
||||
}
|
||||
if(j == 0 && this->IncludeOptions.size() > maxIncludeLength)
|
||||
{
|
||||
this->IncludeOptions = "";
|
||||
useShortPath = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Create the DSP or set of DSP's for libraries and executables
|
||||
|
||||
cmTargets &tgts = this->Makefile->GetTargets();
|
||||
cmTargets &tgts = this->Makefile->GetTargets();
|
||||
for(cmTargets::iterator l = tgts.begin();
|
||||
l != tgts.end(); l++)
|
||||
{
|
||||
@ -895,6 +852,61 @@ inline std::string removeQuotes(const std::string& s)
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
std::string
|
||||
cmLocalVisualStudio6Generator::GetTargetIncludeOptions(cmTarget &target)
|
||||
{
|
||||
std::string includeOptions;
|
||||
|
||||
// Setup /I and /LIBPATH options for the resulting DSP file. VS 6
|
||||
// truncates long include paths so make it as short as possible if
|
||||
// the length threatens this problem.
|
||||
unsigned int maxIncludeLength = 3000;
|
||||
bool useShortPath = false;
|
||||
for(int j=0; j < 2; ++j)
|
||||
{
|
||||
std::vector<std::string> includes;
|
||||
this->GetIncludeDirectories(includes, &target);
|
||||
|
||||
std::vector<std::string>::iterator i;
|
||||
for(i = includes.begin(); i != includes.end(); ++i)
|
||||
{
|
||||
std::string tmp =
|
||||
this->ConvertToOptionallyRelativeOutputPath(i->c_str());
|
||||
if(useShortPath)
|
||||
{
|
||||
cmSystemTools::GetShortPath(tmp.c_str(), tmp);
|
||||
}
|
||||
includeOptions += " /I ";
|
||||
|
||||
// quote if not already quoted
|
||||
if (tmp[0] != '"')
|
||||
{
|
||||
includeOptions += "\"";
|
||||
includeOptions += tmp;
|
||||
includeOptions += "\"";
|
||||
}
|
||||
else
|
||||
{
|
||||
includeOptions += tmp;
|
||||
}
|
||||
}
|
||||
|
||||
if(j == 0 && includeOptions.size() > maxIncludeLength)
|
||||
{
|
||||
includeOptions = "";
|
||||
useShortPath = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return includeOptions;
|
||||
}
|
||||
|
||||
|
||||
// Code in blocks surrounded by a test for this definition is needed
|
||||
// only for compatibility with user project's replacement DSP
|
||||
// templates. The CMake templates no longer use them.
|
||||
@ -1132,6 +1144,9 @@ void cmLocalVisualStudio6Generator
|
||||
}
|
||||
#endif
|
||||
|
||||
// Get include options for this target.
|
||||
std::string includeOptions = this->GetTargetIncludeOptions(target);
|
||||
|
||||
// Get extra linker options for this target type.
|
||||
std::string extraLinkOptions;
|
||||
std::string extraLinkOptionsDebug;
|
||||
@ -1510,7 +1525,7 @@ void cmLocalVisualStudio6Generator
|
||||
optionsRelWithDebInfo.c_str());
|
||||
|
||||
cmSystemTools::ReplaceString(line, "BUILD_INCLUDES",
|
||||
this->IncludeOptions.c_str());
|
||||
includeOptions.c_str());
|
||||
cmSystemTools::ReplaceString(line, "TARGET_VERSION_FLAG",
|
||||
targetVersionFlag.c_str());
|
||||
cmSystemTools::ReplaceString(line, "TARGET_IMPLIB_FLAG_DEBUG",
|
||||
|
@ -89,7 +89,7 @@ private:
|
||||
void ComputeLinkOptions(cmTarget& target, const char* configName,
|
||||
const std::string extraOptions,
|
||||
std::string& options);
|
||||
std::string IncludeOptions;
|
||||
std::string GetTargetIncludeOptions(cmTarget &target);
|
||||
std::vector<std::string> Configurations;
|
||||
|
||||
std::string GetConfigName(std::string const& configuration) const;
|
||||
|
@ -807,7 +807,7 @@ void cmLocalVisualStudio7Generator::WriteConfiguration(std::ostream& fout,
|
||||
targetOptions.OutputAdditionalOptions(fout, "\t\t\t\t", "\n");
|
||||
fout << "\t\t\t\tAdditionalIncludeDirectories=\"";
|
||||
std::vector<std::string> includes;
|
||||
this->GetIncludeDirectories(includes);
|
||||
this->GetIncludeDirectories(includes, &target);
|
||||
std::vector<std::string>::iterator i = includes.begin();
|
||||
for(;i != includes.end(); ++i)
|
||||
{
|
||||
|
@ -54,16 +54,33 @@ void cmMakeDepend::SetMakefile(cmMakefile* makefile)
|
||||
this->Makefile->IncludeFileRegularExpression.c_str());
|
||||
this->ComplainFileRegularExpression.compile(
|
||||
this->Makefile->ComplainFileRegularExpression.c_str());
|
||||
|
||||
// Now extract any include paths from the makefile flags
|
||||
const std::vector<std::string>& includes =
|
||||
this->Makefile->GetIncludeDirectories();
|
||||
for(std::vector<std::string>::const_iterator j = includes.begin();
|
||||
j != includes.end(); ++j)
|
||||
|
||||
// Now extract any include paths from the targets
|
||||
std::set<std::string> uniqueIncludes;
|
||||
std::vector<std::string> orderedAndUniqueIncludes;
|
||||
cmTargets & targets = this->Makefile->GetTargets();
|
||||
for (cmTargets::iterator l = targets.begin(); l != targets.end(); ++l)
|
||||
{
|
||||
std::string path = *j;
|
||||
this->Makefile->ExpandVariablesInString(path);
|
||||
this->AddSearchPath(path.c_str());
|
||||
const std::vector<std::string>& includes =
|
||||
l->second.GetIncludeDirectories();
|
||||
for(std::vector<std::string>::const_iterator j = includes.begin();
|
||||
j != includes.end(); ++j)
|
||||
{
|
||||
std::string path = *j;
|
||||
this->Makefile->ExpandVariablesInString(path);
|
||||
if(uniqueIncludes.insert(path).second)
|
||||
{
|
||||
orderedAndUniqueIncludes.push_back(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(std::vector<std::string>::const_iterator
|
||||
it = orderedAndUniqueIncludes.begin();
|
||||
it != orderedAndUniqueIncludes.end();
|
||||
++it)
|
||||
{
|
||||
this->AddSearchPath(it->c_str());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -116,7 +116,6 @@ cmMakefile::cmMakefile(const cmMakefile& mf): Internal(new Internals)
|
||||
this->Targets = mf.Targets;
|
||||
this->SourceFiles = mf.SourceFiles;
|
||||
this->Tests = mf.Tests;
|
||||
this->IncludeDirectories = mf.IncludeDirectories;
|
||||
this->LinkDirectories = mf.LinkDirectories;
|
||||
this->SystemIncludeDirectories = mf.SystemIncludeDirectories;
|
||||
this->ListFiles = mf.ListFiles;
|
||||
@ -278,8 +277,6 @@ void cmMakefile::Print()
|
||||
this->cmHomeDirectory.c_str() << std::endl;
|
||||
std::cout << " this->ProjectName; "
|
||||
<< this->ProjectName.c_str() << std::endl;
|
||||
this->PrintStringVector("this->IncludeDirectories;",
|
||||
this->IncludeDirectories);
|
||||
this->PrintStringVector("this->LinkDirectories", this->LinkDirectories);
|
||||
#if defined(CMAKE_BUILD_WITH_CMAKE)
|
||||
for( std::vector<cmSourceGroup>::const_iterator i =
|
||||
@ -1478,7 +1475,8 @@ void cmMakefile::InitializeFromParent()
|
||||
this->Internal->VarStack.top() = parent->Internal->VarStack.top().Closure();
|
||||
|
||||
// copy include paths
|
||||
this->IncludeDirectories = parent->IncludeDirectories;
|
||||
this->SetProperty("INCLUDE_DIRECTORIES",
|
||||
parent->GetProperty("INCLUDE_DIRECTORIES"));
|
||||
this->SystemIncludeDirectories = parent->SystemIncludeDirectories;
|
||||
|
||||
// define flags
|
||||
@ -1603,42 +1601,61 @@ void cmMakefile::AddSubDirectory(const char* srcPath, const char *binPath,
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void AddStringToProperty(cmProperty *prop, const char* name, const char* s,
|
||||
bool before)
|
||||
{
|
||||
if (!prop)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't worry about duplicates at this point. We eliminate them when
|
||||
// we convert the property to a vector in GetIncludeDirectories.
|
||||
|
||||
if (before)
|
||||
{
|
||||
const char *val = prop->GetValue();
|
||||
cmOStringStream oss;
|
||||
|
||||
if(val && *val)
|
||||
{
|
||||
oss << s << ";" << val;
|
||||
}
|
||||
else
|
||||
{
|
||||
oss << s;
|
||||
}
|
||||
|
||||
std::string newVal = oss.str();
|
||||
prop->Set(name, newVal.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
prop->Append(name, s);
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmMakefile::AddIncludeDirectory(const char* inc, bool before)
|
||||
{
|
||||
// if there is a newline then break it into multiple arguments
|
||||
if (!inc)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't add an include directory that is already present. Yes,
|
||||
// this linear search results in n^2 behavior, but n won't be
|
||||
// getting much bigger than 20. We cannot use a set because of
|
||||
// order dependency of the include path.
|
||||
std::vector<std::string>::iterator i =
|
||||
std::find(this->IncludeDirectories.begin(),
|
||||
this->IncludeDirectories.end(), inc);
|
||||
if(i == this->IncludeDirectories.end())
|
||||
// Directory property:
|
||||
cmProperty *prop =
|
||||
this->GetProperties().GetOrCreateProperty("INCLUDE_DIRECTORIES");
|
||||
AddStringToProperty(prop, "INCLUDE_DIRECTORIES", inc, before);
|
||||
|
||||
// Property on each target:
|
||||
for (cmTargets::iterator l = this->Targets.begin();
|
||||
l != this->Targets.end(); ++l)
|
||||
{
|
||||
if (before)
|
||||
{
|
||||
// WARNING: this *is* expensive (linear time) since it's a vector
|
||||
this->IncludeDirectories.insert(this->IncludeDirectories.begin(), inc);
|
||||
}
|
||||
else
|
||||
{
|
||||
this->IncludeDirectories.push_back(inc);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(before)
|
||||
{
|
||||
// if this before and already in the path then remove it
|
||||
this->IncludeDirectories.erase(i);
|
||||
// WARNING: this *is* expensive (linear time) since it's a vector
|
||||
this->IncludeDirectories.insert(this->IncludeDirectories.begin(), inc);
|
||||
}
|
||||
cmTarget &t = l->second;
|
||||
prop = t.GetProperties().GetOrCreateProperty("INCLUDE_DIRECTORIES");
|
||||
AddStringToProperty(prop, "INCLUDE_DIRECTORIES", inc, before);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2093,17 +2110,37 @@ void cmMakefile::AddExtraDirectory(const char* dir)
|
||||
}
|
||||
|
||||
|
||||
// expance CMAKE_BINARY_DIR and CMAKE_SOURCE_DIR in the
|
||||
// expand CMAKE_BINARY_DIR and CMAKE_SOURCE_DIR in the
|
||||
// include and library directories.
|
||||
|
||||
void cmMakefile::ExpandVariables()
|
||||
{
|
||||
// Now expand variables in the include and link strings
|
||||
for(std::vector<std::string>::iterator d = this->IncludeDirectories.begin();
|
||||
d != this->IncludeDirectories.end(); ++d)
|
||||
|
||||
// May not be necessary anymore... But may need a policy for strict
|
||||
// backwards compatibility
|
||||
const char *includeDirs = this->GetProperty("INCLUDE_DIRECTORIES");
|
||||
if (includeDirs)
|
||||
{
|
||||
this->ExpandVariablesInString(*d, true, true);
|
||||
std::string dirs = includeDirs;
|
||||
this->ExpandVariablesInString(dirs, true, true);
|
||||
this->SetProperty("INCLUDE_DIRECTORIES", dirs.c_str());
|
||||
}
|
||||
|
||||
// Also for each target's INCLUDE_DIRECTORIES property:
|
||||
for (cmTargets::iterator l = this->Targets.begin();
|
||||
l != this->Targets.end(); ++l)
|
||||
{
|
||||
cmTarget &t = l->second;
|
||||
includeDirs = t.GetProperty("INCLUDE_DIRECTORIES");
|
||||
if (includeDirs)
|
||||
{
|
||||
std::string dirs = includeDirs;
|
||||
this->ExpandVariablesInString(dirs, true, true);
|
||||
t.SetProperty("INCLUDE_DIRECTORIES", dirs.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
for(std::vector<std::string>::iterator d = this->LinkDirectories.begin();
|
||||
d != this->LinkDirectories.end(); ++d)
|
||||
{
|
||||
@ -3317,16 +3354,6 @@ void cmMakefile::SetProperty(const char* prop, const char* value)
|
||||
|
||||
// handle special props
|
||||
std::string propname = prop;
|
||||
if ( propname == "INCLUDE_DIRECTORIES" )
|
||||
{
|
||||
std::vector<std::string> varArgsExpanded;
|
||||
if(value)
|
||||
{
|
||||
cmSystemTools::ExpandListArgument(value, varArgsExpanded);
|
||||
}
|
||||
this->SetIncludeDirectories(varArgsExpanded);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( propname == "LINK_DIRECTORIES" )
|
||||
{
|
||||
@ -3368,17 +3395,6 @@ void cmMakefile::AppendProperty(const char* prop, const char* value,
|
||||
|
||||
// handle special props
|
||||
std::string propname = prop;
|
||||
if ( propname == "INCLUDE_DIRECTORIES" )
|
||||
{
|
||||
std::vector<std::string> varArgsExpanded;
|
||||
cmSystemTools::ExpandListArgument(value, varArgsExpanded);
|
||||
for(std::vector<std::string>::const_iterator vi = varArgsExpanded.begin();
|
||||
vi != varArgsExpanded.end(); ++vi)
|
||||
{
|
||||
this->AddIncludeDirectory(vi->c_str());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if ( propname == "LINK_DIRECTORIES" )
|
||||
{
|
||||
@ -3474,23 +3490,6 @@ const char *cmMakefile::GetProperty(const char* prop,
|
||||
output += this->DefineFlagsOrig;
|
||||
return output.c_str();
|
||||
}
|
||||
else if (!strcmp("INCLUDE_DIRECTORIES",prop) )
|
||||
{
|
||||
cmOStringStream str;
|
||||
for (std::vector<std::string>::const_iterator
|
||||
it = this->GetIncludeDirectories().begin();
|
||||
it != this->GetIncludeDirectories().end();
|
||||
++ it )
|
||||
{
|
||||
if ( it != this->GetIncludeDirectories().begin())
|
||||
{
|
||||
str << ";";
|
||||
}
|
||||
str << it->c_str();
|
||||
}
|
||||
output = str.str();
|
||||
return output.c_str();
|
||||
}
|
||||
else if (!strcmp("LINK_DIRECTORIES",prop))
|
||||
{
|
||||
cmOStringStream str;
|
||||
@ -3861,9 +3860,22 @@ void cmMakefile::DefineProperties(cmake *cm)
|
||||
cm->DefineProperty
|
||||
("INCLUDE_DIRECTORIES", cmProperty::DIRECTORY,
|
||||
"List of preprocessor include file search directories.",
|
||||
"This read-only property specifies the list of directories given "
|
||||
"so far to the include_directories command. "
|
||||
"It is intended for debugging purposes.", false);
|
||||
"This property specifies the list of directories given "
|
||||
"so far to the include_directories command. "
|
||||
"This property exists on directories and targets. "
|
||||
"In addition to accepting values from the include_directories "
|
||||
"command, values may be set directly on any directory or any "
|
||||
"target using the set_property command. "
|
||||
"A target gets its initial value for this property from the value "
|
||||
"of the directory property. "
|
||||
"A directory gets its initial value from its parent directory if "
|
||||
"it has one. "
|
||||
"Both directory and target property values are adjusted by calls "
|
||||
"to the include_directories command."
|
||||
"\n"
|
||||
"The target property values are used by the generators to set "
|
||||
"the include paths for the compiler. "
|
||||
"See also the include_directories command.");
|
||||
|
||||
cm->DefineProperty
|
||||
("LINK_DIRECTORIES", cmProperty::DIRECTORY,
|
||||
|
@ -521,22 +521,6 @@ public:
|
||||
returned may be imported or built within the project. */
|
||||
cmTarget* FindTargetToUse(const char* name);
|
||||
|
||||
/**
|
||||
* Get a list of include directories in the build.
|
||||
*/
|
||||
std::vector<std::string>& GetIncludeDirectories()
|
||||
{
|
||||
return this->IncludeDirectories;
|
||||
}
|
||||
const std::vector<std::string>& GetIncludeDirectories() const
|
||||
{
|
||||
return this->IncludeDirectories;
|
||||
}
|
||||
void SetIncludeDirectories(const std::vector<std::string>& vec)
|
||||
{
|
||||
this->IncludeDirectories = vec;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark include directories as system directories.
|
||||
*/
|
||||
@ -874,9 +858,7 @@ protected:
|
||||
// Tests
|
||||
std::map<cmStdString, cmTest*> Tests;
|
||||
|
||||
// The include and link-library paths. These may have order
|
||||
// dependency, so they must be vectors (not set).
|
||||
std::vector<std::string> IncludeDirectories;
|
||||
// The link-library paths. Order matters, use std::vector (not std::set).
|
||||
std::vector<std::string> LinkDirectories;
|
||||
|
||||
// The set of include directories that are marked as system include
|
||||
|
@ -1069,6 +1069,35 @@ void cmMakefileTargetGenerator::WriteTargetDependRules()
|
||||
<< "SET(CMAKE_Fortran_TARGET_MODULE_DIR \"" << mdir << "\")\n";
|
||||
}
|
||||
|
||||
// Target-specific include directories:
|
||||
*this->InfoFileStream
|
||||
<< "\n"
|
||||
<< "# The include file search paths:\n";
|
||||
*this->InfoFileStream
|
||||
<< "SET(CMAKE_C_TARGET_INCLUDE_PATH\n";
|
||||
std::vector<std::string> includes;
|
||||
this->LocalGenerator->GetIncludeDirectories(includes, this->Target);
|
||||
for(std::vector<std::string>::iterator i = includes.begin();
|
||||
i != includes.end(); ++i)
|
||||
{
|
||||
*this->InfoFileStream
|
||||
<< " \""
|
||||
<< this->LocalGenerator->Convert(i->c_str(),
|
||||
cmLocalGenerator::HOME_OUTPUT)
|
||||
<< "\"\n";
|
||||
}
|
||||
*this->InfoFileStream
|
||||
<< " )\n";
|
||||
*this->InfoFileStream
|
||||
<< "SET(CMAKE_CXX_TARGET_INCLUDE_PATH "
|
||||
<< "${CMAKE_C_TARGET_INCLUDE_PATH})\n";
|
||||
*this->InfoFileStream
|
||||
<< "SET(CMAKE_Fortran_TARGET_INCLUDE_PATH "
|
||||
<< "${CMAKE_C_TARGET_INCLUDE_PATH})\n";
|
||||
*this->InfoFileStream
|
||||
<< "SET(CMAKE_ASM_TARGET_INCLUDE_PATH "
|
||||
<< "${CMAKE_C_TARGET_INCLUDE_PATH})\n";
|
||||
|
||||
// and now write the rule to use it
|
||||
std::vector<std::string> depends;
|
||||
std::vector<std::string> commands;
|
||||
@ -1534,7 +1563,7 @@ std::string cmMakefileTargetGenerator::GetFrameworkFlags()
|
||||
emitted.insert("/System/Library/Frameworks");
|
||||
#endif
|
||||
std::vector<std::string> includes;
|
||||
this->LocalGenerator->GetIncludeDirectories(includes);
|
||||
this->LocalGenerator->GetIncludeDirectories(includes, this->Target);
|
||||
std::vector<std::string>::iterator i;
|
||||
// check all include directories for frameworks as this
|
||||
// will already have added a -F for the framework
|
||||
@ -1829,8 +1858,12 @@ void cmMakefileTargetGenerator::AddIncludeFlags(std::string& flags,
|
||||
responseVar += "_USE_RESPONSE_FILE_FOR_INCLUDES";
|
||||
bool useResponseFile = this->Makefile->IsOn(responseVar.c_str());
|
||||
|
||||
|
||||
std::vector<std::string> includes;
|
||||
this->LocalGenerator->GetIncludeDirectories(includes, this->Target, lang);
|
||||
|
||||
std::string includeFlags =
|
||||
this->LocalGenerator->GetIncludeFlags(lang, useResponseFile);
|
||||
this->LocalGenerator->GetIncludeFlags(includes, lang, useResponseFile);
|
||||
if(includeFlags.empty())
|
||||
{
|
||||
return;
|
||||
@ -1930,7 +1963,7 @@ void cmMakefileTargetGenerator::AddFortranFlags(std::string& flags)
|
||||
this->Makefile->GetDefinition("CMAKE_Fortran_MODPATH_FLAG"))
|
||||
{
|
||||
std::vector<std::string> includes;
|
||||
this->LocalGenerator->GetIncludeDirectories(includes);
|
||||
this->LocalGenerator->GetIncludeDirectories(includes, this->Target);
|
||||
for(std::vector<std::string>::const_iterator idi = includes.begin();
|
||||
idi != includes.end(); ++idi)
|
||||
{
|
||||
|
@ -479,6 +479,26 @@ void cmTarget::DefineProperties(cmake *cm)
|
||||
"Installing a target with EXCLUDE_FROM_ALL set to true has "
|
||||
"undefined behavior.");
|
||||
|
||||
cm->DefineProperty
|
||||
("INCLUDE_DIRECTORIES", cmProperty::TARGET,
|
||||
"List of preprocessor include file search directories.",
|
||||
"This property specifies the list of directories given "
|
||||
"so far to the include_directories command. "
|
||||
"This property exists on directories and targets. "
|
||||
"In addition to accepting values from the include_directories "
|
||||
"command, values may be set directly on any directory or any "
|
||||
"target using the set_property command. "
|
||||
"A target gets its initial value for this property from the value "
|
||||
"of the directory property. "
|
||||
"A directory gets its initial value from its parent directory if "
|
||||
"it has one. "
|
||||
"Both directory and target property values are adjusted by calls "
|
||||
"to the include_directories command."
|
||||
"\n"
|
||||
"The target property values are used by the generators to set "
|
||||
"the include paths for the compiler. "
|
||||
"See also the include_directories command.");
|
||||
|
||||
cm->DefineProperty
|
||||
("INSTALL_NAME_DIR", cmProperty::TARGET,
|
||||
"Mac OSX directory name for installed targets.",
|
||||
@ -1269,6 +1289,11 @@ void cmTarget::SetMakefile(cmMakefile* mf)
|
||||
// Save the backtrace of target construction.
|
||||
this->Makefile->GetBacktrace(this->Internal->Backtrace);
|
||||
|
||||
// Initialize the INCLUDE_DIRECTORIES property based on the current value
|
||||
// of the same directory property:
|
||||
this->SetProperty("INCLUDE_DIRECTORIES",
|
||||
this->Makefile->GetProperty("INCLUDE_DIRECTORIES"));
|
||||
|
||||
// Record current policies for later use.
|
||||
this->PolicyStatusCMP0003 =
|
||||
this->Makefile->GetPolicyStatus(cmPolicies::CMP0003);
|
||||
@ -4667,6 +4692,30 @@ cmTarget::GetLinkInformation(const char* config)
|
||||
return i->second;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
std::vector<std::string> cmTarget::GetIncludeDirectories()
|
||||
{
|
||||
std::vector<std::string> includes;
|
||||
const char *prop = this->GetProperty("INCLUDE_DIRECTORIES");
|
||||
if(prop)
|
||||
{
|
||||
cmSystemTools::ExpandListArgument(prop, includes);
|
||||
}
|
||||
|
||||
std::set<std::string> uniqueIncludes;
|
||||
std::vector<std::string> orderedAndUniqueIncludes;
|
||||
for(std::vector<std::string>::const_iterator
|
||||
li = includes.begin(); li != includes.end(); ++li)
|
||||
{
|
||||
if(uniqueIncludes.insert(*li).second)
|
||||
{
|
||||
orderedAndUniqueIncludes.push_back(*li);
|
||||
}
|
||||
}
|
||||
|
||||
return orderedAndUniqueIncludes;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
cmTargetLinkInformationMap
|
||||
::cmTargetLinkInformationMap(cmTargetLinkInformationMap const& r): derived()
|
||||
|
@ -457,6 +457,9 @@ public:
|
||||
directory. */
|
||||
bool UsesDefaultOutputDir(const char* config, bool implib);
|
||||
|
||||
/** Get the include directories for this target. */
|
||||
std::vector<std::string> GetIncludeDirectories();
|
||||
|
||||
private:
|
||||
/**
|
||||
* A list of direct dependencies. Use in conjunction with DependencyMap.
|
||||
|
@ -1586,7 +1586,7 @@ void cmVisualStudio10TargetGenerator::WriteItemDefinitionGroups()
|
||||
static_cast<cmGlobalVisualStudio7Generator *>
|
||||
(this->GlobalGenerator)->GetConfigurations();
|
||||
std::vector<std::string> includes;
|
||||
this->LocalGenerator->GetIncludeDirectories(includes);
|
||||
this->LocalGenerator->GetIncludeDirectories(includes, this->Target);
|
||||
for(std::vector<std::string>::iterator i = configs->begin();
|
||||
i != configs->end(); ++i)
|
||||
{
|
||||
|
@ -598,14 +598,10 @@ bool cmake::FindPackage(const std::vector<std::string>& args)
|
||||
std::string includes = mf->GetSafeDefinition("PACKAGE_INCLUDE_DIRS");
|
||||
std::vector<std::string> includeDirs;
|
||||
cmSystemTools::ExpandListArgument(includes, includeDirs);
|
||||
for(std::vector<std::string>::const_iterator dirIt=includeDirs.begin();
|
||||
dirIt != includeDirs.end();
|
||||
++dirIt)
|
||||
{
|
||||
mf->AddIncludeDirectory(dirIt->c_str(), false);
|
||||
}
|
||||
|
||||
std::string includeFlags = lg->GetIncludeFlags(language.c_str(), false);
|
||||
std::string includeFlags = lg->GetIncludeFlags(includeDirs,
|
||||
language.c_str(), false);
|
||||
|
||||
std::string definitions = mf->GetSafeDefinition("PACKAGE_DEFINITIONS");
|
||||
printf("%s %s\n", includeFlags.c_str(), definitions.c_str());
|
||||
}
|
||||
|
@ -45,3 +45,5 @@ else()
|
||||
set_target_properties(IncludeDirectories
|
||||
PROPERTIES COMPILE_FLAGS "-ITarProp")
|
||||
endif()
|
||||
|
||||
add_subdirectory(TargetIncludeDirectories)
|
||||
|
@ -0,0 +1,26 @@
|
||||
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
project(TargetIncludeDirectories)
|
||||
|
||||
macro(create_header _name)
|
||||
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${_name}")
|
||||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_name}/${_name}.h"
|
||||
"//${_name}.h
|
||||
")
|
||||
endmacro()
|
||||
|
||||
create_header(bar)
|
||||
create_header(bat)
|
||||
create_header(foo)
|
||||
create_header(baz)
|
||||
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
|
||||
include_directories("${CMAKE_CURRENT_BINARY_DIR}/bar")
|
||||
|
||||
add_executable(TargetIncludeDirectories main.cpp)
|
||||
set_property(TARGET TargetIncludeDirectories APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/bat")
|
||||
set_property(TARGET TargetIncludeDirectories APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/foo")
|
||||
|
||||
include_directories("${CMAKE_CURRENT_BINARY_DIR}/baz")
|
10
Tests/IncludeDirectories/TargetIncludeDirectories/main.cpp
Normal file
10
Tests/IncludeDirectories/TargetIncludeDirectories/main.cpp
Normal file
@ -0,0 +1,10 @@
|
||||
|
||||
#include "bar.h"
|
||||
#include "bat.h"
|
||||
#include "foo.h"
|
||||
#include "baz.h"
|
||||
|
||||
int main(int, char**)
|
||||
{
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user