Skip to content
Open
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
58 changes: 58 additions & 0 deletions ldk-server-cli/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// This file is Copyright its original authors, visible in version control
// history.
//
// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// You may not use this file except in accordance with one or both of these
// licenses.

use std::env;
use std::path::Path;
use std::process::Command;

fn main() {
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-env-changed=GIT_HASH");

// Re-run the build script whenever the checked-out commit changes so the
// embedded hash never goes stale. HEAD lives in the (possibly worktree-local)
// git dir, while branch refs and packed-refs live in the common git dir.
if let Some(git_dir) = git_output(&["rev-parse", "--git-dir"]) {
watch_if_exists(&Path::new(&git_dir).join("HEAD"));
}
if let Some(common_dir) = git_output(&["rev-parse", "--git-common-dir"]) {
let common_dir = Path::new(&common_dir);
watch_if_exists(&common_dir.join("packed-refs"));
// If HEAD points at a ref, watch that ref file too (it changes on commit).
if let Some(ref_path) = git_output(&["symbolic-ref", "-q", "HEAD"]) {
watch_if_exists(&common_dir.join(ref_path));
}
}

if env::var("GIT_HASH").is_err() {
let git_hash = git_output(&["rev-parse", "HEAD"]).unwrap_or_else(|| "unknown".to_string());
println!("cargo:rustc-env=GIT_HASH={git_hash}");
}
}

/// Runs `git` with the given args, returning the trimmed stdout on success or
/// `None` if git is unavailable, exits non-zero, or produces no output.
fn git_output(args: &[&str]) -> Option<String> {
let output = Command::new("git").args(args).output().ok()?;
if !output.status.success() {
return None;
}
let stdout = String::from_utf8_lossy(&output.stdout).trim().to_string();
if stdout.is_empty() {
None
} else {
Some(stdout)
}
}

fn watch_if_exists(path: &Path) {
if path.exists() {
println!("cargo:rerun-if-changed={}", path.display());
}
}
4 changes: 3 additions & 1 deletion ldk-server-cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ use types::{

mod types;

const FULL_VERSION: &str = concat!(env!("CARGO_PKG_VERSION"), " (", env!("GIT_HASH"), ")");

const DEFAULT_DIR: &str = if cfg!(target_os = "macos") {
"~/Library/Application Support/ldk-server"
} else if cfg!(target_os = "windows") {
Expand All @@ -71,7 +73,7 @@ const DEFAULT_DIR: &str = if cfg!(target_os = "macos") {
#[derive(Parser, Debug)]
#[command(
name = "ldk-server-cli",
version,
version = FULL_VERSION,
about = "CLI for interacting with an LDK Server node",
override_usage = "ldk-server-cli [OPTIONS] <COMMAND>"
)]
Expand Down
58 changes: 58 additions & 0 deletions ldk-server/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// This file is Copyright its original authors, visible in version control
// history.
//
// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// You may not use this file except in accordance with one or both of these
// licenses.

use std::env;
use std::path::Path;
use std::process::Command;

fn main() {
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-env-changed=GIT_HASH");

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we make sure to update GIT_HASH if HEAD changes after the first from-clean build. Here it seems HEAD could change, and we'd ship a binary with a wrong rev ?

Or perhaps cargo install always re-runs build.rs so we might be good here.

@tankyleo tankyleo Jun 8, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also trying to understand how this triggers. After build.rs sets GIT_HASH, what other thing could cause GIT_HASH to change, and trigger build.rs again ?

@benthecarman benthecarman Jun 16, 2026

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Made it so it watches the git hash file so if it changes then we recalc


// Re-run the build script whenever the checked-out commit changes so the
// embedded hash never goes stale. HEAD lives in the (possibly worktree-local)
// git dir, while branch refs and packed-refs live in the common git dir.
if let Some(git_dir) = git_output(&["rev-parse", "--git-dir"]) {
watch_if_exists(&Path::new(&git_dir).join("HEAD"));
}
if let Some(common_dir) = git_output(&["rev-parse", "--git-common-dir"]) {
let common_dir = Path::new(&common_dir);
watch_if_exists(&common_dir.join("packed-refs"));
// If HEAD points at a ref, watch that ref file too (it changes on commit).
if let Some(ref_path) = git_output(&["symbolic-ref", "-q", "HEAD"]) {
watch_if_exists(&common_dir.join(ref_path));
}
}

if env::var("GIT_HASH").is_err() {
let git_hash = git_output(&["rev-parse", "HEAD"]).unwrap_or_else(|| "unknown".to_string());
println!("cargo:rustc-env=GIT_HASH={git_hash}");
}
}

/// Runs `git` with the given args, returning the trimmed stdout on success or
/// `None` if git is unavailable, exits non-zero, or produces no output.
fn git_output(args: &[&str]) -> Option<String> {
let output = Command::new("git").args(args).output().ok()?;
if !output.status.success() {
return None;
}
let stdout = String::from_utf8_lossy(&output.stdout).trim().to_string();
if stdout.is_empty() {
None
} else {
Some(stdout)
}
}

fn watch_if_exists(path: &Path) {
if path.exists() {
println!("cargo:rerun-if-changed={}", path.display());
}
}
3 changes: 2 additions & 1 deletion ldk-server/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ use crate::util::tls::get_or_generate_tls_config;
use crate::util::{systemd, write_new};

const API_KEY_FILE: &str = "api_key";
const FULL_VERSION: &str = concat!(env!("CARGO_PKG_VERSION"), " (", env!("GIT_HASH"), ")");

pub fn get_default_data_dir() -> Option<PathBuf> {
#[cfg(target_os = "macos")]
Expand Down Expand Up @@ -241,7 +242,7 @@ fn main() {
let (event_sender, _) = broadcast::channel::<EventEnvelope>(1024);
let (shutdown_tx, shutdown_rx) = tokio::sync::watch::channel(false);

info!("Starting up...");
info!("Starting ldk-server version {FULL_VERSION}");

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we also do this when we rotate the logs ?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can do after #189

match node.start() {
Ok(()) => {},
Err(e) => {
Expand Down
2 changes: 1 addition & 1 deletion ldk-server/src/util/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -742,7 +742,7 @@ impl TryFrom<&LSPSClientTomlConfig> for LSPSClientConfig {

#[derive(Parser, Debug)]
#[command(
version,
version = crate::FULL_VERSION,
about = "LDK Server Configuration",
long_about = None,
override_usage = "ldk-server [config_path]"
Expand Down