329 lines
9.9 KiB
Python
329 lines
9.9 KiB
Python
import argparse
|
|
import os
|
|
import platform
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
from colorama import Fore, Back, Style
|
|
from pathlib import Path
|
|
|
|
from util import *
|
|
|
|
sys.stdout.reconfigure(encoding='utf-8') # for windows gh runner
|
|
|
|
def build(runner: MatrixRunner):
|
|
matrix = runner.current_config()
|
|
|
|
if os.path.exists("build"):
|
|
shutil.rmtree("build", ignore_errors=True)
|
|
|
|
os.makedirs("build", exist_ok=True)
|
|
os.chdir("build")
|
|
|
|
if platform.system() != "Windows":
|
|
succeeded = runner.run_command(
|
|
"cmake",
|
|
"..",
|
|
"-GNinja",
|
|
f"-DCMAKE_BUILD_TYPE={matrix['target']}",
|
|
f"-DCMAKE_CXX_COMPILER={matrix['compiler']}",
|
|
f"-DCMAKE_CXX_STANDARD={matrix['std']}",
|
|
f"-DCPPTRACE_USE_EXTERNAL_LIBDWARF=On",
|
|
f"-DCPPTRACE_USE_EXTERNAL_ZSTD=On",
|
|
f"-DCPPTRACE_WERROR_BUILD=On",
|
|
f"-D{matrix['unwind']}=On",
|
|
f"-D{matrix['symbols']}=On",
|
|
f"-D{matrix['demangle']}=On",
|
|
"-DCPPTRACE_BACKTRACE_PATH=/usr/lib/gcc/x86_64-linux-gnu/10/include/backtrace.h",
|
|
)
|
|
if succeeded:
|
|
succeeded = runner.run_command("ninja")
|
|
else:
|
|
args = [
|
|
"cmake",
|
|
"..",
|
|
f"-DCMAKE_BUILD_TYPE={matrix['target']}",
|
|
f"-DCMAKE_CXX_COMPILER={matrix['compiler']}",
|
|
f"-DCMAKE_CXX_STANDARD={matrix['std']}",
|
|
f"-DCPPTRACE_USE_EXTERNAL_LIBDWARF=On",
|
|
f"-DCPPTRACE_USE_EXTERNAL_ZSTD=On",
|
|
f"-DCPPTRACE_WERROR_BUILD=On",
|
|
f"-D{matrix['unwind']}=On",
|
|
f"-D{matrix['symbols']}=On",
|
|
f"-D{matrix['demangle']}=On",
|
|
]
|
|
if matrix["compiler"] == "g++":
|
|
args.append("-GUnix Makefiles")
|
|
succeeded = runner.run_command(*args)
|
|
if succeeded:
|
|
if matrix["compiler"] == "g++":
|
|
succeeded = runner.run_command("make", "-j", "VERBOSE=1")
|
|
else:
|
|
succeeded = runner.run_command("msbuild", "cpptrace.sln")
|
|
|
|
os.chdir("..")
|
|
print()
|
|
|
|
return succeeded
|
|
|
|
def build_full_or_auto(runner: MatrixRunner):
|
|
matrix = runner.current_config()
|
|
|
|
if os.path.exists("build"):
|
|
shutil.rmtree("build", ignore_errors=True)
|
|
|
|
os.makedirs("build", exist_ok=True)
|
|
os.chdir("build")
|
|
|
|
if platform.system() != "Windows":
|
|
args = [
|
|
"cmake",
|
|
"..",
|
|
"-GNinja",
|
|
f"-DCMAKE_BUILD_TYPE={matrix['target']}",
|
|
f"-DCMAKE_CXX_COMPILER={matrix['compiler']}",
|
|
f"-DCMAKE_CXX_STANDARD={matrix['std']}",
|
|
f"-DCPPTRACE_USE_EXTERNAL_LIBDWARF=On",
|
|
f"-DCPPTRACE_USE_EXTERNAL_ZSTD=On",
|
|
f"-DCPPTRACE_WERROR_BUILD=On",
|
|
f"-DCPPTRACE_BACKTRACE_PATH=/usr/lib/gcc/x86_64-linux-gnu/10/include/backtrace.h",
|
|
]
|
|
if matrix["config"] != "":
|
|
args.append(f"{matrix['config']}")
|
|
succeeded = runner.run_command(*args)
|
|
if succeeded:
|
|
succeeded = runner.run_command("ninja")
|
|
else:
|
|
args = [
|
|
"cmake",
|
|
"..",
|
|
f"-DCMAKE_BUILD_TYPE={matrix['target']}",
|
|
f"-DCMAKE_CXX_COMPILER={matrix['compiler']}",
|
|
f"-DCMAKE_CXX_STANDARD={matrix['std']}",
|
|
f"-DCPPTRACE_USE_EXTERNAL_LIBDWARF=On",
|
|
f"-DCPPTRACE_USE_EXTERNAL_ZSTD=On",
|
|
f"-DCPPTRACE_WERROR_BUILD=On",
|
|
]
|
|
if matrix["config"] != "":
|
|
args.append(f"{matrix['config']}")
|
|
if matrix["compiler"] == "g++":
|
|
args.append("-GUnix Makefiles")
|
|
succeeded = runner.run_command(*args)
|
|
if succeeded:
|
|
if matrix["compiler"] == "g++":
|
|
succeeded = runner.run_command("make", "-j")
|
|
else:
|
|
succeeded = runner.run_command("msbuild", "cpptrace.sln")
|
|
|
|
os.chdir("..")
|
|
print()
|
|
|
|
return succeeded
|
|
|
|
def run_linux_matrix(compilers: list):
|
|
MatrixRunner(
|
|
matrix = {
|
|
"compiler": compilers,
|
|
"target": ["Debug"],
|
|
"std": ["11", "20"],
|
|
"unwind": [
|
|
"CPPTRACE_UNWIND_WITH_UNWIND",
|
|
"CPPTRACE_UNWIND_WITH_EXECINFO",
|
|
"CPPTRACE_UNWIND_WITH_LIBUNWIND",
|
|
"CPPTRACE_UNWIND_WITH_NOTHING",
|
|
],
|
|
"symbols": [
|
|
"CPPTRACE_GET_SYMBOLS_WITH_LIBBACKTRACE",
|
|
"CPPTRACE_GET_SYMBOLS_WITH_LIBDL",
|
|
"CPPTRACE_GET_SYMBOLS_WITH_LIBDWARF",
|
|
"CPPTRACE_GET_SYMBOLS_WITH_ADDR2LINE",
|
|
"CPPTRACE_GET_SYMBOLS_WITH_NOTHING",
|
|
],
|
|
"demangle": [
|
|
"CPPTRACE_DEMANGLE_WITH_CXXABI",
|
|
"CPPTRACE_DEMANGLE_WITH_NOTHING",
|
|
],
|
|
},
|
|
exclude = []
|
|
).run(build)
|
|
|
|
def run_linux_default(compilers: list):
|
|
MatrixRunner(
|
|
matrix = {
|
|
"compiler": compilers,
|
|
"target": ["Debug"],
|
|
"std": ["11", "20"],
|
|
"config": [""]
|
|
},
|
|
exclude = []
|
|
).run(build_full_or_auto)
|
|
|
|
def run_macos_matrix(compilers: list):
|
|
MatrixRunner(
|
|
matrix = {
|
|
"compiler": compilers,
|
|
"target": ["Debug"],
|
|
"std": ["11", "20"],
|
|
"unwind": [
|
|
"CPPTRACE_UNWIND_WITH_UNWIND",
|
|
"CPPTRACE_UNWIND_WITH_EXECINFO",
|
|
"CPPTRACE_UNWIND_WITH_NOTHING",
|
|
],
|
|
"symbols": [
|
|
#"CPPTRACE_GET_SYMBOLS_WITH_LIBBACKTRACE",
|
|
"CPPTRACE_GET_SYMBOLS_WITH_LIBDL",
|
|
"CPPTRACE_GET_SYMBOLS_WITH_LIBDWARF",
|
|
"CPPTRACE_GET_SYMBOLS_WITH_ADDR2LINE",
|
|
"CPPTRACE_GET_SYMBOLS_WITH_NOTHING",
|
|
],
|
|
"demangle": [
|
|
"CPPTRACE_DEMANGLE_WITH_CXXABI",
|
|
"CPPTRACE_DEMANGLE_WITH_NOTHING",
|
|
]
|
|
},
|
|
exclude = []
|
|
).run(build)
|
|
|
|
def run_macos_default(compilers: list):
|
|
MatrixRunner(
|
|
matrix = {
|
|
"compiler": compilers,
|
|
"target": ["Debug"],
|
|
"std": ["11", "20"],
|
|
"config": [""]
|
|
},
|
|
exclude = []
|
|
).run(build_full_or_auto)
|
|
|
|
def run_windows_matrix(compilers: list):
|
|
MatrixRunner(
|
|
matrix = {
|
|
"compiler": compilers,
|
|
"target": ["Debug"],
|
|
"std": ["11", "20"],
|
|
"unwind": [
|
|
"CPPTRACE_UNWIND_WITH_WINAPI",
|
|
"CPPTRACE_UNWIND_WITH_DBGHELP",
|
|
"CPPTRACE_UNWIND_WITH_UNWIND",
|
|
"CPPTRACE_UNWIND_WITH_NOTHING",
|
|
],
|
|
"symbols": [
|
|
"CPPTRACE_GET_SYMBOLS_WITH_DBGHELP",
|
|
"CPPTRACE_GET_SYMBOLS_WITH_LIBDWARF",
|
|
"CPPTRACE_GET_SYMBOLS_WITH_ADDR2LINE",
|
|
"CPPTRACE_GET_SYMBOLS_WITH_NOTHING",
|
|
],
|
|
"demangle": [
|
|
#"CPPTRACE_DEMANGLE_WITH_CXXABI",
|
|
"CPPTRACE_DEMANGLE_WITH_NOTHING",
|
|
]
|
|
},
|
|
exclude = [
|
|
{
|
|
"demangle": "CPPTRACE_DEMANGLE_WITH_CXXABI",
|
|
"compiler": "cl"
|
|
},
|
|
{
|
|
"unwind": "CPPTRACE_UNWIND_WITH_UNWIND",
|
|
"compiler": "cl"
|
|
},
|
|
{
|
|
"unwind": "CPPTRACE_UNWIND_WITH_UNWIND",
|
|
"compiler": "clang++"
|
|
},
|
|
{
|
|
"symbols": "CPPTRACE_GET_SYMBOLS_WITH_ADDR2LINE",
|
|
"compiler": "cl"
|
|
},
|
|
{
|
|
"symbols": "CPPTRACE_GET_SYMBOLS_WITH_ADDR2LINE",
|
|
"compiler": "clang++"
|
|
},
|
|
{
|
|
"symbols": "CPPTRACE_GET_SYMBOLS_WITH_LIBDWARF",
|
|
"compiler": "cl"
|
|
},
|
|
{
|
|
"symbols": "CPPTRACE_GET_SYMBOLS_WITH_LIBDWARF",
|
|
"compiler": "clang++"
|
|
},
|
|
{
|
|
"symbols": "CPPTRACE_GET_SYMBOLS_WITH_DBGHELP",
|
|
"compiler": "g++"
|
|
},
|
|
]
|
|
).run(build)
|
|
|
|
def run_windows_default(compilers: list):
|
|
MatrixRunner(
|
|
matrix = {
|
|
"compiler": compilers,
|
|
"target": ["Debug"],
|
|
"std": ["11", "20"],
|
|
"config": [""]
|
|
},
|
|
exclude = []
|
|
).run(build_full_or_auto)
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
prog="Build in all configs",
|
|
description="Try building the library in all possible configurations for the current host"
|
|
)
|
|
parser.add_argument(
|
|
"--clang",
|
|
action="store_true"
|
|
)
|
|
parser.add_argument(
|
|
"--gcc",
|
|
action="store_true"
|
|
)
|
|
parser.add_argument(
|
|
"--msvc",
|
|
action="store_true"
|
|
)
|
|
parser.add_argument(
|
|
"--all",
|
|
action="store_true"
|
|
)
|
|
parser.add_argument(
|
|
"--default-config",
|
|
action="store_true"
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
if platform.system() == "Linux":
|
|
compilers = []
|
|
if args.clang or args.all:
|
|
compilers.append("clang++-14")
|
|
if args.gcc or args.all:
|
|
compilers.append("g++-10")
|
|
if args.default_config:
|
|
run_linux_default(compilers)
|
|
else:
|
|
run_linux_matrix(compilers)
|
|
if platform.system() == "Darwin":
|
|
compilers = []
|
|
if args.clang or args.all:
|
|
compilers.append("clang++")
|
|
if args.gcc or args.all:
|
|
compilers.append("g++-12")
|
|
if args.default_config:
|
|
run_macos_default(compilers)
|
|
else:
|
|
run_macos_matrix(compilers)
|
|
if platform.system() == "Windows":
|
|
compilers = []
|
|
if args.clang or args.all:
|
|
compilers.append("clang++")
|
|
if args.msvc or args.all:
|
|
compilers.append("cl")
|
|
if args.gcc or args.all:
|
|
compilers.append("g++")
|
|
if args.default_config:
|
|
run_windows_default(compilers)
|
|
else:
|
|
run_windows_matrix(compilers)
|
|
|
|
main()
|