@@ -131,6 +131,20 @@
</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term>exclude <replaceable>excludedir</replaceable>
+ </term>
+ <listitem>
+ <para>
+ This specifies the trailing directories that will be excluded
+ during the search for kernel modules.
+ </para>
+ <para>
+ The <replaceable>excludedir</replaceable> is the trailing directory
+ to exclude
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
</refsect1>
@@ -458,6 +458,11 @@ struct cfg_external {
char path[];
};
+struct cfg_exclude {
+ struct cfg_exclude *next;
+ char exclude_dir[];
+};
+
struct cfg {
const char *kversion;
char dirname[PATH_MAX];
@@ -469,6 +474,7 @@ struct cfg {
struct cfg_override *overrides;
struct cfg_search *searches;
struct cfg_external *externals;
+ struct cfg_exclude *excludes;
};
static enum search_type cfg_define_search_type(const char *path)
@@ -580,6 +586,30 @@ static void cfg_external_free(struct cfg_external *ext)
free(ext);
}
+static int cfg_exclude_add(struct cfg *cfg, const char *path)
+{
+ struct cfg_exclude *exc;
+ size_t len = strlen(path);
+
+ exc = malloc(sizeof(struct cfg_exclude) + len + 1);
+ if (exc == NULL) {
+ ERR("exclude add: out of memory\n");
+ return -ENOMEM;
+ }
+ memcpy(exc->exclude_dir, path, len + 1);
+
+ DBG("exclude add: %s\n", path);
+
+ exc->next = cfg->excludes;
+ cfg->excludes = exc;
+ return 0;
+}
+
+static void cfg_exclude_free(struct cfg_exclude *exc)
+{
+ free(exc);
+}
+
static int cfg_kernel_matches(const struct cfg *cfg, const char *pattern)
{
regex_t re;
@@ -657,6 +687,11 @@ static int cfg_file_parse(struct cfg *cfg, const char *filename)
}
cfg_external_add(cfg, dir);
+ } else if (streq(cmd, "exclude")) {
+ const char *sp;
+ while ((sp = strtok_r(NULL, "\t ", &saveptr)) != NULL) {
+ cfg_exclude_add(cfg, sp);
+ }
} else if (streq(cmd, "include")
|| streq(cmd, "make_map_files")) {
INF("%s:%u: command %s not implemented yet\n",
@@ -857,6 +892,12 @@ static void cfg_free(struct cfg *cfg)
cfg->externals = cfg->externals->next;
cfg_external_free(tmp);
}
+
+ while (cfg->excludes) {
+ struct cfg_exclude *tmp = cfg->excludes;
+ cfg->excludes = cfg->excludes->next;
+ cfg_exclude_free(tmp);
+ }
}
@@ -1229,6 +1270,24 @@ add:
return 0;
}
+static int should_exclude_dir(struct cfg *cfg, char *name)
+{
+ struct cfg_exclude *exc;
+
+ if (name[0] == '.' && (name[1] == '\0' ||
+ (name[1] == '.' && name[2] == '\0')))
+ return 1;
+ if (streq(name, "build") || streq(name, "source"))
+ return 1;
+
+ for (exc = cfg->excludes; exc != NULL; exc = exc->next) {
+ if (streq(name, exc->exclude_dir)) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
static int depmod_modules_search_dir(struct depmod *depmod, DIR *d, size_t baselen, struct scratchbuf *s_path)
{
struct dirent *de;
@@ -1240,11 +1299,9 @@ static int depmod_modules_search_dir(struct depmod *depmod, DIR *d, size_t basel
size_t namelen;
uint8_t is_dir;
- if (name[0] == '.' && (name[1] == '\0' ||
- (name[1] == '.' && name[2] == '\0')))
- continue;
- if (streq(name, "build") || streq(name, "source"))
+ if (should_exclude_dir(depmod->cfg, name))
continue;
+
namelen = strlen(name);
if (scratchbuf_alloc(s_path, baselen + namelen + 2) < 0) {
err = -ENOMEM;
This adds support to depmod to enable a new exclude directive in the depmod.d/*.conf configuration file. Currently depmod already excludes directories named source or build. This change will allow additional directories like .debug to be excluded also via a new exclude directive. depmod.d/exclude.conf example: exclude .debug Upstream-Status: Submitted Signed-off-by: Saul Wold <saul.wold@windriver.com> --- v2: create should_exclude_dir() and some clean ups from Lucas man/depmod.d.xml | 14 +++++++++++ tools/depmod.c | 65 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 75 insertions(+), 4 deletions(-)