This reduces code dependencies that hamper refactoring.
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
-// 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.
//
#include "Error.hpp"
#include "Util.hpp"
-#include "ccache.hpp"
#include "third_party/fmt/core.h"
#include "AtomicFile.hpp"
#include "Error.hpp"
#include "Util.hpp"
+#include "ccache.hpp"
#include <algorithm>
#include <cassert>
#include "system.hpp"
-#include "ccache.hpp"
+#include "legacy_util.hpp"
#include "third_party/fmt/core.h"
#include "third_party/nonstd/optional.hpp"
-// 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.
//
#include "Stat.hpp"
-#include "ccache.hpp"
+#include "legacy_util.hpp"
#include "third_party/fmt/core.h"
-// 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.
//
#include "Config.hpp"
#include "FormatNonstdStringView.hpp"
-#include "ccache.hpp"
#include <algorithm>
#include <fstream>
-// 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.
//
#include "ZstdCompressor.hpp"
#include "Error.hpp"
-#include "ccache.hpp"
+#include "legacy_util.hpp"
const uint8_t k_default_zstd_compression_level = -1;
-// 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.
//
#include "system.hpp"
#include "Decompressor.hpp"
-#include "ccache.hpp"
#include <fstream>
#include <zstd.h>
// 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.
//
// 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)
--- /dev/null
+// 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);
#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 <getopt.h>
#include <fstream>
#include <limits>
+#define STRINGIFY(x) #x
+#define TO_STRING(x) STRINGIFY(x)
+
using nonstd::string_view;
// Global variables used by other compilation units.
#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
#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,
// 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
// 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.
//
#include "CacheFile.hpp"
#include "Config.hpp"
-#include "ccache.hpp"
+#include "stats.hpp"
#include <algorithm>
#include <math.h>
-// 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.
//
#include "compopt.hpp"
-#include "ccache.hpp"
+#include "legacy_util.hpp"
// The option it too hard to handle at all.
#define TOO_HARD (1 << 0)
-// 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.
//
#include "ThreadPool.hpp"
#include "manifest.hpp"
#include "result.hpp"
+#include "stats.hpp"
#include "third_party/fmt/core.h"
-// 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.
//
// 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.
// 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.
//
// 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"
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*
--- /dev/null
+// 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);
-// 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.
//
// 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
{
--- /dev/null
+// 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();
// 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.
//
#include "hash.hpp"
-#include "ccache.hpp"
+#include "legacy_util.hpp"
#include <blake2.h>
-// 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.
//
#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"
-// 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.
//
#include "language.hpp"
-#include "ccache.hpp"
+#include "legacy_util.hpp"
// Supported file extensions and corresponding languages (as in parameter to
// the -x option).
// 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.
//
#include "Config.hpp"
#include "Error.hpp"
#include "Util.hpp"
-#include "ccache.hpp"
+#include "execute.hpp"
#include "third_party/fmt/core.h"
--- /dev/null
+// 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();
-// 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.
//
// 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
--- /dev/null
+// 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);
-// 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.
//
#include "Config.hpp"
#include "File.hpp"
#include "StdMakeUnique.hpp"
+#include "ccache.hpp"
#include "hash.hpp"
#include "hashutil.hpp"
-// 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.
//
#include "File.hpp"
#include "Stat.hpp"
#include "Util.hpp"
+#include "stats.hpp"
// Result data format
// ==================
// 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 <cmath>
#include <fcntl.h>
--- /dev/null
+// 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);
-// 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.
//
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
# 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
-// 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.
//
#include "framework.hpp"
#include "../src/Util.hpp"
+#include "../src/args.hpp"
+#include "../src/ccache.hpp"
#include "util.hpp"
#include <float.h>
#pragma once
-#include "../src/ccache.hpp"
+#include "../src/system.hpp"
// ============================================================================
-// 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.
//
// 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"
-// 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.
//
#include "../src/Stat.hpp"
#include "../src/Util.hpp"
-#include "../src/ccache.hpp"
#include "third_party/catch.hpp"
-// 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.
//
// 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"
// 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"
-// 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.
//
// This file contains tests for the compopt_* functions.
-#include "../src/ccache.hpp"
#include "../src/compopt.hpp"
#include "framework.hpp"
-// 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.
//
// 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"
-// 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.
//
// This file contains tests for functions in hash.c.
-#include "../src/ccache.hpp"
#include "../src/hash.hpp"
#include "framework.hpp"
-// 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.
//
// This file contains tests for functions in hashutil.c.
-#include "../src/ccache.hpp"
#include "../src/hashutil.hpp"
#include "framework.hpp"
#include "util.hpp"
-// 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.
//
// 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)
-// 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.
//
// 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"
-// 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.
//
// 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"