Use --sysroot when cross compiling.
As CMAKE_ROOT_FIND_PATH can be a list, a new CMAKE_SYSROOT is introduced, which is never a list. The contents of this variable is passed to supporting compilers as --sysroot. It is also accounted for when processing implicit link directories reported by the compiler, and when generating RPATH information.
This commit is contained in:
parent
bb879bcf2d
commit
de4da665d3
|
@ -30,6 +30,7 @@ macro(__compiler_gnu lang)
|
|||
endif()
|
||||
set(CMAKE_SHARED_LIBRARY_${lang}_FLAGS "-fPIC")
|
||||
set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-shared")
|
||||
set(CMAKE_SYSROOT_FLAG "--sysroot=")
|
||||
|
||||
# Older versions of gcc (< 4.5) contain a bug causing them to report a missing
|
||||
# header file as a warning if depfiles are enabled, causing check_header_file
|
||||
|
|
|
@ -1884,6 +1884,8 @@ void cmComputeLinkInformation::GetRPath(std::vector<std::string>& runtimeDirs,
|
|||
}
|
||||
if(use_build_rpath || use_link_rpath)
|
||||
{
|
||||
std::string rootPath = this->Makefile->GetSafeDefinition("CMAKE_SYSROOT");
|
||||
cmSystemTools::ConvertToUnixSlashes(rootPath);
|
||||
std::vector<std::string> const& rdirs = this->GetRuntimeSearchPath();
|
||||
for(std::vector<std::string>::const_iterator ri = rdirs.begin();
|
||||
ri != rdirs.end(); ++ri)
|
||||
|
@ -1907,9 +1909,14 @@ void cmComputeLinkInformation::GetRPath(std::vector<std::string>& runtimeDirs,
|
|||
!cmSystemTools::IsSubDirectory(ri->c_str(), topSourceDir) &&
|
||||
!cmSystemTools::IsSubDirectory(ri->c_str(), topBinaryDir))
|
||||
{
|
||||
if(emitted.insert(*ri).second)
|
||||
std::string d = *ri;
|
||||
if (d.find(rootPath) == 0)
|
||||
{
|
||||
runtimeDirs.push_back(*ri);
|
||||
d = d.substr(rootPath.size());
|
||||
}
|
||||
if(emitted.insert(d).second)
|
||||
{
|
||||
runtimeDirs.push_back(d);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -560,6 +560,16 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
|
|||
false,
|
||||
"Variables That Change Behavior");
|
||||
|
||||
cm->DefineProperty
|
||||
("CMAKE_SYSROOT", cmProperty::VARIABLE,
|
||||
"Path to pass to the compiler in the --sysroot flag.",
|
||||
"The CMAKE_SYSROOT content is passed to the compiler in the --sysroot "
|
||||
"flag, if supported. The path is also stripped from the RPATH if "
|
||||
"necessary on installation. The CMAKE_SYSROOT is also used to prefix "
|
||||
"paths searched by the find_* commands.",
|
||||
false,
|
||||
"Variables That Change Behavior");
|
||||
|
||||
cm->DefineProperty
|
||||
("CMAKE_FIND_LIBRARY_PREFIXES", cmProperty::VARIABLE,
|
||||
"Prefixes to prepend when looking for libraries.",
|
||||
|
|
|
@ -62,10 +62,15 @@ void cmFindCommon::GenerateDocumentation()
|
|||
"The CMake variable CMAKE_FIND_ROOT_PATH specifies one or more "
|
||||
"directories to be prepended to all other search directories. "
|
||||
"This effectively \"re-roots\" the entire search under given locations. "
|
||||
"By default it is empty. It is especially useful when "
|
||||
"By default it is empty. "
|
||||
"The variable CMAKE_SYSROOT can also be used to specify exactly one "
|
||||
"directory to use as a prefix. Setting CMAKE_SYSROOT also has other "
|
||||
"effects. See the documentation for that variable for more. "
|
||||
"These are especially useful when "
|
||||
"cross-compiling to point to the root directory of the "
|
||||
"target environment and CMake will search there too. By default at first "
|
||||
"the directories listed in CMAKE_FIND_ROOT_PATH and then the non-rooted "
|
||||
"the CMAKE_SYSROOT directory is searched, then the directories listed in "
|
||||
"CMAKE_FIND_ROOT_PATH and then the non-rooted "
|
||||
"directories will be searched. "
|
||||
"The default behavior can be adjusted by setting "
|
||||
"CMAKE_FIND_ROOT_PATH_MODE_XXX. This behavior can be manually "
|
||||
|
@ -187,16 +192,27 @@ void cmFindCommon::RerootPaths(std::vector<std::string>& paths)
|
|||
{
|
||||
return;
|
||||
}
|
||||
const char* sysroot =
|
||||
this->Makefile->GetDefinition("CMAKE_SYSROOT");
|
||||
const char* rootPath =
|
||||
this->Makefile->GetDefinition("CMAKE_FIND_ROOT_PATH");
|
||||
if((rootPath == 0) || (strlen(rootPath) == 0))
|
||||
const bool noSysroot = !sysroot || !*sysroot;
|
||||
const bool noRootPath = !rootPath || !*rootPath;
|
||||
if(noSysroot && noRootPath)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Construct the list of path roots with no trailing slashes.
|
||||
std::vector<std::string> roots;
|
||||
if (sysroot)
|
||||
{
|
||||
roots.push_back(sysroot);
|
||||
}
|
||||
if (rootPath)
|
||||
{
|
||||
cmSystemTools::ExpandListArgument(rootPath, roots);
|
||||
}
|
||||
for(std::vector<std::string>::iterator ri = roots.begin();
|
||||
ri != roots.end(); ++ri)
|
||||
{
|
||||
|
|
|
@ -1425,6 +1425,8 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
|
|||
return;
|
||||
}
|
||||
|
||||
std::string rootPath = this->Makefile->GetSafeDefinition("CMAKE_SYSROOT");
|
||||
|
||||
std::vector<std::string> implicitDirs;
|
||||
// Load implicit include directories for this language.
|
||||
std::string impDirVar = "CMAKE_";
|
||||
|
@ -1437,7 +1439,9 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
|
|||
for(std::vector<std::string>::const_iterator i = impDirVec.begin();
|
||||
i != impDirVec.end(); ++i)
|
||||
{
|
||||
emitted.insert(*i);
|
||||
std::string d = rootPath + *i;
|
||||
cmSystemTools::ConvertToUnixSlashes(d);
|
||||
emitted.insert(d);
|
||||
if (!stripImplicitInclDirs)
|
||||
{
|
||||
implicitDirs.push_back(*i);
|
||||
|
|
|
@ -365,6 +365,22 @@ void cmMakefileExecutableTargetGenerator::WriteExecutableRule(bool relink)
|
|||
vars.TargetVersionMajor = targetVersionMajor.c_str();
|
||||
vars.TargetVersionMinor = targetVersionMinor.c_str();
|
||||
|
||||
if (const char *rootPath =
|
||||
this->Makefile->GetDefinition("CMAKE_SYSROOT"))
|
||||
{
|
||||
if (*rootPath)
|
||||
{
|
||||
if (const char *sysrootFlag =
|
||||
this->Makefile->GetDefinition("CMAKE_SYSROOT_FLAG"))
|
||||
{
|
||||
flags += " ";
|
||||
flags += sysrootFlag;
|
||||
flags += this->LocalGenerator->EscapeForShell(rootPath);
|
||||
flags += " ";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vars.LinkLibraries = linkLibs.c_str();
|
||||
vars.Flags = flags.c_str();
|
||||
vars.LinkFlags = linkFlags.c_str();
|
||||
|
|
|
@ -589,6 +589,26 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules
|
|||
cmLocalGenerator::SHELL);
|
||||
vars.ObjectDir = objdir.c_str();
|
||||
vars.Target = targetOutPathReal.c_str();
|
||||
|
||||
if(this->Target->GetType() == cmTarget::SHARED_LIBRARY)
|
||||
{
|
||||
if (const char *rootPath =
|
||||
this->Makefile->GetSafeDefinition("CMAKE_SYSROOT"))
|
||||
{
|
||||
if (*rootPath)
|
||||
{
|
||||
if (const char *sysrootFlag =
|
||||
this->Makefile->GetDefinition("CMAKE_SYSROOT_FLAG"))
|
||||
{
|
||||
linkFlags += " ";
|
||||
linkFlags += sysrootFlag;
|
||||
linkFlags += this->LocalGenerator->EscapeForShell(rootPath);
|
||||
linkFlags += " ";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vars.LinkLibraries = linkLibs.c_str();
|
||||
vars.ObjectsQuoted = buildObjs.c_str();
|
||||
if (this->Target->HasSOName(this->ConfigName))
|
||||
|
|
|
@ -686,6 +686,23 @@ cmMakefileTargetGenerator
|
|||
cmLocalGenerator::START_OUTPUT,
|
||||
cmLocalGenerator::SHELL);
|
||||
vars.ObjectDir = objectDir.c_str();
|
||||
|
||||
if (const char *rootPath =
|
||||
this->Makefile->GetSafeDefinition("CMAKE_SYSROOT"))
|
||||
{
|
||||
if (*rootPath)
|
||||
{
|
||||
if (const char *sysrootFlag =
|
||||
this->Makefile->GetDefinition("CMAKE_SYSROOT_FLAG"))
|
||||
{
|
||||
flags += " ";
|
||||
flags += sysrootFlag;
|
||||
flags += this->LocalGenerator->EscapeForShell(rootPath);
|
||||
flags += " ";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vars.Flags = flags.c_str();
|
||||
|
||||
std::string definesString = "$(";
|
||||
|
|
|
@ -223,7 +223,27 @@ cmNinjaNormalTargetGenerator
|
|||
vars.TargetVersionMajor = targetVersionMajor.c_str();
|
||||
vars.TargetVersionMinor = targetVersionMinor.c_str();
|
||||
|
||||
vars.Flags = "$FLAGS";
|
||||
|
||||
std::string flags = "$FLAGS";
|
||||
|
||||
if (const char *rootPath =
|
||||
this->GetMakefile()->GetSafeDefinition("CMAKE_SYSROOT"))
|
||||
{
|
||||
if (*rootPath)
|
||||
{
|
||||
if (const char *sysrootFlag =
|
||||
this->GetMakefile()->GetDefinition("CMAKE_SYSROOT_FLAG"))
|
||||
{
|
||||
flags += " ";
|
||||
flags += sysrootFlag;
|
||||
flags += this->GetLocalGenerator()->EscapeForShell(rootPath);
|
||||
flags += " ";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vars.Flags = flags.c_str();
|
||||
|
||||
vars.LinkFlags = "$LINK_FLAGS";
|
||||
|
||||
std::string langFlags;
|
||||
|
|
|
@ -414,6 +414,22 @@ cmNinjaTargetGenerator
|
|||
cmSystemTools::ReplaceString(depFlagsStr, "<CMAKE_C_COMPILER>",
|
||||
mf->GetDefinition("CMAKE_C_COMPILER"));
|
||||
flags += " " + depFlagsStr;
|
||||
|
||||
if (const char *rootPath =
|
||||
this->Makefile->GetSafeDefinition("CMAKE_SYSROOT"))
|
||||
{
|
||||
if (*rootPath)
|
||||
{
|
||||
if (const char *sysrootFlag =
|
||||
this->Makefile->GetDefinition("CMAKE_SYSROOT_FLAG"))
|
||||
{
|
||||
flags += " ";
|
||||
flags += sysrootFlag;
|
||||
flags += this->LocalGenerator->EscapeForShell(rootPath);
|
||||
flags += " ";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
vars.Flags = flags.c_str();
|
||||
|
||||
|
|
Loading…
Reference in New Issue