Skip to content
This repository has been archived by the owner on Jun 14, 2021. It is now read-only.

Commit

Permalink
Merge pull request #150 from benoit-dubreuil/feature/#135/save-compil…
Browse files Browse the repository at this point in the history
…er-env

Feature/#135/save compiler env
  • Loading branch information
benoit-dubreuil committed Apr 12, 2021
2 parents 519e05e + 48debca commit 28e4e44
Show file tree
Hide file tree
Showing 12 changed files with 158 additions and 64 deletions.
3 changes: 2 additions & 1 deletion conf/script/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
meson >= 0.57
vswhere >= 1.3
colorama >= 0.4.4
colorama >= 0.4.4
javaproperties >= 0.8
1 change: 1 addition & 0 deletions conf/script/src/build_system/build_target/build_target.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class BuildTarget:
dir: Optional[pathlib.Path]
script_dir: Optional[pathlib.Path]
export_shell_env_symlink: Optional[pathlib.Path]
compiler_env_file: Optional[pathlib.Path]

def __init__(self,
compiler_instance: build_system.compiler.installed_instance.CompilerInstance,
Expand Down
12 changes: 8 additions & 4 deletions conf/script/src/build_system/cmd/hierarchy/consts.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import encodings
from typing import Final

import utils.cli.arg
Expand All @@ -6,16 +7,19 @@
ROOT_STR: Final[str] = 'root'
BUILD_SYSTEM_NAME: Final[str] = 'meson'

BUILD_SYSTEM_CONF_FILE_NAME: Final[str] = f'{BUILD_SYSTEM_NAME}.build'

BUILD_DIR_NAME: Final[str] = 'build'
TARGET_SCRIPT_DIR_NAME = 'script'
TARGET_SCRIPT_EXPORT_SHELL_ENV_NAME = 'export_shell_env'
TARGET_SCRIPT_COMPILER_ENV_NAME = 'compiler_env.properties'

CONF_DIR_NAME: Final[str] = 'conf'
CONF_BUILD_SYSTEM_DIR_NAME: Final[str] = f'{BUILD_DIR_NAME}-system'
MESON_MACHINE_FILES_DIR_NAME: Final[str] = 'machine'
TARGET_SCRIPT_DIR_NAME = 'script'
TARGET_SCRIPT_EXPORT_SHELL_ENV_VARS_NAME = 'export_shell_env'

ROOT_DIR_ARG: Final[utils.cli.arg.CLIArg] = utils.cli.arg.CLIArg(f'{ROOT_STR}{DIR_STR}')
BUILD_DIR_ARG: Final[utils.cli.arg.CLIArg] = utils.cli.arg.CLIArg(f'{BUILD_DIR_NAME}{DIR_STR}')

BUILD_DIR_PERMISSIONS: Final[int] = 0o770

BUILD_SYSTEM_CONF_FILE_NAME: Final[str] = f'{BUILD_SYSTEM_NAME}.build'
UTF_8: Final[str] = encodings.utf_8.getregentry().name
14 changes: 14 additions & 0 deletions conf/script/src/build_system/cmd/setup/cli/compiler_env.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from typing import Final

import build_system.build_target.build_target


def print_compiler_env_file(target: build_system.build_target.build_target.BuildTarget) -> None:
from build_system.cmd.setup.cli.colorize import colorize_label, colorize_path

label: Final[str] = colorize_label(label='Compiler env') + ': '

colorized_symlink = colorize_path(path_info=target.compiler_env_file)

print(label, end=str())
print(colorized_symlink)
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
def print_symlink_to_compiler_export_shell_env_script(target: build_system.build_target.build_target.BuildTarget) -> None:
from build_system.cmd.setup.cli.colorize import colorize_label, colorize_path

label: Final[str] = colorize_label(label='Symlink to compiler export shell env vars script') + ': '
label: Final[str] = colorize_label(label='Symlink to compiler export shell env script') + ': '

colorized_symlink = colorize_path(path_info=target.export_shell_env_symlink)

Expand Down
14 changes: 8 additions & 6 deletions conf/script/src/build_system/cmd/setup/impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@


def setup_build_system(root_dir: Optional[Path] = None, cli_mode: bool = False):
from build_system.cmd.setup import setup_steps
from build_system.cmd.setup import setup_steps as step

root_dir = setup_steps.get_verified_root_dir(unverified_root_dir=root_dir)
host_compilers = setup_steps.fetch_host_compilers()
targets = setup_steps.create_targets_build_dirs(root_dir=root_dir, compiler_instances=host_compilers)
setup_steps.setup_targets(root_dir=root_dir, targets=targets, cli_mode=cli_mode)
setup_steps.create_symlinks_to_compilers_export_shell_env_script(targets=targets, cli_mode=cli_mode)
root_dir = step.get_verified_root_dir(unverified_root_dir=root_dir)
host_compilers = step.fetch_host_compilers()
targets = step.create_targets_build_dirs(root_dir=root_dir, compiler_instances=host_compilers)

step.setup_targets(root_dir=root_dir, targets=targets, cli_mode=cli_mode)
step.create_symlinks_to_compilers_export_shell_env_scripts(targets=targets, cli_mode=cli_mode)
step.save_compiler_instances_targets_env(targets=targets, cli_mode=cli_mode)
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from build_system.cmd.setup.setup_steps.step_create_symlimks_to_compilers_export_shell_env_script import create_symlinks_to_compilers_export_shell_env_script
from build_system.cmd.setup.setup_steps.step_create_symlimks_to_compilers_export_shell_env_scripts import create_symlinks_to_compilers_export_shell_env_scripts
from build_system.cmd.setup.setup_steps.step_create_targets_build_dirs import create_targets_build_dirs
from build_system.cmd.setup.setup_steps.step_fetch_host_compilers import fetch_host_compilers
from build_system.cmd.setup.setup_steps.step_get_root_dir import get_verified_root_dir
from build_system.cmd.setup.setup_steps.step_save_compiler_env import save_compiler_instances_targets_env
from build_system.cmd.setup.setup_steps.step_setup_targets import setup_targets
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,24 @@

import build_system.build_target.build_target
import build_system.build_target.compiler_instance_targets
from build_system.cmd.hierarchy.consts import TARGET_SCRIPT_EXPORT_SHELL_ENV_VARS_NAME
from build_system.cmd.hierarchy.consts import TARGET_SCRIPT_EXPORT_SHELL_ENV_NAME


def create_symlinks_to_compilers_export_shell_env_script(targets: list[build_system.build_target.compiler_instance_targets.CompilerInstanceTargets],
cli_mode: bool):
def create_symlinks_to_compilers_export_shell_env_scripts(targets: list[build_system.build_target.compiler_instance_targets.CompilerInstanceTargets],
cli_mode: bool) -> None:
for compiler_instance_targets in targets:
if compiler_instance_targets.compiler_instance.has_export_shell_env_script():
for target in compiler_instance_targets:
_create_symlinks_to_compilers_export_shell_env__script(target=target, cli_mode=cli_mode)
_create_symlink_to_compiler_export_shell_env_script(target=target, cli_mode=cli_mode)


def _create_symlinks_to_compilers_export_shell_env__script(target: build_system.build_target.build_target.BuildTarget,
cli_mode: bool):
def _create_symlink_to_compiler_export_shell_env_script(target: build_system.build_target.build_target.BuildTarget,
cli_mode: bool) -> None:
from build_system.cmd.setup.cli.compiler_shell_env import print_symlink_to_compiler_export_shell_env_script

export_shell_env_script: Path = target.compiler_instance.get_export_shell_env_script()

symlink = target.script_dir / TARGET_SCRIPT_EXPORT_SHELL_ENV_VARS_NAME
symlink: Path = target.script_dir / TARGET_SCRIPT_EXPORT_SHELL_ENV_NAME
symlink.symlink_to(target=export_shell_env_script, target_is_directory=False)

target.export_shell_env_symlink = symlink
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import os
from pathlib import Path

import javaproperties

import build_system.build_target.build_target
import build_system.build_target.compiler_instance_targets
from build_system.cmd.hierarchy.consts import BUILD_DIR_PERMISSIONS, TARGET_SCRIPT_COMPILER_ENV_NAME, UTF_8


def save_compiler_instances_targets_env(targets: list[build_system.build_target.compiler_instance_targets.CompilerInstanceTargets],
cli_mode: bool) -> None:
for compiler_instance_targets in targets:
if compiler_instance_targets.compiler_instance.has_export_shell_env_script():
for target in compiler_instance_targets:
_save_compiler_target_env(target=target, cli_mode=cli_mode)


def _save_compiler_target_env(target: build_system.build_target.build_target.BuildTarget,
cli_mode: bool) -> None:
from build_system.cmd.setup.cli.compiler_env import print_compiler_env_file

encoded_env = _encode_env(target=target)

env_file = _create_target_compiler_env_file(target=target)
env_file.write_text(data=encoded_env, encoding=UTF_8)

_cache_target_compiler_env_file(target=target, env_file=env_file)

if cli_mode:
print_compiler_env_file(target=target)


def _encode_env(target: build_system.build_target.build_target.BuildTarget) -> str:
assert target.compiler_instance.has_cached_compiler_env()

target_compiler_env: dict[str, str] = _multi_line_compiler_env_to_single_line(compiler_env=target.compiler_instance.cached_compiler_env)
encoded_env: str = javaproperties.dumps(props=target_compiler_env, timestamp=False)

return encoded_env


def _create_target_compiler_env_file(target: build_system.build_target.build_target.BuildTarget) -> Path:
target_compiler_env_file: Path = target.script_dir / TARGET_SCRIPT_COMPILER_ENV_NAME
target_compiler_env_file.touch(mode=BUILD_DIR_PERMISSIONS, exist_ok=True)

return target_compiler_env_file


def _cache_target_compiler_env_file(target: build_system.build_target.build_target.BuildTarget,
env_file: Path) -> None:
target.compiler_env_file = env_file


def _multi_line_compiler_env_to_single_line(compiler_env: [dict[str, list[str]]]) -> [dict[str, str]]:
single_line_compiler_env: [dict[str, str]] = {}

for env_key, env_value in compiler_env.items():
single_line_env_value: str = os.pathsep.join(env_value)
single_line_compiler_env[env_key] = single_line_env_value

return single_line_compiler_env
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

def setup_targets(root_dir: Path,
targets: list[build_system.build_target.compiler_instance_targets.CompilerInstanceTargets],
cli_mode: bool):
cli_mode: bool) -> None:
for compiler_instance_targets in targets:
_setup_compiler_instance_targets(root_dir=root_dir, compiler_instance_targets=compiler_instance_targets, cli_mode=cli_mode)

Expand All @@ -17,7 +17,7 @@ def setup_targets(root_dir: Path,

def _setup_compiler_instance_targets(root_dir: Path,
compiler_instance_targets: build_system.build_target.compiler_instance_targets.CompilerInstanceTargets,
cli_mode: bool):
cli_mode: bool) -> None:
from build_system.cmd.setup.meson_utils import setup_target

compiler_instance: Final[build_system.compiler.installed_instance.CompilerInstance] = compiler_instance_targets.compiler_instance
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import contextlib
from dataclasses import dataclass
from pathlib import Path
from typing import final
from typing import Optional, final

import build_system.compiler.build_option.sanitizer
import build_system.compiler.family
Expand All @@ -14,6 +14,7 @@
@dataclass(order=True, frozen=True)
class MSVCCompilerInstance(build_system.compiler.installed_instance.CompilerInstance):
vcvars_arch_batch_file: Path
cached_compiler_env: Optional[dict[str, list[str]]]

def __init__(self, **kwargs):
super().__init__(**kwargs)
Expand Down Expand Up @@ -71,6 +72,12 @@ def get_c_compiler_name() -> str:
def get_cpp_compiler_name() -> str:
return 'cl'

def cache_vcvars_as_compiler_env(self, vcvars: dict[str, list[str]]) -> None:
object.__setattr__(self, 'cached_compiler_env', vcvars)

def has_cached_compiler_env(self) -> bool:
return self.cached_compiler_env is not None

def __find_vcvars_batch_file(self) -> Path:
vcvars_dir: Path = self.__get_vcvars_dir()
vcvars_filename: str = self.__compute_vcvars_arch_batch_filename()
Expand Down
Loading

0 comments on commit 28e4e44

Please sign in to comment.