Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions TestAssets/TestUtils/SDKLookup/dotnet.runtimeconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"runtimeOptions": {
"framework": {
"name": "Microsoft.NETCore.App",
"version": "9999.0.0"
}
}
}
5 changes: 5 additions & 0 deletions TestAssets/TestUtils/SDKLookup/global.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"sdk": {
"version": "9999.0.0-global-dummy"
}
}
106 changes: 73 additions & 33 deletions src/corehost/cli/fxr/fx_muxer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,23 @@ pal::string_t get_deps_file(
}
}

/**
* Multilevel Lookup is enabled by default
* It can be disabled by setting DOTNET_MULTILEVEL_LOOKUP env var to a value that is not 1
*/
bool multilevel_lookup_enabled()
{
pal::string_t env_lookup;
bool multilevel_lookup = true;

if (pal::getenv(_X("DOTNET_MULTILEVEL_LOOKUP"), &env_lookup))
{
auto env_val = pal::xtoi(env_lookup.c_str());
multilevel_lookup = (env_val == 1);
}
return multilevel_lookup;
}

/**
* Given own location, FX location, app binary and specified --depsfile and probe paths
* return location that is expected to contain hostpolicy
Expand Down Expand Up @@ -375,19 +392,10 @@ pal::string_t fx_muxer_t::resolve_fx_dir(host_mode_t mode, const pal::string_t&
// If it is not activated, then only .exe directory will be considered

std::vector<pal::string_t> hive_dir;
pal::string_t env_lookup;

// Multi-level SharedFX lookup can be disabled by setting DOTNET_MULTILEVEL_LOOKUP env var to zero
bool multilevel_lookup = true;
if (pal::getenv(_X("DOTNET_MULTILEVEL_LOOKUP"), &env_lookup))
{
auto env_val = pal::xtoi(env_lookup.c_str());
multilevel_lookup = (env_val != 0);
}

pal::string_t cwd;
pal::string_t local_dir;
pal::string_t global_dir;
bool multilevel_lookup = multilevel_lookup_enabled();

if (multilevel_lookup)
{
Expand Down Expand Up @@ -582,36 +590,68 @@ bool fx_muxer_t::resolve_sdk_dotnet_path(const pal::string_t& own_dir, pal::stri
trace::verbose(_X("Failed to obtain current working dir"));
}

pal::string_t retval;
if (!global.empty())
std::vector<pal::string_t> hive_dir;
pal::string_t local_dir;
pal::string_t global_dir;
bool multilevel_lookup = multilevel_lookup_enabled();

if (multilevel_lookup)
{
pal::string_t cli_version = resolve_cli_version(global);
if (!cli_version.empty())
if (pal::getcwd(&cwd))
{
pal::string_t sdk_path = own_dir;
append_path(&sdk_path, _X("sdk"));
append_path(&sdk_path, cli_version.c_str());
hive_dir.push_back(cwd);
}
if (pal::get_local_dotnet_dir(&local_dir))
{
hive_dir.push_back(local_dir);
}
}
hive_dir.push_back(own_dir);
if (multilevel_lookup && pal::get_global_dotnet_dir(&global_dir))
{
hive_dir.push_back(global_dir);
}

if (pal::directory_exists(sdk_path))
{
trace::verbose(_X("CLI directory [%s] from global.json exists"), sdk_path.c_str());
retval = sdk_path;
}
else
pal::string_t retval;
for (pal::string_t dir : hive_dir)
{
trace::verbose(_X("Searching SDK directory in [%s]"), dir.c_str());

This comment was marked as spam.

This comment was marked as spam.

if (!global.empty())
{
pal::string_t cli_version = resolve_cli_version(global);
if (!cli_version.empty())
{
trace::verbose(_X("CLI directory [%s] from global.json doesn't exist"), sdk_path.c_str());
pal::string_t sdk_path = dir;
append_path(&sdk_path, _X("sdk"));
append_path(&sdk_path, cli_version.c_str());

if (pal::directory_exists(sdk_path))
{
trace::verbose(_X("CLI directory [%s] from global.json exists"), sdk_path.c_str());
retval = sdk_path;
}
else
{
trace::verbose(_X("CLI directory [%s] from global.json doesn't exist"), sdk_path.c_str());
}
}
}
if (retval.empty())
{
pal::string_t sdk_path = dir;
append_path(&sdk_path, _X("sdk"));
retval = resolve_sdk_version(sdk_path);
}
if (!retval.empty())
{
cli_sdk->assign(retval);
trace::verbose(_X("Found CLI SDK in: %s"), cli_sdk->c_str());
return true;
}
}
if (retval.empty())
{
pal::string_t sdk_path = own_dir;
append_path(&sdk_path, _X("sdk"));
retval = resolve_sdk_version(sdk_path);
}
cli_sdk->assign(retval);
trace::verbose(_X("Found CLI SDK in: %s"), cli_sdk->c_str());
return !retval.empty();

trace::verbose(_X("It was not possible to find any SDK version"));
return false;
}

bool is_sdk_dir_present(const pal::string_t& own_dir)
Expand Down
Loading