diff --git a/internal/shop.cm b/internal/shop.cm index c8545949..1143f3c1 100644 --- a/internal/shop.cm +++ b/internal/shop.cm @@ -13,14 +13,33 @@ var os = use('internal/os') var link = use('link') // These come from env (via core_extras in engine.cm): -// analyze, run_ast_fn, core_json, use_cache, shop_path, actor_api, runtime_env, -// content_hash, cache_path, ensure_build_dir +// analyze, run_ast_fn, core_json, use_cache, core_path, shop_path, actor_api, +// runtime_env, content_hash, cache_path, ensure_build_dir var shop_json = core_json var global_shop_path = shop_path var my$_ = actor_api var core = "core" +// Compiler fingerprint: hash of all compiler source files so that any compiler +// change invalidates the entire build cache. Folded into hash_path(). +var compiler_fingerprint = (function() { + var files = [ + "tokenize", "parse", "fold", "mcode", "streamline", + "qbe", "qbe_emit", "ir_stats" + ] + var combined = "" + var i = 0 + var path = null + while (i < length(files)) { + path = core_path + '/' + files[i] + '.cm' + if (fd.is_file(path)) + combined = combined + text(fd.slurp(path)) + i = i + 1 + } + return content_hash(stone(blob(combined))) +})() + // Make a package name safe for use in C identifiers. // Replaces /, ., -, @ with _ so the result is a valid C identifier fragment. function safe_c_name(name) { @@ -43,7 +62,7 @@ function put_into_cache(content, obj) function hash_path(content, salt) { var s = salt || 'mach' - return global_shop_path + '/build/' + content_hash(stone(blob(text(content) + '\n' + s))) + return global_shop_path + '/build/' + content_hash(stone(blob(text(content) + '\n' + s + '\n' + compiler_fingerprint))) } var Shop = {}