Skip to content

Commit 4778e15

Browse files
committed
Build: fail gracefully
1 parent c3e2cde commit 4778e15

File tree

7 files changed

+68
-99
lines changed

7 files changed

+68
-99
lines changed

build-system/luxmake/__main__.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@
77
It is intended to get the same behaviour between Windows and *nix os
88
"""
99

10-
import logging
1110
import argparse
1211

13-
from .utils import logger
12+
from .utils import set_logger_verbose
1413
from .deps import deps
1514
from .presets import list_presets
1615
from .config import config
@@ -22,10 +21,6 @@
2221

2322
def main():
2423
"""Entry point."""
25-
# Set-up logger
26-
logger.setLevel(logging.INFO)
27-
logging.basicConfig(level=logging.INFO)
28-
2924
# Get command-line parameters
3025
parser = argparse.ArgumentParser(
3126
prog="make",
@@ -65,7 +60,7 @@ def main():
6560
parser_wheel = subparsers.add_parser("wheel-test")
6661
parser_wheel.set_defaults(func=make_wheel)
6762

68-
# Win wheel recomposing
63+
# Windows wheel recomposing
6964
parser_wheel = subparsers.add_parser("win-recompose")
7065
parser_wheel.add_argument("wheel")
7166
parser_wheel.set_defaults(func=win_recompose)
@@ -80,8 +75,7 @@ def main():
8075

8176
args = parser.parse_args()
8277
if args.verbose:
83-
logger.setLevel(logging.DEBUG)
84-
logger.debug("Verbose mode")
78+
set_logger_verbose()
8579
args.func(args)
8680

8781

build-system/luxmake/build.py

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44

55
"""Build and install commands."""
66

7-
import sys
87
from .constants import INSTALL_DIR, BUILD_TYPE, BUILD_DIR
9-
from .utils import run_cmake, logger
8+
from .utils import run_cmake, fail
109
from .presets import get_presets, PresetType
1110

1211

@@ -60,22 +59,11 @@ def _get_preset_from_build_type(
6059
try:
6160
preset = _PRESETS[build_type]
6261
except KeyError:
63-
logger.error(
64-
"Unknown build type '%s'",
62+
fail(
63+
"Unknown build type '%s'. Valid values (case sensitive) are: '%s'",
6564
build_type,
66-
)
67-
logger.error(
68-
"Valid values (case sensitive) are: %s",
6965
_PRESETS.keys(),
7066
)
71-
sys.exit(1)
7267
if preset not in (presets := get_presets(PresetType.BUILD)):
73-
logger.error(
74-
"Preset '%s' missing",
75-
preset,
76-
)
77-
logger.error(
78-
"Available presets: %s",
79-
presets,
80-
)
68+
fail("Preset '%s' missing. Available presets: '%s'", preset, presets)
8169
return preset

build-system/luxmake/clear.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def clear(
5151
ignore_errors=True,
5252
)
5353
except FileNotFoundError:
54+
# Do not fail if not found
5455
logger.debug(
5556
"'%s' not found",
5657
directory,

build-system/luxmake/deps.py

Lines changed: 11 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,23 @@
66

77
import os
88
import tempfile
9-
from urllib.request import (
10-
urlretrieve,
11-
)
12-
from urllib.parse import (
13-
urlparse,
14-
)
15-
from pathlib import (
16-
Path,
17-
)
18-
from zipfile import (
19-
ZipFile,
20-
)
9+
from urllib.request import urlretrieve
10+
from urllib.parse import urlparse
11+
from pathlib import Path
12+
from zipfile import ZipFile
2113
import subprocess
22-
import logging
2314
import shutil
2415
import argparse
2516
import json
2617
import platform
27-
import sys
28-
from functools import (
29-
cache,
30-
)
31-
from dataclasses import (
32-
dataclass,
33-
)
18+
from functools import cache
3419

3520

3621
from .constants import BINARY_DIR
22+
from .utils import logger, fail, Colors, set_logger_verbose
3723

3824
CONAN_ALL_PACKAGES = '"*"'
3925

40-
41-
logger = logging.getLogger("LuxCore Dependencies")
42-
4326
CONAN_ENV = {}
4427

4528
URL_SUFFIXES = {
@@ -50,21 +33,6 @@
5033
}
5134

5235

53-
@dataclass
54-
class Colors:
55-
"""Colors for terminal output."""
56-
57-
HEADER = "\033[95m"
58-
OKBLUE = "\033[94m"
59-
OKCYAN = "\033[96m"
60-
OKGREEN = "\033[92m"
61-
WARNING = "\033[93m"
62-
FAIL = "\033[91m"
63-
ENDC = "\033[0m"
64-
BOLD = "\033[1m"
65-
UNDERLINE = "\033[4m"
66-
67-
6836
def find_platform():
6937
"""Find current platform."""
7038
system = platform.system()
@@ -118,8 +86,7 @@ def ensure_conan_app():
11886
"""Ensure Conan is installed."""
11987
logger.info("Looking for conan")
12088
if not (res := shutil.which("conan")):
121-
logger.error("Conan not found!")
122-
sys.exit(1)
89+
fail("Conan not found!")
12390
logger.info(
12491
"Conan found: '%s'",
12592
res,
@@ -151,10 +118,7 @@ def run_conan(
151118
**kwargs,
152119
)
153120
if res.returncode:
154-
logger.error("Error while executing conan")
155-
print(res.stdout)
156-
print(res.stderr)
157-
sys.exit(1)
121+
fail("Error while executing conan:\n%s\n%s", res.stdout, res.stderr)
158122
return res
159123

160124

@@ -275,10 +239,7 @@ def conan_home():
275239
check=False,
276240
)
277241
if res.returncode:
278-
logger.error("Error while executing conan")
279-
print(res.stdout)
280-
print(res.stderr)
281-
sys.exit(1)
242+
fail("Error while executing conan:\n%s\n%s", res.stdout, res.stderr)
282243
return Path(res.stdout.strip())
283244

284245

@@ -309,8 +270,6 @@ def main(
309270
)
310271

311272
# Set-up logger
312-
logger.setLevel(logging.INFO)
313-
logging.basicConfig(level=logging.INFO)
314273
msg = f"{Colors.OKBLUE}BEGIN{Colors.ENDC}"
315274
logger.info(msg)
316275

@@ -358,7 +317,7 @@ def main(
358317
else:
359318
args = parser.parse_args(call_args)
360319
if args.verbose:
361-
logger.setLevel(logging.DEBUG)
320+
set_logger_verbose()
362321
if args.output:
363322
output_dir = args.output
364323

@@ -374,7 +333,7 @@ def main(
374333
"CONAN_HOME": str(_conan_home),
375334
"GCC_VERSION": str(settings["Build"]["gcc"]),
376335
"CXX_VERSION": str(settings["Build"]["cxx"]),
377-
"BUILD_TYPE": "Release", # TODO Command line parameter
336+
"BUILD_TYPE": "Release",
378337
}
379338
)
380339

build-system/luxmake/utils.py

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,39 @@
99
import logging
1010
import shutil
1111
import subprocess
12+
from dataclasses import dataclass
1213

1314
# Logger
14-
logger = logging.getLogger("LuxCore Build")
15+
logger = logging.getLogger("LuxCore")
16+
17+
18+
def set_logger_verbose():
19+
"""Set logger in verbose mode (show debug messages)."""
20+
logger.setLevel(logging.DEBUG)
21+
logger.debug("Verbose mode")
22+
23+
24+
def fail(*args):
25+
"""Fails gracefully."""
26+
print(end=Colors.FAIL, flush=True)
27+
logger.error(*args)
28+
print(end=Colors.ENDC, flush=True)
29+
sys.exit(1)
30+
31+
32+
@dataclass
33+
class Colors:
34+
"""Colors for terminal output."""
35+
36+
HEADER = "\033[95m"
37+
OKBLUE = "\033[94m"
38+
OKCYAN = "\033[96m"
39+
OKGREEN = "\033[92m"
40+
WARNING = "\033[93m"
41+
FAIL = "\033[91m"
42+
ENDC = "\033[0m"
43+
BOLD = "\033[1m"
44+
UNDERLINE = "\033[4m"
1545

1646

1747
# Cmake
@@ -20,8 +50,7 @@ def ensure_cmake_app():
2050
"""Ensure cmake is installed."""
2151
logger.debug("Looking for cmake")
2252
if not (res := shutil.which("cmake")):
23-
logger.error("CMake not found!")
24-
sys.exit(1)
53+
fail("CMake not found!")
2554
logger.debug(
2655
"CMake found: '%s'",
2756
res,
@@ -44,10 +73,7 @@ def run_cmake(
4473
**kwargs,
4574
)
4675
if res.returncode:
47-
logger.error("Error while executing cmake")
48-
print(res.stdout)
49-
print(res.stderr)
50-
sys.exit(1)
76+
fail("Error while executing cmake:\n%s\n%s", res.stdout, res.stderr)
5177
return res
5278

5379

@@ -66,8 +92,7 @@ def unpack(path, dest):
6692
args, text=True, stderr=subprocess.STDOUT
6793
)
6894
except subprocess.CalledProcessError as err:
69-
logger.error(err.output)
70-
sys.exit(1)
95+
fail(err.output)
7196
logger.info(output)
7297

7398

@@ -86,6 +111,11 @@ def pack(directory, dest_dir):
86111
args, text=True, stderr=subprocess.STDOUT
87112
)
88113
except subprocess.CalledProcessError as err:
89-
logger.error(err.output)
90-
sys.exit(1)
114+
fail(err.output)
91115
logger.info(output)
116+
117+
118+
# Initialization
119+
# Set-up logger
120+
logger.setLevel(logging.INFO)
121+
logging.basicConfig(level=logging.INFO)

build-system/luxmake/wheel.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from pathlib import Path
1515

1616
from .constants import SOURCE_DIR, INSTALL_DIR, BINARY_DIR, WHEELHOUSE_DIR
17-
from .utils import logger, pack
17+
from .utils import logger, pack, fail
1818
from .build import build_and_install
1919
from .windows import win_recompose
2020

@@ -43,8 +43,7 @@ def _compute_platform_tag():
4343
return "macosx_14_2"
4444

4545
# Failed:
46-
logger.error("Unknown platform/system: '%s' / '%s'", platform, machine)
47-
sys.exit(1)
46+
return fail("Unknown platform/system: '%s' / '%s'", platform, machine)
4847

4948

5049
def _get_lib_paths():
@@ -144,8 +143,7 @@ def make_wheel(args):
144143
try:
145144
result = subprocess.check_output(cmd, text=True)
146145
except subprocess.CalledProcessError as err:
147-
logger.error(err)
148-
sys.exit(1)
146+
fail(err)
149147
logger.info(result)
150148

151149
# And, for Windows, recompose

build-system/luxmake/windows.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
import argparse
1414
import tempfile
1515
import shutil
16-
import sys
1716

1817
from wheel.wheelfile import WheelFile
1918

20-
from .utils import pack, unpack, logger
19+
from .utils import pack, unpack, logger, fail
20+
2121

2222
def _rename(basepath, org, dest):
2323
"""Rename wheel component."""
@@ -27,8 +27,7 @@ def _rename(basepath, org, dest):
2727
basepath / "pyluxcore.libs" / dest,
2828
)
2929
except FileNotFoundError:
30-
logger.error("Missing file in wheel: '%s'", org)
31-
sys.exit(1)
30+
fail("Missing file in wheel: '%s'", org)
3231

3332

3433
def win_recompose(args):
@@ -71,6 +70,6 @@ def win_recompose(args):
7170
# Parse arguments
7271
parser = argparse.ArgumentParser()
7372
parser.add_argument("wheelpath", type=Path)
74-
args = parser.parse_args()
73+
main_args = parser.parse_args()
7574

76-
recompose(args.wheelpath)
75+
win_recompose(main_args)

0 commit comments

Comments
 (0)