Skip to content
Draft
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
22 changes: 19 additions & 3 deletions conan/internal/api/install/generators.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import inspect
import os
import tempfile
import textwrap
import traceback
import importlib

Expand Down Expand Up @@ -221,13 +223,27 @@ def sh_content(files):
save(os.path.join(conanfile.generators_folder, "deactivate_{}".format(filename)),
sh_content(deactivates(shs)))
if bats:
def bat_content(files):
return "\r\n".join(["@echo off"] + ['call "{}"'.format(b) for b in files])
def bat_content(files, is_deactivate=False):
content = ""
if deactivation_mode == "function":
deactivates_var = f"_CONAN_{group}_DEACTIVATES_DIR"
if is_deactivate:
call_prefix = f"%{deactivates_var}%\\"
files = [f.replace("%~dp0\\", call_prefix) for f in files]
else:
content += "\r\n".join([f'set "{deactivates_var}=%TEMP%\\.conan_{group}_deactivate_envs_%RANDOM%"',
f'mkdir "%{deactivates_var}%"',
''])
content += "\r\n".join(["@echo off"] + [f'call "{b}"' for b in files])

return content

filename = "conan{}.bat".format(group)
generated.append(filename)
save(os.path.join(conanfile.generators_folder, filename), bat_content(bats))
# if not deactivation_mode:
save(os.path.join(conanfile.generators_folder, "deactivate_{}".format(filename)),
bat_content(deactivates(bats)))
bat_content(deactivates(bats), True))
if ps1s:
def ps1_content(files):
content = "\r\n".join(['& "{}"'.format(b) for b in files])
Expand Down
64 changes: 38 additions & 26 deletions conan/tools/env/environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -418,36 +418,19 @@ def save_dotenv(self, file_location):

def save_bat(self, file_location, generate_deactivate=True):
_, filename = os.path.split(file_location)
deactivate_file = "deactivate_{}".format(filename)
deactivate = textwrap.dedent("""\
setlocal
echo @echo off > "%~dp0/{deactivate_file}"
echo echo Restoring environment >> "%~dp0/{deactivate_file}"
for %%v in ({vars}) do (
set foundenvvar=
for /f "delims== tokens=1,2" %%a in ('set') do (
if /I "%%a" == "%%v" (
echo set "%%a=%%b">> "%~dp0/{deactivate_file}"
set foundenvvar=1
)
)
if not defined foundenvvar (
echo set %%v=>> "%~dp0/{deactivate_file}"
)
)
endlocal
""").format(deactivate_file=deactivate_file, vars=" ".join(self._values.keys()))
capture = textwrap.dedent("""\
@echo off
chcp 65001 > nul
{deactivate}
""").format(deactivate=deactivate if generate_deactivate else "")
result = [capture]
result = []
abs_base_path, new_path = relativize_paths(self._conanfile, "%~dp0")
for varname, varvalues in self._values.items():
value = varvalues.get_str("%{name}%", subsystem=self._subsystem, pathsep=self._pathsep,
root_path=abs_base_path, script_path=new_path)
result.append('set "{}={}"'.format(varname, value))
if value:
result.append(f'set "{varname}={value}"')
else:
result.append(f'set "{varname}="')

if generate_deactivate:
deactivate_content = _bat_deactivate_contents(self._deactivation_mode, self._values, filename, self._scope)
result.insert(0, deactivate_content)

content = "\n".join(result)
# It is very important to save it correctly with utf-8, the Conan util save() is broken
Expand Down Expand Up @@ -576,6 +559,35 @@ def _old_env_prefix(filename):
return f"_CONAN_OLD_{_deactivate_func_name(filename).upper()}"


def _bat_deactivate_contents(use_deactivate_function, values, filename, scope):
deactivate_file = "deactivate_{}".format(filename)
dest_variable = f"%_CONAN_{scope}_DEACTIVATES_DIR%" if use_deactivate_function else "%~dp0"
return textwrap.dedent("""\
@echo off
chcp 65001 > nul

setlocal
echo @echo off > "{dest_variable}/{deactivate_file}"
echo echo Restoring environment for {filename} with {vars} >> "{dest_variable}/{deactivate_file}"
for %%v in ({vars}) do (
set foundenvvar=
for /f "delims== tokens=1,2" %%a in ('set') do (
if /I "%%a" == "%%v" (
echo set "%%a=%%b">> "{dest_variable}/{deactivate_file}"
set foundenvvar=1
)
)
if not defined foundenvvar (
echo set %%v=>> "{dest_variable}/{deactivate_file}"
)
)
endlocal
""").format(deactivate_file=deactivate_file,
vars=" ".join(values.keys()),
dest_variable=dest_variable,
filename=filename,)


def _ps1_deactivate_contents(deactivation_mode, values, filename):
vars_list = ", ".join(f'"{v}"' for v in values.keys())
if deactivation_mode == "function":
Expand Down
2 changes: 1 addition & 1 deletion test/integration/environment/test_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@ def generate(self):

for _ in range(2): # Just repeat it, so we can check things keep working
if platform.system() == "Windows":
cmd = "conanbuild.bat && display.bat && deactivate_conanbuild.bat && display.bat"
cmd = f"conanbuild.bat && display.bat && deactivate_conanbuild.bat && display.bat"
else:
deactivate_cmd = "deactivate_conanbuild" if deactivation_mode else ". ./deactivate_conanbuild.sh"
cmd = f'. ./conanbuild.sh && ./display.sh && {deactivate_cmd} && ./display.sh'
Expand Down
Loading