if (generating_dependencies) {
if (!dependency_filename_specified) {
char *default_depfile_name;
- char *last_dot, *last_slash;
-
- last_dot = strrchr(output_obj, '.');
- last_slash = strrchr(output_obj, '/');
- if (!last_dot
- || (last_slash && last_dot < last_slash)) {
- /* No extension, just add .d. */
- last_dot = output_obj + strlen(output_obj);
- }
- x_asprintf(&default_depfile_name,
- "%.*s.d",
- (int)(last_dot - output_obj),
- output_obj);
+ char *base_name;
+
+ base_name = remove_extension(output_obj);
+ x_asprintf(&default_depfile_name, "%s.d", base_name);
+ free(base_name);
args_add(stripped_args, "-MF");
args_add(stripped_args, default_depfile_name);
output_dep = make_relative_path(
void traverse(const char *dir, void (*fn)(const char *, struct stat *));
char *str_basename(const char *s);
char *dirname(char *s);
+char *remove_extension(const char *path);
int read_lock_fd(int fd);
int write_lock_fd(int fd);
size_t file_size(struct stat *st);
return s;
}
+/*
+ * Return a string containing the given path without the filename extension.
+ * Caller frees.
+ */
+char *remove_extension(const char *path)
+{
+ char *ret = x_strdup(path);
+ size_t len = strlen(path);
+ char *p;
+
+ for (p = &ret[len - 1]; p >= ret; --p) {
+ if (*p == '.') {
+ *p = '\0';
+ break;
+ }
+ if (*p == '/') {
+ break;
+ }
+ }
+
+ return ret;
+}
+
static int lock_fd(int fd, short type)
{
struct flock fl;