Skip to content

Commit

Permalink
Improve sentry-native build process
Browse files Browse the repository at this point in the history
Fix script
  • Loading branch information
limbonaut committed Jan 25, 2025
1 parent d913819 commit ca098c6
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 81 deletions.
152 changes: 75 additions & 77 deletions SConstruct
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ BIN_DIR = "{project_dir}/addons/{extension_name}/bin".format(
project_dir=PROJECT_DIR,
extension_name=EXTENSION_NAME)


# *** Generate version header.

print("Generating SDK version header...")
Expand All @@ -38,112 +39,107 @@ version_header_content = """/* DO NOT EDIT - generated by SConstruct */
with open("src/sdk_version.gen.h", "w") as f:
f.write(version_header_content)


# *** Build godot-cpp.

print("Reading godot-cpp build configuration...")
env = SConscript("modules/godot-cpp/SConstruct")


# *** Build sentry-native.

# TODO: macOS needs to use a different SDK.
if env["platform"] in ["linux", "macos"]:
if env["platform"] in ["linux", "macos", "windows"]:
env.Append(CPPDEFINES=["SENTRY_BUILD_STATIC", "NATIVE_SDK"])
env.Append(CPPPATH=["modules/sentry-native/include"])
env.Append(LIBPATH=["modules/sentry-native/install/lib/"])

def build_sentry_native(target, source, env):
result = subprocess.run(
["sh", "scripts/build-sentry-native.sh"],
check=True,
sentry_targets = []
sentry_sources = ["modules/sentry-native/src/"]

def add_target(lib_name):
env.Append(LIBS=[lib_name])
if env["platform"] == "windows":
sentry_targets.append("modules/sentry-native/install/lib/" + lib_name + ".lib")
sentry_targets.append("modules/sentry-native/install/lib/" + lib_name + ".pdb")
else:
sentry_targets.append("modules/sentry-native/install/lib/lib" + lib_name + ".a")

add_target("sentry")
add_target("crashpad_client")
add_target("crashpad_handler_lib")
add_target("crashpad_minidump")
add_target("crashpad_snapshot")
add_target("crashpad_tools")
add_target("crashpad_util")
add_target("mini_chromium")

# Include additional platform-specific libs.
if env["platform"] == "windows":
add_target("crashpad_compat")
env.Append(
LIBS=[
"winhttp",
"advapi32",
"DbgHelp",
"Version",
]
)
return result.returncode
elif env["platform"] == "linux":
add_target("crashpad_compat")
env.Append(
LIBS=[
"curl",
]
)
elif env["platform"] == "macos":
env.Append(
LIBS=[
"curl",
]
)

# TODO: macOS needs to use a different SDK.
if env["platform"] == "windows":
crashpad_handler_bin = "crashpad_handler.exe"
build_command = ["powershell", "scripts/build-sentry-native.ps1"]
else:
crashpad_handler_bin = "crashpad_handler"
build_command = ["sh", "scripts/build-sentry-native.sh"]

crashpad_handler_target = "{bin}/{platform}/crashpad_handler".format(
crashpad_handler_target = "{bin}/{platform}/{handler_bin}".format(
bin=BIN_DIR,
platform=env["platform"]
platform=env["platform"],
handler_bin=crashpad_handler_bin,
)
sentry_native = env.Command(
[
"modules/sentry-native/install/lib/libsentry.a",
crashpad_handler_target,
],
["modules/sentry-native/src"],
[
build_sentry_native,
Copy(
crashpad_handler_target,
"modules/sentry-native/install/bin/crashpad_handler",
),
],
)
elif env["platform"] == "windows":
crashpad_handler_source = "modules/sentry-native/install/bin/" + crashpad_handler_bin
sentry_targets.append(crashpad_handler_target)

def build_sentry_native(target, source, env):
result = subprocess.run(
["powershell", "scripts/build-sentry-native.ps1"],
build_command,
check=True,
)
return result.returncode

sentry_native = env.Command(
["modules/sentry-native/install/lib/sentry.lib", BIN_DIR + "/windows/crashpad_handler.exe"],
["modules/sentry-native/src/"],
sentry_targets,
sentry_sources,
[
build_sentry_native,
Copy(
BIN_DIR + "/windows/crashpad_handler.exe",
"modules/sentry-native/install/bin/crashpad_handler.exe",
),
Copy(crashpad_handler_target, crashpad_handler_source),
],
)
Depends(sentry_native, "modules/godot-cpp") # Force sentry-native to be built sequential to godot-cpp (not in parallel)
Default(sentry_native)
Clean(sentry_native, ["modules/sentry-native/build", "modules/sentry-native/install"])

# Include relative to project source root.
env.Append(CPPPATH=["src/"])
Depends(sentry_native, "modules/godot-cpp") # Force sentry-native to be built sequential to godot-cpp (not in parallel)
Default(sentry_native)
Clean(sentry_native, ["modules/sentry-native/build", "modules/sentry-native/install"])

# Include sentry-native libs (static).
if env["platform"] in ["linux", "macos", "windows"]:
env.Append(CPPDEFINES=["SENTRY_BUILD_STATIC", "NATIVE_SDK"])
env.Append(CPPPATH=["modules/sentry-native/include"])
env.Append(LIBPATH=["modules/sentry-native/install/lib/"])
env.Append(
LIBS=[
"sentry",
"crashpad_client",
"crashpad_handler_lib",
"crashpad_minidump",
"crashpad_snapshot",
"crashpad_tools",
"crashpad_util",
"mini_chromium",
]
)
# Include additional platform-specific libs.
if env["platform"] == "windows":
env.Append(
LIBS=[
"crashpad_compat",
"winhttp",
"advapi32",
"DbgHelp",
"Version",
]
)
elif env["platform"] == "linux":
env.Append(
LIBS=[
"crashpad_compat",
"curl",
]
)
elif env["platform"] == "macos":
env.Append(
LIBS=[
"curl",
]
)

# *** Build GDExtension library.

# Include relative to project source root.
env.Append(CPPPATH=["src/"])

# Source files to compile.
sources = Glob("src/*.cpp")
sources += Glob("src/sentry/*.cpp")
Expand Down Expand Up @@ -178,6 +174,7 @@ else:

Default(library)


# *** Deploy extension manifest.

manifest = env.Substfile(
Expand All @@ -194,6 +191,7 @@ manifest = env.Substfile(

Default(manifest)


# *** Create symbolic link from project addons dir to gdUnit4 testing framework submodule.

def symlink(target, source, env):
Expand Down
51 changes: 47 additions & 4 deletions scripts/build-sentry-native.ps1
Original file line number Diff line number Diff line change
@@ -1,6 +1,49 @@
Push-Location modules\sentry-native
cmake -B build -DSENTRY_BUILD_SHARED_LIBS=OFF -DSENTRY_BUILD_RUNTIMESTATIC=ON -DSENTRY_BACKEND=crashpad -DSENTRY_SDK_NAME="sentry.native.godot" -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build build --target sentry --parallel --config RelWithDebInfo
cmake --build build --target crashpad_handler --parallel --config RelWithDebInfo
cmake --install build --prefix install --config RelWithDebInfo

$curDir = Get-Location
$buildDir = Join-Path -Path $curDir -ChildPath "build"
$installDir = Join-Path -Path $curDir -ChildPath "install"
$pdbBuildDir = Join-Path -Path $buildDir -ChildPath "pdb"
$pdbSourceDir = Join-Path -Path $pdbBuildDir -ChildPath "RelWithDebInfo"
$libInstallDir = Join-Path -Path $installDir -ChildPath "lib"

cmake -B $buildDir -DSENTRY_BUILD_SHARED_LIBS=OFF -DSENTRY_BUILD_RUNTIMESTATIC=ON -DSENTRY_BACKEND=crashpad -DSENTRY_SDK_NAME="sentry.native.godot" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_COMPILE_PDB_OUTPUT_DIRECTORY="$pdbBuildDir"
cmake --build $buildDir --target sentry --parallel --config RelWithDebInfo
cmake --build $buildDir --target crashpad_handler --parallel --config RelWithDebInfo
cmake --install $buildDir --prefix $installDir --config RelWithDebInfo

# *** Install PDB files

Write-Host "Installing PDB files"

if (!(Test-Path -Path $libInstallDir)) {
Throw "Directory $libInstallDir does not exist."
exit
}
if (!(Test-Path -Path $buildDir)) {
Throw "Directory $buildDir does not exist."
exit
}

Get-ChildItem -Path $pdbSourceDir -Filter "*.pdb" -Recurse | ForEach-Object {
$pdbFile = $_.Name
$pdbSource = $_.FullName
$pdbTarget = Join-Path -Path $libInstallDir -ChildPath $pdbFile
$libBase = [System.IO.Path]::GetFileNameWithoutExtension($pdbFile)
$libPath = Join-Path -Path $libInstallDir -ChildPath "$libBase.lib"

if (Test-Path -Path $libPath) {
if (Test-Path -Path $pdbTarget) {
$sourceHash = Get-FileHash -Path $pdbSource -Algorithm SHA256
$targetHash = Get-FileHash -Path $pdbTarget -Algorithm SHA256
if ($sourceHash.Hash -eq $targetHash.Hash) {
Write-Host "-- Up-to-date: $pdbTarget."
return
}
}
Write-Host "-- Installing: $pdbFile to $libInstallDir"
Copy-Item -Path $pdbSource -Destination $pdbTarget -Force
}
}

Pop-Location

0 comments on commit ca098c6

Please sign in to comment.