fix: improve Fish shell support (and Cshell) (#1429) I faced the same issue mentioned in #1299, this PR fixes the issue by taking in account specific `set` and `unset` syntax for Fish shell. The post install instruction (i.e : `./emsdk activate latest`) provides wrong instructions in Fish shell and Cshell cases. This should be fixed by this PR too, although the code is a bit redundant and it could be more cleaner.
diff --git a/emsdk.py b/emsdk.py index 1d8276a..8a64b3f 100644 --- a/emsdk.py +++ b/emsdk.py
@@ -119,10 +119,12 @@ CSH = bool(os.getenv('EMSDK_CSH')) CMD = bool(os.getenv('EMSDK_CMD')) BASH = bool(os.getenv('EMSDK_BASH')) +FISH = bool(os.getenv('EMSDK_FISH')) + if WINDOWS and BASH: MSYS = True -if not CSH and not POWERSHELL and not BASH and not CMD: +if not CSH and not POWERSHELL and not BASH and not CMD and not FISH: # Fall back to default of `cmd` on windows and `bash` otherwise if WINDOWS and not MSYS: CMD = True @@ -1503,6 +1505,22 @@ return root +# returns a tuple (string,string) of config files paths that need to used +# to activate emsdk env depending on $SHELL, defaults to bash. +def get_emsdk_shell_env_configs(): + default_emsdk_env = sdk_path('emsdk_env.sh') + default_shell_config_file = '$HOME/.bash_profile' + shell = os.getenv('SHELL', '') + if 'zsh' in shell: + return (default_emsdk_env, '$HOME/.zprofile') + elif 'csh' in shell: + return (sdk_path('emsdk_env.csh'), '$HOME/.cshrc') + elif 'fish' in shell: + return (sdk_path('emsdk_env.fish'), '$HOME/.config/fish/config.fish') + else: + return (default_emsdk_env, default_shell_config_file) + + def generate_em_config(active_tools, permanently_activate, system): cfg = 'import os\n' cfg += "emsdk_path = os.path.dirname(os.getenv('EM_CONFIG')).replace('\\\\', '/')\n" @@ -1556,22 +1574,16 @@ print('- Consider running `emsdk activate` with --permanent or --system') print(' to have emsdk settings available on startup.') else: - emsdk_env = sdk_path('emsdk_env.sh') print('Next steps:') print('- To conveniently access emsdk tools from the command line,') print(' consider adding the following directories to your PATH:') for p in path_add: print(' ' + p) print('- This can be done for the current shell by running:') + emsdk_env, shell_config_file = get_emsdk_shell_env_configs() print(' source "%s"' % emsdk_env) print('- Configure emsdk in your shell startup scripts by running:') - shell = os.getenv('SHELL', '') - if 'zsh' in shell: - print(' echo \'source "%s"\' >> $HOME/.zprofile' % emsdk_env) - elif 'csh' in shell: - print(' echo \'source "%s"\' >> $HOME/.cshrc' % emsdk_env) - else: - print(' echo \'source "%s"\' >> $HOME/.bash_profile' % emsdk_env) + print(' echo \'source "%s"\' >> %s' % (emsdk_env, shell_config_file)) def find_msbuild_dir(): @@ -2578,6 +2590,8 @@ return 'set %s=\n' % key if CSH: return 'unsetenv %s;\n' % key + if FISH: + return 'set -e %s;\n' % key if BASH: return 'unset %s;\n' % key assert False @@ -2599,6 +2613,8 @@ env_string += 'SET ' + key + '=' + value + '\n' elif CSH: env_string += 'setenv ' + key + ' "' + value + '";\n' + elif FISH: + env_string += 'set -gx ' + key + ' "' + value + '";\n' elif BASH: env_string += 'export ' + key + '="' + value + '";\n' else: @@ -2616,7 +2632,7 @@ # of the SDK but we want to remove that from the current environment # if no such tool is active. # Ignore certain keys that are inputs to emsdk itself. - ignore_keys = set(['EMSDK_POWERSHELL', 'EMSDK_CSH', 'EMSDK_CMD', 'EMSDK_BASH', + ignore_keys = set(['EMSDK_POWERSHELL', 'EMSDK_CSH', 'EMSDK_CMD', 'EMSDK_BASH', 'EMSDK_FISH' 'EMSDK_NUM_CORES', 'EMSDK_NOTTY', 'EMSDK_KEEP_DOWNLOADS']) env_keys_to_add = set(pair[0] for pair in env_vars_to_add) for key in os.environ:
diff --git a/emsdk_env.fish b/emsdk_env.fish index 29f6f46..fbd3a06 100644 --- a/emsdk_env.fish +++ b/emsdk_env.fish
@@ -3,6 +3,8 @@ #Now, when you want to use the SDK, run this alias first to set up #your environment. +set -gx EMSDK_FISH 1 + set -l script (status -f) set -l dir (dirname $script)