aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@samsung.com>2018-10-11 16:36:50 +0200
committerDaniel Kolesa <d.kolesa@samsung.com>2018-10-22 16:37:01 +0200
commit5b148986e0f2a5bf4bacc0de94166eeb55180a39 (patch)
treef66302714133f740d052b0dc108de89780c4686c
parenteolian: add API to get full file path of a unit (diff)
downloadefl-5b148986e0f2a5bf4bacc0de94166eeb55180a39.tar.gz
eolian gen: add generation of build dependencies
It is now possible to generate a separate .d file which will contain Make-style dependencies for the files generated in that batch, i.e. if you geerate header, legacy header and source, the .eo.d file will contain dependency lists for those three. It should be possible to integrate this into our build system to enable proper regeneration of .eo files in an incremental manner.
-rw-r--r--src/bin/eolian/main.c74
1 files changed, 70 insertions, 4 deletions
diff --git a/src/bin/eolian/main.c b/src/bin/eolian/main.c
index db8ea371dd..95d81a7e04 100644
--- a/src/bin/eolian/main.c
+++ b/src/bin/eolian/main.c
@@ -14,12 +14,13 @@ enum
GEN_H_LEGACY = 1 << 1,
GEN_H_STUB = 1 << 2,
GEN_C = 1 << 3,
- GEN_C_IMPL = 1 << 4
+ GEN_C_IMPL = 1 << 4,
+ GEN_D = 1 << 5
};
-static const char *_dexts[5] =
+static const char *_dexts[6] =
{
- ".h", ".legacy.h", ".stub.h", ".c", ".c"
+ ".h", ".legacy.h", ".stub.h", ".c", ".c", ".d"
};
static int
@@ -50,6 +51,7 @@ _print_usage(const char *progn, FILE *outf)
" s: Stub C header file (.eo.stub.h/.eot.stub.h)\n"
" c: C source file (.eo.c)\n"
" i: Implementation file (.c, merged with existing)\n"
+ " d: Make-style dependencies (.d)\n"
"\n"
"By default, the 'hc' set is used ('h' for .eot files).\n\n"
"The system-wide Eolian directory is scanned for eo files\n"
@@ -98,6 +100,9 @@ _try_set_out(char t, char **outs, const char *val, int *what)
pos = _get_bit_pos(GEN_C_IMPL);
*what |= GEN_C_IMPL;
break;
+ case 'd':
+ pos = _get_bit_pos(GEN_D);
+ *what |= GEN_D;
}
if (pos < 0)
return EINA_FALSE;
@@ -420,12 +425,68 @@ _write_impl(const Eolian_State *eos, const char *ofname, const char *ifname)
return ret;
}
+static void
+_append_dep_line(Eina_Strbuf *buf, Eina_Strbuf *dbuf, char **outs, int gen_what, int what)
+{
+ if (!(gen_what & what))
+ return;
+ eina_strbuf_append(buf, outs[_get_bit_pos(what)]);
+ eina_strbuf_append_buffer(buf, dbuf);
+}
+
+static Eina_Bool
+_write_deps(const Eolian_State *eos, const char *ofname, const char *ifname,
+ char **outs, int gen_what)
+{
+ INF("generating deps: %s", ofname);
+
+ Eina_Bool ret = EINA_TRUE;
+ Eina_Strbuf *buf = eina_strbuf_new();
+ Eina_Strbuf *dbuf = eina_strbuf_new();
+
+ const Eolian_Unit *un = eolian_state_unit_by_file_get(eos, ifname);
+ if (!un)
+ {
+ ret = EINA_FALSE;
+ goto result;
+ }
+
+ eina_strbuf_append(dbuf, ": ");
+ /* every generated file depends on its .eo/.eot file */
+ eina_strbuf_append(dbuf, eolian_unit_file_path_get(un));
+
+ const Eolian_Unit *dun;
+ Eina_Iterator *deps = eolian_unit_children_get(un);
+ EINA_ITERATOR_FOREACH(deps, dun)
+ {
+ const char *dpath = eolian_unit_file_path_get(dun);
+ if (!dpath)
+ continue;
+ eina_strbuf_append_char(dbuf, ' ');
+ eina_strbuf_append(dbuf, dpath);
+ }
+ eina_iterator_free(deps);
+ eina_strbuf_append_char(dbuf, '\n');
+
+ _append_dep_line(buf, dbuf, outs, gen_what, GEN_H);
+ _append_dep_line(buf, dbuf, outs, gen_what, GEN_H_LEGACY);
+ _append_dep_line(buf, dbuf, outs, gen_what, GEN_H_STUB);
+ _append_dep_line(buf, dbuf, outs, gen_what, GEN_C);
+ _append_dep_line(buf, dbuf, outs, gen_what, GEN_C_IMPL);
+
+ ret = _write_file(ofname, buf);
+result:
+ eina_strbuf_free(dbuf);
+ eina_strbuf_free(buf);
+ return ret;
+}
+
int
main(int argc, char **argv)
{
int pret = 1;
- char *outs[5] = { NULL, NULL, NULL, NULL, NULL };
+ char *outs[6] = { NULL, NULL, NULL, NULL, NULL, NULL };
char *basen = NULL;
Eina_List *includes = NULL;
@@ -478,6 +539,9 @@ main(int argc, char **argv)
case 'i':
gen_what |= GEN_C_IMPL;
break;
+ case 'd':
+ gen_what |= GEN_D;
+ break;
default:
fprintf(stderr, "unknown type: '%c'\n", *wstr);
goto end;
@@ -575,6 +639,8 @@ main(int argc, char **argv)
succ = _write_source(eos, outs[_get_bit_pos(GEN_C)], eobn, !strcmp(ext, ".eot"));
if (succ && (gen_what & GEN_C_IMPL))
succ = _write_impl(eos, outs[_get_bit_pos(GEN_C_IMPL)], eobn);
+ if (succ && (gen_what & GEN_D))
+ succ = _write_deps(eos, outs[_get_bit_pos(GEN_D)], eobn, outs, gen_what);
if (!succ)
goto end;