From: Joel Rosdahl Date: Wed, 22 Jan 2020 21:03:09 +0000 (+0100) Subject: Split ccache.hpp into per-.cpp file headers X-Git-Tag: v4.0~668 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=42939f091a1ba23f98cda768f7465b44fb084a4e;p=thirdparty%2Fccache.git Split ccache.hpp into per-.cpp file headers This reduces code dependencies that hamper refactoring. --- diff --git a/dev.mk.in b/dev.mk.in index d86984c06..2e8b5386a 100644 --- a/dev.mk.in +++ b/dev.mk.in @@ -56,17 +56,23 @@ non_third_party_headers = \ src/Util.hpp \ src/ZstdCompressor.hpp \ src/ZstdDecompressor.hpp \ + src/args.hpp \ src/ccache.hpp \ src/cleanup.hpp \ src/compopt.hpp \ src/compress.hpp \ src/counters.hpp \ + src/execute.hpp \ + src/exitfn.hpp \ src/hash.hpp \ src/hashutil.hpp \ src/language.hpp \ + src/legacy_util.hpp \ + src/lockfile.hpp \ src/macroskip.hpp \ src/manifest.hpp \ src/result.hpp \ + src/stats.hpp \ src/system.hpp \ unittest/framework.hpp \ unittest/util.hpp diff --git a/src/AtomicFile.cpp b/src/AtomicFile.cpp index 9ad351764..9dad3a392 100644 --- a/src/AtomicFile.cpp +++ b/src/AtomicFile.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2019 Joel Rosdahl and other contributors +// Copyright (C) 2019-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -20,7 +20,6 @@ #include "Error.hpp" #include "Util.hpp" -#include "ccache.hpp" #include "third_party/fmt/core.h" diff --git a/src/Config.cpp b/src/Config.cpp index 7d3883abf..34ee5899c 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -21,6 +21,7 @@ #include "AtomicFile.hpp" #include "Error.hpp" #include "Util.hpp" +#include "ccache.hpp" #include #include diff --git a/src/Config.hpp b/src/Config.hpp index 82a06501d..2b8bb77d0 100644 --- a/src/Config.hpp +++ b/src/Config.hpp @@ -20,7 +20,7 @@ #include "system.hpp" -#include "ccache.hpp" +#include "legacy_util.hpp" #include "third_party/fmt/core.h" #include "third_party/nonstd/optional.hpp" diff --git a/src/Stat.cpp b/src/Stat.cpp index ebb47a099..c8b750afe 100644 --- a/src/Stat.cpp +++ b/src/Stat.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2019 Joel Rosdahl and other contributors +// Copyright (C) 2019-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -18,7 +18,7 @@ #include "Stat.hpp" -#include "ccache.hpp" +#include "legacy_util.hpp" #include "third_party/fmt/core.h" diff --git a/src/Util.cpp b/src/Util.cpp index 7edde7342..ab0d7abb6 100644 --- a/src/Util.cpp +++ b/src/Util.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2019 Joel Rosdahl and other contributors +// Copyright (C) 2019-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -20,7 +20,6 @@ #include "Config.hpp" #include "FormatNonstdStringView.hpp" -#include "ccache.hpp" #include #include diff --git a/src/ZstdCompressor.cpp b/src/ZstdCompressor.cpp index e3342b4fa..424f9ba7f 100644 --- a/src/ZstdCompressor.cpp +++ b/src/ZstdCompressor.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2019 Joel Rosdahl and other contributors +// Copyright (C) 2019-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -19,7 +19,7 @@ #include "ZstdCompressor.hpp" #include "Error.hpp" -#include "ccache.hpp" +#include "legacy_util.hpp" const uint8_t k_default_zstd_compression_level = -1; diff --git a/src/ZstdDecompressor.hpp b/src/ZstdDecompressor.hpp index b32f006f3..8f85ce68a 100644 --- a/src/ZstdDecompressor.hpp +++ b/src/ZstdDecompressor.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2019 Joel Rosdahl and other contributors +// Copyright (C) 2019-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -21,7 +21,6 @@ #include "system.hpp" #include "Decompressor.hpp" -#include "ccache.hpp" #include #include diff --git a/src/args.cpp b/src/args.cpp index deb4309dc..78313d126 100644 --- a/src/args.cpp +++ b/src/args.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2002 Andrew Tridgell -// Copyright (C) 2009-2019 Joel Rosdahl and other contributors +// Copyright (C) 2009-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -17,7 +17,9 @@ // this program; if not, write to the Free Software Foundation, Inc., 51 // Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -#include "ccache.hpp" +#include "args.hpp" + +#include "legacy_util.hpp" struct args* args_init(int init_argc, const char* const* init_args) diff --git a/src/args.hpp b/src/args.hpp new file mode 100644 index 000000000..994ae351e --- /dev/null +++ b/src/args.hpp @@ -0,0 +1,41 @@ +// Copyright (C) 2020 Joel Rosdahl and other contributors +// +// See doc/AUTHORS.adoc for a complete list of contributors. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 3 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., 51 +// Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +#pragma once + +struct args +{ + char** argv; + int argc; +}; + +struct args* args_init(int, const char* const*); +struct args* args_init_from_string(const char*); +struct args* args_init_from_gcc_atfile(const char* filename); +struct args* args_copy(struct args* args); +void args_free(struct args* args); +void args_add(struct args* args, const char* s); +void args_add_prefix(struct args* args, const char* s); +void args_extend(struct args* args, struct args* to_append); +void args_insert(struct args* dest, int index, struct args* src, bool replace); +void args_pop(struct args* args, int n); +void args_set(struct args* args, int index, const char* value); +void args_strip(struct args* args, const char* prefix); +void args_remove_first(struct args* args); +char* args_to_string(const struct args* args); +bool args_equal(const struct args* args1, const struct args* args2); diff --git a/src/ccache.cpp b/src/ccache.cpp index 87436cbf9..efec49f06 100644 --- a/src/ccache.cpp +++ b/src/ccache.cpp @@ -23,16 +23,21 @@ #include "FormatNonstdStringView.hpp" #include "ProgressBar.hpp" #include "Util.hpp" +#include "args.hpp" #include "cleanup.hpp" #include "compopt.hpp" #include "compress.hpp" +#include "execute.hpp" +#include "exitfn.hpp" #include "hash.hpp" #include "hashutil.hpp" #include "language.hpp" #include "manifest.hpp" #include "result.hpp" +#include "stats.hpp" #include "third_party/fmt/core.h" +#include "third_party/minitrace.h" #ifdef HAVE_GETOPT_LONG # include @@ -43,6 +48,9 @@ #include #include +#define STRINGIFY(x) #x +#define TO_STRING(x) STRINGIFY(x) + using nonstd::string_view; // Global variables used by other compilation units. @@ -278,11 +286,11 @@ static const int k_tempdir_cleanup_interval = 2 * 24 * 60 * 60; // 2 days #ifndef _WIN32 static sigset_t fatal_signal_set; +#endif // PID of currently executing compiler that we have started, if any. 0 means no -// ongoing compilation. +// ongoing compilation. Not used in the _WIN32 case. static pid_t compiler_pid = 0; -#endif // This is a string that identifies the current "version" of the hash sum // computed by ccache. If, for any reason, we want to force the hash sum to be diff --git a/src/ccache.hpp b/src/ccache.hpp index 7c201c4fa..8b750eb49 100644 --- a/src/ccache.hpp +++ b/src/ccache.hpp @@ -23,65 +23,12 @@ #include "counters.hpp" -#include "third_party/minitrace.h" - -#ifdef __GNUC__ -# define ATTR_FORMAT(x, y, z) \ - __attribute__((format(ATTRIBUTE_FORMAT_PRINTF, y, z))) -# define ATTR_NORETURN __attribute__((noreturn)) -#else -# define ATTR_FORMAT(x, y, z) -# define ATTR_NORETURN -#endif - #ifndef MYNAME # define MYNAME "ccache" #endif -#define STRINGIFY(x) #x -#define TO_STRING(x) STRINGIFY(x) - extern const char CCACHE_VERSION[]; -// Statistics fields in storage order. -enum stats { - STATS_NONE = 0, - STATS_STDOUT = 1, - STATS_STATUS = 2, - STATS_ERROR = 3, - STATS_CACHEMISS = 4, - STATS_PREPROCESSOR = 5, - STATS_COMPILER = 6, - STATS_MISSING = 7, - STATS_CACHEHIT_CPP = 8, - STATS_ARGS = 9, - STATS_LINK = 10, - STATS_NUMFILES = 11, - STATS_TOTALSIZE = 12, - STATS_OBSOLETE_MAXFILES = 13, - STATS_OBSOLETE_MAXSIZE = 14, - STATS_SOURCELANG = 15, - STATS_BADOUTPUTFILE = 16, - STATS_NOINPUT = 17, - STATS_MULTIPLE = 18, - STATS_CONFTEST = 19, - STATS_UNSUPPORTED_OPTION = 20, - STATS_OUTSTDOUT = 21, - STATS_CACHEHIT_DIR = 22, - STATS_NOOUTPUT = 23, - STATS_EMPTYOUTPUT = 24, - STATS_BADEXTRAFILE = 25, - STATS_COMPCHECK = 26, - STATS_CANTUSEPCH = 27, - STATS_PREPROCESSING = 28, - STATS_NUMCLEANUPS = 29, - STATS_UNSUPPORTED_DIRECTIVE = 30, - STATS_ZEROTIMESTAMP = 31, - STATS_CANTUSEMODULES = 32, - - STATS_END -}; - enum guessed_compiler { GUESSED_CLANG, GUESSED_GCC, @@ -112,178 +59,13 @@ extern enum guessed_compiler guessed_compiler; // Allow caching even if -fmodules is used. #define SLOPPY_MODULES (1U << 9) -#define str_eq(s1, s2) (strcmp((s1), (s2)) == 0) -#define str_startswith(s, prefix) \ - (strncmp((s), (prefix), strlen((prefix))) == 0) -#define str_endswith(s, suffix) \ - (strlen(s) >= strlen(suffix) \ - && str_eq((s) + strlen(s) - strlen(suffix), (suffix))) -#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) - -// Buffer size for I/O operations. Should be a multiple of 4 KiB. -#define READ_BUFFER_SIZE 65536 - -class Config; - -// ---------------------------------------------------------------------------- -// args.c - -struct args -{ - char** argv; - int argc; -}; - -struct args* args_init(int, const char* const*); -struct args* args_init_from_string(const char*); -struct args* args_init_from_gcc_atfile(const char* filename); -struct args* args_copy(struct args* args); -void args_free(struct args* args); -void args_add(struct args* args, const char* s); -void args_add_prefix(struct args* args, const char* s); -void args_extend(struct args* args, struct args* to_append); -void args_insert(struct args* dest, int index, struct args* src, bool replace); -void args_pop(struct args* args, int n); -void args_set(struct args* args, int index, const char* value); -void args_strip(struct args* args, const char* prefix); -void args_remove_first(struct args* args); -char* args_to_string(const struct args* args); -bool args_equal(const struct args* args1, const struct args* args2); - -// ---------------------------------------------------------------------------- -// legacy_util.c - -void cc_log(const char* format, ...) ATTR_FORMAT(printf, 1, 2); -void cc_bulklog(const char* format, ...) ATTR_FORMAT(printf, 1, 2); -void cc_log_argv(const char* prefix, char** argv); -void cc_dump_debug_log_buffer(const char* path); -void fatal(const char* format, ...) ATTR_FORMAT(printf, 1, 2) ATTR_NORETURN; -void warn(const char* format, ...) ATTR_FORMAT(printf, 1, 2); - -bool copy_fd(int fd_in, int fd_out); -bool clone_file(const char* src, const char* dest, bool via_tmp_file); -bool copy_file(const char* src, const char* dest, bool via_tmp_file); -bool move_file(const char* src, const char* dest); -const char* get_hostname(void); -const char* tmp_string(void); -char* format(const char* format, ...) ATTR_FORMAT(printf, 1, 2); -void format_hex(const uint8_t* data, size_t size, char* buffer); -void reformat(char** ptr, const char* format, ...) ATTR_FORMAT(printf, 2, 3); -char* x_strdup(const char* s); -char* x_strndup(const char* s, size_t n); -void* x_malloc(size_t size); -void* x_realloc(void* ptr, size_t size); -void x_setenv(const char* name, const char* value); -void x_unsetenv(const char* name); -char* x_dirname(const char* path); -const char* get_extension(const char* path); -char* format_human_readable_size(uint64_t size); -char* format_parsable_size_with_suffix(uint64_t size); -bool parse_size_with_suffix(const char* str, uint64_t* size); -char* x_realpath(const char* path); -char* gnu_getcwd(void); -#ifndef HAVE_LOCALTIME_R -struct tm* localtime_r(const time_t* timep, struct tm* result); -#endif -#ifndef HAVE_STRTOK_R -char* strtok_r(char* str, const char* delim, char** saveptr); -#endif -int create_tmp_fd(char** fname); -FILE* create_tmp_file(char** fname, const char* mode); -const char* get_home_directory(void); -char* get_cwd(void); -bool same_executable_name(const char* s1, const char* s2); -size_t common_dir_prefix_length(const char* s1, const char* s2); -char* get_relative_path(const char* from, const char* to); -bool is_absolute_path(const char* path); -bool is_full_path(const char* path); -void update_mtime(const char* path); -void x_exit(int status) ATTR_NORETURN; -int x_rename(const char* oldpath, const char* newpath); -int tmp_unlink(const char* path); -int x_unlink(const char* path); -int x_try_unlink(const char* path); -#ifndef _WIN32 -char* x_readlink(const char* path); -#endif -bool read_file(const char* path, size_t size_hint, char** data, size_t* size); -char* read_text_file(const char* path, size_t size_hint); -char* subst_env_in_string(const char* str, char** errmsg); -void set_cloexec_flag(int fd); -double time_seconds(void); - -// ---------------------------------------------------------------------------- -// stats.c - -void stats_update(enum stats stat); -void stats_flush(void); -unsigned stats_get_pending(enum stats stat); -void stats_zero(void); -void stats_summary(void); -void stats_print(void); -void stats_update_size(const char* sfile, int64_t size, int files); -void stats_get_obsolete_limits(const char* dir, - unsigned* maxfiles, - uint64_t* maxsize); -void stats_set_sizes(const char* dir, unsigned num_files, uint64_t total_size); -void stats_add_cleanup(const char* dir, unsigned count); -void stats_timestamp(time_t time, struct counters* counters); -void stats_read(const char* path, struct counters* counters); -void stats_write(const char* path, struct counters* counters); - -// ---------------------------------------------------------------------------- -// exitfn.c - -void exitfn_init(void); -void exitfn_add_nullary(void (*function)(void)); -void exitfn_add(void (*function)(void*), void* context); -void exitfn_add_last(void (*function)(void*), void* context); -void exitfn_call(void); - -// ---------------------------------------------------------------------------- -// execute.c - -int execute(char** argv, int fd_out, int fd_err, pid_t* pid); -char* find_executable(const char* name, const char* exclude_name); -void print_command(FILE* fp, char** argv); -char* format_command(const char* const* argv); - -// ---------------------------------------------------------------------------- -// lockfile.c - -bool lockfile_acquire(const char* path, unsigned staleness_limit); -void lockfile_release(const char* path); - -// ---------------------------------------------------------------------------- -// ccache.c - extern time_t time_of_compilation; extern bool output_is_precompiled_header; -void block_signals(void); -void unblock_signals(void); +void block_signals(); +void unblock_signals(); bool cc_process_args(struct args* args, struct args** preprocessor_args, struct args** extra_args_to_hash, struct args** compiler_args); -void cc_reset(void); +void cc_reset(); bool is_precompiled_header(const char* path); - -// ---------------------------------------------------------------------------- - -// Work with silly DOS binary open. -#ifndef O_BINARY -# define O_BINARY 0 -#endif - -#ifdef _WIN32 -char* win32argvtos(char* prefix, char** argv, int* length); -char* win32getshell(char* path); -int win32execute( - char* path, char** argv, int doreturn, int fd_stdout, int fd_stderr); -void add_exe_ext_if_no_to_fullpath(char* full_path_win_ext, - size_t max_size, - const char* ext, - const char* path); - -# define execute(a, b, c, d) win32execute(*(a), a, 1, b, c) -#endif diff --git a/src/cleanup.cpp b/src/cleanup.cpp index b00ca2f9a..318f2ee5c 100644 --- a/src/cleanup.cpp +++ b/src/cleanup.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2002-2006 Andrew Tridgell -// Copyright (C) 2009-2019 Joel Rosdahl and other contributors +// Copyright (C) 2009-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -21,7 +21,7 @@ #include "CacheFile.hpp" #include "Config.hpp" -#include "ccache.hpp" +#include "stats.hpp" #include #include diff --git a/src/compopt.cpp b/src/compopt.cpp index 61a8888cf..885cfa023 100644 --- a/src/compopt.cpp +++ b/src/compopt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -18,7 +18,7 @@ #include "compopt.hpp" -#include "ccache.hpp" +#include "legacy_util.hpp" // The option it too hard to handle at all. #define TOO_HARD (1 << 0) diff --git a/src/compress.cpp b/src/compress.cpp index dd493e9f3..a1cf5b08e 100644 --- a/src/compress.cpp +++ b/src/compress.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2019 Joel Rosdahl and other contributors +// Copyright (C) 2019-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -26,6 +26,7 @@ #include "ThreadPool.hpp" #include "manifest.hpp" #include "result.hpp" +#include "stats.hpp" #include "third_party/fmt/core.h" diff --git a/src/counters.cpp b/src/counters.cpp index ade493c26..2de240814 100644 --- a/src/counters.cpp +++ b/src/counters.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -18,7 +18,9 @@ // A simple array of unsigned integers used for the statistics counters. -#include "ccache.hpp" +#include "counters.hpp" + +#include "legacy_util.hpp" // Allocate and initialize a struct counters. Data entries up to the size are // set to 0. diff --git a/src/execute.cpp b/src/execute.cpp index faac80a24..7ab4c0d47 100644 --- a/src/execute.cpp +++ b/src/execute.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2002 Andrew Tridgell -// Copyright (C) 2011-2019 Joel Rosdahl and other contributors +// Copyright (C) 2011-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -17,6 +17,8 @@ // this program; if not, write to the Free Software Foundation, Inc., 51 // Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +#include "execute.hpp" + #include "Config.hpp" #include "Stat.hpp" #include "Util.hpp" @@ -29,6 +31,12 @@ static char* find_executable_in_path(const char* name, const char* path); #ifdef _WIN32 +int +execute(char** argv, int fd_out, int fd_err, pid_t* /*pid*/) +{ + return win32execute(argv[0], argv, 1, fd_out, fd_err); +} + // Re-create a win32 command line string based on **argv. // http://msdn.microsoft.com/en-us/library/17w5ykft.aspx char* diff --git a/src/execute.hpp b/src/execute.hpp new file mode 100644 index 000000000..4e31f3884 --- /dev/null +++ b/src/execute.hpp @@ -0,0 +1,26 @@ +// Copyright (C) 2020 Joel Rosdahl and other contributors +// +// See doc/AUTHORS.adoc for a complete list of contributors. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 3 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., 51 +// Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +#pragma once + +#include "system.hpp" + +int execute(char** argv, int fd_out, int fd_err, pid_t* pid); +char* find_executable(const char* name, const char* exclude_name); +void print_command(FILE* fp, char** argv); +char* format_command(const char* const* argv); diff --git a/src/exitfn.cpp b/src/exitfn.cpp index 32dfbdfae..ea7d2e68d 100644 --- a/src/exitfn.cpp +++ b/src/exitfn.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -16,7 +16,9 @@ // this program; if not, write to the Free Software Foundation, Inc., 51 // Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -#include "ccache.hpp" +#include "exitfn.hpp" + +#include "legacy_util.hpp" struct exit_function { diff --git a/src/exitfn.hpp b/src/exitfn.hpp new file mode 100644 index 000000000..c8ad8383a --- /dev/null +++ b/src/exitfn.hpp @@ -0,0 +1,25 @@ +// Copyright (C) 2020 Joel Rosdahl and other contributors +// +// See doc/AUTHORS.adoc for a complete list of contributors. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 3 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., 51 +// Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +#pragma once + +void exitfn_init(); +void exitfn_add_nullary(void (*function)()); +void exitfn_add(void (*function)(void*), void* context); +void exitfn_add_last(void (*function)(void*), void* context); +void exitfn_call(); diff --git a/src/hash.cpp b/src/hash.cpp index f839287d2..4e3c76f51 100644 --- a/src/hash.cpp +++ b/src/hash.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2002 Andrew Tridgell -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -19,7 +19,7 @@ #include "hash.hpp" -#include "ccache.hpp" +#include "legacy_util.hpp" #include diff --git a/src/hashutil.cpp b/src/hashutil.cpp index a091225d7..44eacdf15 100644 --- a/src/hashutil.cpp +++ b/src/hashutil.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2009-2019 Joel Rosdahl and other contributors +// Copyright (C) 2009-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -19,8 +19,11 @@ #include "hashutil.hpp" #include "Stat.hpp" +#include "args.hpp" #include "ccache.hpp" +#include "execute.hpp" #include "macroskip.hpp" +#include "stats.hpp" #include "third_party/xxhash.h" diff --git a/src/language.cpp b/src/language.cpp index bfffa2000..df8b9d4eb 100644 --- a/src/language.cpp +++ b/src/language.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -18,7 +18,7 @@ #include "language.hpp" -#include "ccache.hpp" +#include "legacy_util.hpp" // Supported file extensions and corresponding languages (as in parameter to // the -x option). diff --git a/src/legacy_util.cpp b/src/legacy_util.cpp index 5273debd1..b767ad84e 100644 --- a/src/legacy_util.cpp +++ b/src/legacy_util.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2002 Andrew Tridgell -// Copyright (C) 2009-2019 Joel Rosdahl and other contributors +// Copyright (C) 2009-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -20,7 +20,7 @@ #include "Config.hpp" #include "Error.hpp" #include "Util.hpp" -#include "ccache.hpp" +#include "execute.hpp" #include "third_party/fmt/core.h" diff --git a/src/legacy_util.hpp b/src/legacy_util.hpp new file mode 100644 index 000000000..d6069b387 --- /dev/null +++ b/src/legacy_util.hpp @@ -0,0 +1,80 @@ +// Copyright (C) 2020 Joel Rosdahl and other contributors +// +// See doc/AUTHORS.adoc for a complete list of contributors. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 3 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., 51 +// Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +#pragma once + +#include "system.hpp" + +void cc_log(const char* format, ...) ATTR_FORMAT(printf, 1, 2); +void cc_bulklog(const char* format, ...) ATTR_FORMAT(printf, 1, 2); +void cc_log_argv(const char* prefix, char** argv); +void cc_dump_debug_log_buffer(const char* path); +void fatal(const char* format, ...) ATTR_FORMAT(printf, 1, 2) ATTR_NORETURN; +void warn(const char* format, ...) ATTR_FORMAT(printf, 1, 2); + +bool copy_fd(int fd_in, int fd_out); +bool clone_file(const char* src, const char* dest, bool via_tmp_file); +bool copy_file(const char* src, const char* dest, bool via_tmp_file); +bool move_file(const char* src, const char* dest); +const char* get_hostname(); +const char* tmp_string(); +char* format(const char* format, ...) ATTR_FORMAT(printf, 1, 2); +void format_hex(const uint8_t* data, size_t size, char* buffer); +void reformat(char** ptr, const char* format, ...) ATTR_FORMAT(printf, 2, 3); +char* x_strdup(const char* s); +char* x_strndup(const char* s, size_t n); +void* x_malloc(size_t size); +void* x_realloc(void* ptr, size_t size); +void x_setenv(const char* name, const char* value); +void x_unsetenv(const char* name); +char* x_dirname(const char* path); +const char* get_extension(const char* path); +char* format_human_readable_size(uint64_t size); +char* format_parsable_size_with_suffix(uint64_t size); +bool parse_size_with_suffix(const char* str, uint64_t* size); +char* x_realpath(const char* path); +char* gnu_getcwd(); +#ifndef HAVE_LOCALTIME_R +struct tm* localtime_r(const time_t* timep, struct tm* result); +#endif +#ifndef HAVE_STRTOK_R +char* strtok_r(char* str, const char* delim, char** saveptr); +#endif +int create_tmp_fd(char** fname); +FILE* create_tmp_file(char** fname, const char* mode); +const char* get_home_directory(); +char* get_cwd(); +bool same_executable_name(const char* s1, const char* s2); +size_t common_dir_prefix_length(const char* s1, const char* s2); +char* get_relative_path(const char* from, const char* to); +bool is_absolute_path(const char* path); +bool is_full_path(const char* path); +void update_mtime(const char* path); +void x_exit(int status) ATTR_NORETURN; +int x_rename(const char* oldpath, const char* newpath); +int tmp_unlink(const char* path); +int x_unlink(const char* path); +int x_try_unlink(const char* path); +#ifndef _WIN32 +char* x_readlink(const char* path); +#endif +bool read_file(const char* path, size_t size_hint, char** data, size_t* size); +char* read_text_file(const char* path, size_t size_hint); +char* subst_env_in_string(const char* str, char** errmsg); +void set_cloexec_flag(int fd); +double time_seconds(); diff --git a/src/lockfile.cpp b/src/lockfile.cpp index a93be8e33..ce3029cf7 100644 --- a/src/lockfile.cpp +++ b/src/lockfile.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -16,8 +16,9 @@ // this program; if not, write to the Free Software Foundation, Inc., 51 // Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +#include "lockfile.hpp" + #include "Util.hpp" -#include "ccache.hpp" // This function acquires a lockfile for the given path. Returns true if the // lock was acquired, otherwise false. If the lock has been considered stale diff --git a/src/lockfile.hpp b/src/lockfile.hpp new file mode 100644 index 000000000..275c7a0c0 --- /dev/null +++ b/src/lockfile.hpp @@ -0,0 +1,22 @@ +// Copyright (C) 2020 Joel Rosdahl and other contributors +// +// See doc/AUTHORS.adoc for a complete list of contributors. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 3 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., 51 +// Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +#pragma once + +bool lockfile_acquire(const char* path, unsigned staleness_limit); +void lockfile_release(const char* path); diff --git a/src/manifest.cpp b/src/manifest.cpp index cbfe4f479..44413fcdc 100644 --- a/src/manifest.cpp +++ b/src/manifest.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2009-2019 Joel Rosdahl and other contributors +// Copyright (C) 2009-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -25,6 +25,7 @@ #include "Config.hpp" #include "File.hpp" #include "StdMakeUnique.hpp" +#include "ccache.hpp" #include "hash.hpp" #include "hashutil.hpp" diff --git a/src/result.cpp b/src/result.cpp index f74537ac0..d60903632 100644 --- a/src/result.cpp +++ b/src/result.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2019 Joel Rosdahl and other contributors +// Copyright (C) 2019-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -26,6 +26,7 @@ #include "File.hpp" #include "Stat.hpp" #include "Util.hpp" +#include "stats.hpp" // Result data format // ================== diff --git a/src/stats.cpp b/src/stats.cpp index 8f5ee558d..4a3da04d9 100644 --- a/src/stats.cpp +++ b/src/stats.cpp @@ -20,10 +20,13 @@ // Routines to handle the stats files. The stats file is stored one per cache // subdirectory to make this more scalable. +#include "stats.hpp" + #include "AtomicFile.hpp" -#include "ccache.hpp" #include "cleanup.hpp" +#include "counters.hpp" #include "hashutil.hpp" +#include "lockfile.hpp" #include #include diff --git a/src/stats.hpp b/src/stats.hpp new file mode 100644 index 000000000..385ad3486 --- /dev/null +++ b/src/stats.hpp @@ -0,0 +1,76 @@ +// Copyright (C) 2020 Joel Rosdahl and other contributors +// +// See doc/AUTHORS.adoc for a complete list of contributors. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 3 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., 51 +// Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +#pragma once + +#include "system.hpp" + +// Statistics fields in storage order. +enum stats { + STATS_NONE = 0, + STATS_STDOUT = 1, + STATS_STATUS = 2, + STATS_ERROR = 3, + STATS_CACHEMISS = 4, + STATS_PREPROCESSOR = 5, + STATS_COMPILER = 6, + STATS_MISSING = 7, + STATS_CACHEHIT_CPP = 8, + STATS_ARGS = 9, + STATS_LINK = 10, + STATS_NUMFILES = 11, + STATS_TOTALSIZE = 12, + STATS_OBSOLETE_MAXFILES = 13, + STATS_OBSOLETE_MAXSIZE = 14, + STATS_SOURCELANG = 15, + STATS_BADOUTPUTFILE = 16, + STATS_NOINPUT = 17, + STATS_MULTIPLE = 18, + STATS_CONFTEST = 19, + STATS_UNSUPPORTED_OPTION = 20, + STATS_OUTSTDOUT = 21, + STATS_CACHEHIT_DIR = 22, + STATS_NOOUTPUT = 23, + STATS_EMPTYOUTPUT = 24, + STATS_BADEXTRAFILE = 25, + STATS_COMPCHECK = 26, + STATS_CANTUSEPCH = 27, + STATS_PREPROCESSING = 28, + STATS_NUMCLEANUPS = 29, + STATS_UNSUPPORTED_DIRECTIVE = 30, + STATS_ZEROTIMESTAMP = 31, + STATS_CANTUSEMODULES = 32, + + STATS_END +}; + +void stats_update(enum stats stat); +void stats_flush(); +unsigned stats_get_pending(enum stats stat); +void stats_zero(); +void stats_summary(); +void stats_print(); +void stats_update_size(const char* sfile, int64_t size, int files); +void stats_get_obsolete_limits(const char* dir, + unsigned* maxfiles, + uint64_t* maxsize); +void stats_set_sizes(const char* dir, unsigned num_files, uint64_t total_size); +void stats_add_cleanup(const char* dir, unsigned count); +void stats_timestamp(time_t time, struct counters* counters); +void stats_read(const char* path, struct counters* counters); +void stats_write(const char* path, struct counters* counters); diff --git a/src/system.hpp b/src/system.hpp index 4307a7e9c..f22cddd75 100644 --- a/src/system.hpp +++ b/src/system.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -65,6 +65,26 @@ extern int usleep(useconds_t); extern char** environ; +#ifdef __GNUC__ +# define ATTR_FORMAT(x, y, z) \ + __attribute__((format(ATTRIBUTE_FORMAT_PRINTF, y, z))) +# define ATTR_NORETURN __attribute__((noreturn)) +#else +# define ATTR_FORMAT(x, y, z) +# define ATTR_NORETURN +#endif + +#define str_eq(s1, s2) (strcmp((s1), (s2)) == 0) +#define str_startswith(s, prefix) \ + (strncmp((s), (prefix), strlen((prefix))) == 0) +#define str_endswith(s, suffix) \ + (strlen(s) >= strlen(suffix) \ + && str_eq((s) + strlen(s) - strlen(suffix), (suffix))) +#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) + +// Buffer size for I/O operations. Should be a multiple of 4 KiB. +#define READ_BUFFER_SIZE 65536 + #ifndef ESTALE # define ESTALE -1 #endif @@ -86,3 +106,19 @@ extern char** environ; # define DIR_DELIM_CH '/' # define PATH_DELIM ":" #endif + +// Work with silly DOS binary open. +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +#ifdef _WIN32 +char* win32argvtos(char* prefix, char** argv, int* length); +char* win32getshell(char* path); +int win32execute( + char* path, char** argv, int doreturn, int fd_stdout, int fd_stderr); +void add_exe_ext_if_no_to_fullpath(char* full_path_win_ext, + size_t max_size, + const char* ext, + const char* path); +#endif diff --git a/unittest/framework.cpp b/unittest/framework.cpp index 8dee463b2..64e1c6ab5 100644 --- a/unittest/framework.cpp +++ b/unittest/framework.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -19,6 +19,8 @@ #include "framework.hpp" #include "../src/Util.hpp" +#include "../src/args.hpp" +#include "../src/ccache.hpp" #include "util.hpp" #include diff --git a/unittest/framework.hpp b/unittest/framework.hpp index f8d3c86a5..cc6c67087 100644 --- a/unittest/framework.hpp +++ b/unittest/framework.hpp @@ -18,7 +18,7 @@ #pragma once -#include "../src/ccache.hpp" +#include "../src/system.hpp" // ============================================================================ diff --git a/unittest/main.cpp b/unittest/main.cpp index f5b3b01da..567b25f42 100644 --- a/unittest/main.cpp +++ b/unittest/main.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -16,6 +16,7 @@ // this program; if not, write to the Free Software Foundation, Inc., 51 // Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +#include "../src/legacy_util.hpp" #include "catch2_tests.hpp" #include "framework.hpp" diff --git a/unittest/test_Stat.cpp b/unittest/test_Stat.cpp index 31e8126a1..5345c5047 100644 --- a/unittest/test_Stat.cpp +++ b/unittest/test_Stat.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2019 Joel Rosdahl and other contributors +// Copyright (C) 2019-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -18,7 +18,6 @@ #include "../src/Stat.hpp" #include "../src/Util.hpp" -#include "../src/ccache.hpp" #include "third_party/catch.hpp" diff --git a/unittest/test_args.cpp b/unittest/test_args.cpp index d46bfa661..2d441021d 100644 --- a/unittest/test_args.cpp +++ b/unittest/test_args.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -18,7 +18,7 @@ // This file contains tests for the functions operating on struct args. -#include "../src/ccache.hpp" +#include "../src/args.hpp" #include "framework.hpp" #include "util.hpp" diff --git a/unittest/test_argument_processing.cpp b/unittest/test_argument_processing.cpp index 9216555f7..e47b039be 100644 --- a/unittest/test_argument_processing.cpp +++ b/unittest/test_argument_processing.cpp @@ -19,7 +19,9 @@ // This file contains tests for the processing of compiler arguments. #include "../src/Config.hpp" +#include "../src/args.hpp" #include "../src/ccache.hpp" +#include "../src/stats.hpp" #include "framework.hpp" #include "util.hpp" diff --git a/unittest/test_compopt.cpp b/unittest/test_compopt.cpp index 98a834ea3..6a331bc9c 100644 --- a/unittest/test_compopt.cpp +++ b/unittest/test_compopt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -18,7 +18,6 @@ // This file contains tests for the compopt_* functions. -#include "../src/ccache.hpp" #include "../src/compopt.hpp" #include "framework.hpp" diff --git a/unittest/test_counters.cpp b/unittest/test_counters.cpp index e84168901..a8439be84 100644 --- a/unittest/test_counters.cpp +++ b/unittest/test_counters.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -16,7 +16,6 @@ // this program; if not, write to the Free Software Foundation, Inc., 51 // Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -#include "../src/ccache.hpp" #include "../src/counters.hpp" #include "framework.hpp" #include "util.hpp" diff --git a/unittest/test_hash.cpp b/unittest/test_hash.cpp index 6d8795c46..2c402b204 100644 --- a/unittest/test_hash.cpp +++ b/unittest/test_hash.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -18,7 +18,6 @@ // This file contains tests for functions in hash.c. -#include "../src/ccache.hpp" #include "../src/hash.hpp" #include "framework.hpp" diff --git a/unittest/test_hashutil.cpp b/unittest/test_hashutil.cpp index 2cb6c0598..db41f090f 100644 --- a/unittest/test_hashutil.cpp +++ b/unittest/test_hashutil.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -18,7 +18,6 @@ // This file contains tests for functions in hashutil.c. -#include "../src/ccache.hpp" #include "../src/hashutil.hpp" #include "framework.hpp" #include "util.hpp" diff --git a/unittest/test_legacy_util.cpp b/unittest/test_legacy_util.cpp index a08a65dea..d46117e35 100644 --- a/unittest/test_legacy_util.cpp +++ b/unittest/test_legacy_util.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -18,7 +18,8 @@ // This file contains tests for functions in util.c. -#include "../src/ccache.hpp" +#include "../src/execute.hpp" +#include "../src/legacy_util.hpp" #include "framework.hpp" TEST_SUITE(legacy_util) diff --git a/unittest/test_lockfile.cpp b/unittest/test_lockfile.cpp index 1f81cf7a8..e389c954a 100644 --- a/unittest/test_lockfile.cpp +++ b/unittest/test_lockfile.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -19,7 +19,8 @@ // This file contains tests for functions in lockfile.c. #include "../src/Stat.hpp" -#include "../src/ccache.hpp" +#include "../src/legacy_util.hpp" +#include "../src/lockfile.hpp" #include "framework.hpp" #include "util.hpp" diff --git a/unittest/test_stats.cpp b/unittest/test_stats.cpp index aa3aaa26b..402ae1b58 100644 --- a/unittest/test_stats.cpp +++ b/unittest/test_stats.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2019 Joel Rosdahl and other contributors +// Copyright (C) 2010-2020 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // @@ -18,8 +18,8 @@ // This file contains tests for statistics handling. -#include "../src/ccache.hpp" #include "../src/counters.hpp" +#include "../src/stats.hpp" #include "framework.hpp" #include "util.hpp"