diff --git a/c/env.c b/c/env.c index 5d9bdad..d1c997d 100644 --- a/c/env.c +++ b/c/env.c @@ -85,9 +85,8 @@ static value_t build_stable_specs_list(void) return acc.list; } -static value_t build_platform_list(void) +static const char *get_build_platform(void) { - struct accum acc; const char *kernel; const char *userland; const char *computer; @@ -194,11 +193,31 @@ static value_t build_platform_list(void) endian = "little"; #endif - accum_init(&acc); - accum_name_value1(&acc, "kernel", symbol(kernel)); - accum_name_value1(&acc, "userland", symbol(userland)); - accum_name_value1(&acc, "computer", symbol(computer)); - accum_name_value1(&acc, "endian", symbol(endian)); + return kernel; +} + +static value_t build_srfi_list(void) +{ + struct accum acc = ACCUM_EMPTY; + + accum_elt(&acc, fixnum(0)); + accum_elt(&acc, fixnum(1)); + accum_elt(&acc, fixnum(6)); + accum_elt(&acc, fixnum(22)); + accum_elt(&acc, fixnum(27)); + accum_elt(&acc, fixnum(174)); + accum_elt(&acc, fixnum(175)); + accum_elt(&acc, fixnum(176)); + return acc.list; +} + +static value_t list_from_cstrv(const char **sv) +{ + struct accum acc = ACCUM_EMPTY; + + for (; *sv; sv++) { + accum_elt(&acc, string_from_cstr(*sv)); + } return acc.list; } @@ -211,29 +230,32 @@ value_t get_version_alist(void) initialized = 1; accum_init(&acc); accum_name_value1(&acc, "command", string_from_cstr("upscheme")); - accum_name_value1(&acc, "scheme-id", symbol("upscheme")); + accum_name_value1(&acc, "release", string_from_cstr(env_release)); + accum_name_value1(&acc, "release/date", + string_from_cstr(env_release_date)); accum_name_value( - &acc, "language", + &acc, "languages", fl_cons(symbol("scheme"), fl_cons(symbol("r7rs"), FL_NIL))); - accum_name_value(&acc, "features", get_features_list()); - accum_name_value(&acc, "platform", build_platform_list()); - accum_name_value(&acc, "c-type-bits", build_c_type_bits_list()); - accum_name_value1(&acc, "c-compiler-version", + accum_name_value1(&acc, "scheme/id", symbol("upscheme")); + accum_name_value(&acc, "scheme/srfi", build_srfi_list()); + accum_name_value(&acc, "scheme/features", get_features_list()); + accum_name_value1(&acc, "build/platform", + string_from_cstr(get_build_platform())); + accum_name_value1(&acc, "build/date", + string_from_cstr(env_build_date)); + accum_name_value1(&acc, "build/git/branch", + string_from_cstr(env_build_git_branch)); + accum_name_value1(&acc, "build/git/commit", + string_from_cstr(env_build_git_commit)); + accum_name_value(&acc, "build/git/modified", + list_from_cstrv(env_build_git_modified)); + accum_name_value(&acc, "c/type-bits", build_c_type_bits_list()); + accum_name_value1(&acc, "c/version", string_from_cstr(SCHEME_C_COMPILER_NAME " " SCHEME_C_COMPILER_VERSION)); - accum_name_value1(&acc, "c-compiler-command", - string_from_cstr(env_build_cc)); - accum_name_value1(&acc, "c-compiler-flags", - string_from_cstr(env_build_cflags)); - accum_name_value1(&acc, "c-linker-flags", - string_from_cstr(env_build_lflags)); - accum_name_value1(&acc, "revision", - string_from_cstr(env_build_revision)); - accum_name_value1(&acc, "build-date", - string_from_cstr(env_build_date)); - accum_name_value1(&acc, "release", string_from_cstr(env_release)); - accum_name_value1(&acc, "release-date", - string_from_cstr(env_release_date)); + accum_name_value(&acc, "c/compile", + list_from_cstrv(env_build_c_compile)); + accum_name_value(&acc, "c/link", list_from_cstrv(env_build_c_link)); accum_name_value(&acc, "upscheme/stable-specs", build_stable_specs_list()); accum_name_value1(&acc, "upscheme/unstable-spec", diff --git a/c/scheme.h b/c/scheme.h index a27e08b..7275a55 100644 --- a/c/scheme.h +++ b/c/scheme.h @@ -1015,11 +1015,12 @@ value_t builtin_version_alist(value_t *args, uint32_t nargs); value_t builtin_environment_stack(value_t *args, uint32_t nargs); -extern const char env_build_cc[]; -extern const char env_build_cflags[]; -extern const char env_build_lflags[]; -extern const char env_build_revision[]; +extern const char *env_build_c_compile[]; +extern const char *env_build_c_link[]; extern const char env_build_date[]; +extern const char env_build_git_branch[]; +extern const char env_build_git_commit[]; +extern const char *env_build_git_modified[]; extern const char env_release[]; extern const char env_release_date[]; diff --git a/scripts/build.sh b/scripts/build.sh index 01320e6..587cefa 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -84,20 +84,36 @@ esac CC="${CC:-$default_cc}" CFLAGS="${CFLAGS:-$default_cflags}" LFLAGS="${LFLAGS:-$default_lflags}" -revision="$(git describe --dirty --always 2>/dev/null || echo unknown)" builddate="$(date -u '+%Y-%m-%d')" builddir="build-$os-$(uname -m | tr A-Z- a-z_)-$(basename "$CC")" cd "$(dirname "$0")"/.. echo "Entering directory '$PWD'" set -x +pre_cflags="$(echo "$CC" "$CFLAGS" | tr ' ' '\n' | sed -e 's/^/"/' -e 's/$/",/')" +pre_lflags="$(echo "$CC" "$LFLAGS" | tr ' ' '\n' | sed -e 's/^/"/' -e 's/$/",/')" + +git_branch="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || true)" +git_commit="$(git rev-parse --short HEAD 2>/dev/null || true)" +git_modified="$(git diff-files --name-only 2>/dev/null | head | xargs -n 1 printf '"%s",\n')" + cat >c/env_build.c <