Skip to content
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
10 changes: 10 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,16 @@ jobs:
command: |
source emsdk_env.sh
python scripts/test.py
- run:
name: --permanent test
shell: powershell.exe
command: |
try {
scripts/test_permanent.ps1
} catch {
Write-Host "`n Error Message: [$($_.Exception.Message)"] -ForegroundColor Red
Write-Host "`n Line Number: "$_.InvocationInfo.ScriptLineNumber -ForegroundColor Red
}

build-docker-image:
executor: bionic
Expand Down
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -176,9 +176,8 @@ reissuing `emsdk install`.

You can toggle between different tools and SDK versions by running `emsdk
activate <tool/sdk name>`. Activating a tool will set up `~/.emscripten` to
point to that particular tool. On Windows, you can pass the option `--global` to
the `activate` command to register the environment permanently to the system
registry for all users.
point to that particular tool. On Windows, you can pass the option `--permanent` to
the `activate` command to register the environment permanently for the current user. Use `--system` to do this for all users.

### How do I build multiple projects with different SDK versions in parallel?

Expand Down
65 changes: 34 additions & 31 deletions emsdk.py
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -1760,18 +1760,13 @@ def is_env_active(self):
return False
return True

def win_activate_env_vars(self, permanently_activate):
def win_activate_env_vars(self, system):
if WINDOWS:
envs = self.activated_environment()
for env in envs:
key, value = parse_key_value(env)

if permanently_activate:
# If there is an env var for the LOCAL USER with same name, it will
# hide the system var, so must remove that first.
win_delete_environment_variable(key, False)

win_set_environment_variable(key, value, permanently_activate)
win_set_environment_variable(key, value, system)

# If this tool can be installed on this system, this function returns True.
# Otherwise, this function returns a string that describes the reason why this
Expand Down Expand Up @@ -2411,7 +2406,7 @@ def write_set_env_script(env_string):
# Reconfigure .emscripten to choose the currently activated toolset, set PATH
# and other environment variables.
# Returns the full list of deduced tools that are now active.
def set_active_tools(tools_to_activate, permanently_activate):
def set_active_tools(tools_to_activate, permanently_activate, system):
tools_to_activate = process_tool_list(tools_to_activate, log_errors=True)

if tools_to_activate:
Expand All @@ -2433,13 +2428,13 @@ def set_active_tools(tools_to_activate, permanently_activate):
if WINDOWS and permanently_activate:
# Individual env. vars
for tool in tools_to_activate:
tool.win_activate_env_vars(permanently_activate=True)
tool.win_activate_env_vars(system=system)

# PATH variable
newpath, added_items = adjusted_path(tools_to_activate, system_path_only=True)
newpath, added_items = adjusted_path(tools_to_activate, system=system)
# Are there any actual changes?
if newpath != os.environ['PATH']:
win_set_environment_variable('PATH', newpath, system=True)
win_set_environment_variable('PATH', newpath, system=system)

return tools_to_activate

Expand Down Expand Up @@ -2485,17 +2480,12 @@ def to_msys_path(p):

# Looks at the current PATH and adds and removes entries so that the PATH reflects
# the set of given active tools.
def adjusted_path(tools_to_activate, log_additions=False, system_path_only=False):
def adjusted_path(tools_to_activate, system=False):
# These directories should be added to PATH
path_add = get_required_path(tools_to_activate)
# These already exist.
if WINDOWS and not MSYS:
existing_path = win_get_environment_variable('PATH', system=True)
if not system_path_only:
current_user_path = win_get_environment_variable('PATH', system=False)
if current_user_path:
existing_path += ENVPATH_SEPARATOR + current_user_path
existing_path = existing_path.split(ENVPATH_SEPARATOR)
existing_path = win_get_environment_variable('PATH', system=system).split(ENVPATH_SEPARATOR)
else:
existing_path = os.environ['PATH'].split(ENVPATH_SEPARATOR)
emsdk_root_path = to_unix_path(emsdk_path())
Expand Down Expand Up @@ -2737,15 +2727,21 @@ def main():

if WINDOWS:
print('''
emsdk activate [--global] [--build=type] [--vs2017/--vs2019] <tool/sdk>
emsdk activate [--permanent] [--system] [--build=type] [--vs2017/--vs2019] <tool/sdk>

- Activates the given tool or SDK in the
environment of the current shell. If the
--global option is passed, the registration
is done globally to all users in the system
environment. If a custom compiler version was
used to override the compiler to use, pass
the same --vs2017/--vs2019 parameter
environment of the current shell.

- If the `--permanent` option is passed, then the environment
variables are set permanently for the current user.

- If the `--system` option is passed, the registration
is done for all users of the system.
This needs admin privileges
(uses Machine environment variables).
Comment thread
aminya marked this conversation as resolved.

- If a custom compiler version was used to override
the compiler to use, pass the same --vs2017/--vs2019 parameter
here to choose which version to activate.

emcmdprompt.bat - Spawns a new command prompt window with the
Expand Down Expand Up @@ -2775,7 +2771,14 @@ def extract_bool_arg(name):

arg_old = extract_bool_arg('--old')
arg_uses = extract_bool_arg('--uses')
arg_permanent = extract_bool_arg('--permanent')
Comment thread
aminya marked this conversation as resolved.
arg_global = extract_bool_arg('--global')
arg_system = extract_bool_arg('--system')
if arg_global:
print('--global is deprecated. Use `--system` to set the environment variables for all users')
Comment thread
aminya marked this conversation as resolved.
arg_system = True
if arg_system:
arg_permanent = True
if extract_bool_arg('--embedded'):
errlog('embedded mode is now the only mode available')
if extract_bool_arg('--no-embedded'):
Expand Down Expand Up @@ -2937,7 +2940,7 @@ def print_tools(t):
print('Items marked with * are activated for the current user.')
if has_partially_active_tools[0]:
env_cmd = 'emsdk_env.bat' if WINDOWS else 'source ./emsdk_env.sh'
print('Items marked with (*) are selected for use, but your current shell environment is not configured to use them. Type "' + env_cmd + '" to set up your current shell to use them' + (', or call "emsdk activate --global <name_of_sdk>" to permanently activate them.' if WINDOWS else '.'))
print('Items marked with (*) are selected for use, but your current shell environment is not configured to use them. Type "' + env_cmd + '" to set up your current shell to use them' + (', or call "emsdk activate --permanent <name_of_sdk>" to permanently activate them.' if WINDOWS else '.'))
if not arg_old:
print('')
print("To access the historical archived versions, type 'emsdk list --old'")
Expand Down Expand Up @@ -2971,8 +2974,8 @@ def print_tools(t):
fetch_emscripten_tags()
return 0
elif cmd == 'activate':
if arg_global:
print('Registering active Emscripten environment globally for all users.')
if arg_permanent:
print('Registering active Emscripten environment permanently')
print('')

tools_to_activate = currently_active_tools()
Expand All @@ -2987,12 +2990,12 @@ def print_tools(t):
if not tools_to_activate:
errlog('No tools/SDKs specified to activate! Usage:\n emsdk activate tool/sdk1 [tool/sdk2] [...]')
return 1
active_tools = set_active_tools(tools_to_activate, permanently_activate=arg_global)
active_tools = set_active_tools(tools_to_activate, permanently_activate=arg_permanent, system=arg_system)
if not active_tools:
errlog('No tools/SDKs found to activate! Usage:\n emsdk activate tool/sdk1 [tool/sdk2] [...]')
return 1
if WINDOWS and not arg_global:
errlog('The changes made to environment variables only apply to the currently running shell instance. Use the \'emsdk_env.bat\' to re-enter this environment later, or if you\'d like to permanently register this environment globally to all users in Windows Registry, rerun this command with the option --global.')
if WINDOWS and not arg_permanent:
errlog('The changes made to environment variables only apply to the currently running shell instance. Use the \'emsdk_env.bat\' to re-enter this environment later, or if you\'d like to permanently register this environment permanently, rerun this command with the option --permanent.')
return 0
elif cmd == 'install':
# Process args
Expand Down
56 changes: 56 additions & 0 deletions scripts/test_permanent.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
$repo_root = [System.IO.Path]::GetDirectoryName((resolve-path "$PSScriptRoot"))

& "$repo_root/emsdk.ps1" install latest
& "$repo_root/emsdk.ps1" activate latest --permanent

$EMSDK_USER = [System.Environment]::GetEnvironmentVariable("EMSDK", "User")
$EM_CONFIG_USER = [System.Environment]::GetEnvironmentVariable("EM_CONFIG", "User")
$EMSDK_NODE_USER = [System.Environment]::GetEnvironmentVariable("EMSDK_NODE", "User")
$EMSDK_PYTHON_USER = [System.Environment]::GetEnvironmentVariable("EMSDK_PYTHON", "User")
$JAVA_HOME_USER = [System.Environment]::GetEnvironmentVariable("JAVA_HOME", "User")
$EM_CACHE_USER = [System.Environment]::GetEnvironmentVariable("EM_CACHE", "User")
$PATH_USER = [System.Environment]::GetEnvironmentVariable("PATH", "User")

if (!$EMSDK_USER) {
throw "EMSDK is not set for the user"
}
if (!$EM_CONFIG_USER) {
throw "EM_CONFIG_USER is not set for the user"
}
if (!$EMSDK_NODE_USER) {
throw "EMSDK_NODE is not set for the user"
}
if (!$JAVA_HOME_USER) {
throw "JAVA_HOME is not set for the user"
}
if (!$EMSDK_PYTHON_USER) {
throw "EMSDK_PYTHON is not set for the user"
}
if (!$EM_CACHE_USER) {
throw "EM_CACHE is not set for the user"
}


$path_split = $PATH_USER.Split(';')

$EMSDK_Path_USER = $path_split | Where-Object { $_ -match 'emsdk' }
if (!$EMSDK_Path_USER) {
throw "No path is added!"
}
$EMSDK_NODE_Path_USER = $path_split | Where-Object { $_ -match 'emsdk\\node' }
if (!$EMSDK_NODE_Path_USER) {
throw "emsdk\node is not added to path."
}
$EMSDK_PYTHON_Path_USER = $path_split | Where-Object { $_ -match 'emsdk\\python' }
if (!$EMSDK_PYTHON_Path_USER) {
throw "emsdk\python is not added to path."
}
$EMSDK_JAVA_Path_USER = $path_split | Where-Object { $_ -match 'emsdk\\java' }
if (!$EMSDK_JAVA_Path_USER) {
throw "emsdk\java is not added to path."
}

$EMSDK_UPSTREAM_Path_USER = $path_split | Where-Object { $_ -match 'emsdk\\upstream\\emscripten' }
if (!$EMSDK_UPSTREAM_Path_USER) {
throw "emsdk\upstream\emscripten is not added to path."
}