mrk build - add incrimental build like make and color output
This commit is contained in:
parent
83983c560a
commit
7c243ec57c
35
mrk.c
35
mrk.c
|
@ -13,6 +13,8 @@
|
|||
static const char *server_host = "devs.enlightenment.org";
|
||||
static int server_port = 10077;
|
||||
static const char *build_tmpdir = "Marrakesh";
|
||||
static const char *build_chkdir = "Marrakesh-Check";
|
||||
static const char *build_objdir = "Marrakesh-Obj";
|
||||
static const char *arch = NULL;
|
||||
static const char *os = NULL;
|
||||
|
||||
|
@ -147,6 +149,7 @@ main(int argc, char **argv)
|
|||
printf("mrk sub commands:\n"
|
||||
// " new\n"
|
||||
" build\n"
|
||||
" clean\n"
|
||||
" bin\n"
|
||||
" check\n"
|
||||
" src\n"
|
||||
|
@ -154,7 +157,7 @@ main(int argc, char **argv)
|
|||
" inst FILE\n"
|
||||
" rm PKGNAME\n"
|
||||
" rel [FILE]\n"
|
||||
" clean\n"
|
||||
" fixup\n"
|
||||
" down PKGNAME\n"
|
||||
" get PKGNAME\n"
|
||||
" getsrc PKGNAME\n"
|
||||
|
@ -172,23 +175,31 @@ main(int argc, char **argv)
|
|||
os = mrk_os_get();
|
||||
arch = mrk_arch_get();
|
||||
|
||||
if (getenv("MRKHOST")) server_host = getenv("MRKHOST");
|
||||
if (getenv("MRKPORT")) server_port = atoi(getenv("MRKPORT"));
|
||||
if (getenv("MRKARCH")) arch = getenv("MRKARCH");
|
||||
if (getenv("MRKOS")) os = getenv("MRKOS");
|
||||
if (getenv("MRKDIR")) build_tmpdir = getenv("MRKDIR");
|
||||
if (getenv("MRKHOST")) server_host = getenv("MRKHOST");
|
||||
if (getenv("MRKPORT")) server_port = atoi(getenv("MRKPORT"));
|
||||
if (getenv("MRKARCH")) arch = getenv("MRKARCH");
|
||||
if (getenv("MRKOS")) os = getenv("MRKOS");
|
||||
if (getenv("MRKDIR")) build_tmpdir = getenv("MRKDIR");
|
||||
if (getenv("MRKCHKDIR")) build_chkdir = getenv("MRKCHKDIR");
|
||||
if (getenv("MRKOBJDIR")) build_objdir = getenv("MRKOBJDIR");
|
||||
|
||||
if (!strcmp(argv[1], "build"))
|
||||
{
|
||||
Mrk_Build *bld = mrk_build_load("Marrakesh.mrk");
|
||||
if (!bld) _mrk_err("Failed to load Marrakesh.mrk\n");
|
||||
if (!mrk_build_do(bld, build_tmpdir))
|
||||
if (!mrk_build_do(bld, build_tmpdir, build_objdir))
|
||||
{
|
||||
mrk_build_free(bld);
|
||||
_mrk_err("Failed to build Marrakesh.mrk\n");
|
||||
}
|
||||
mrk_build_free(bld);
|
||||
}
|
||||
else if (!strcmp(argv[1], "clean"))
|
||||
{
|
||||
ecore_file_recursive_rm(build_tmpdir);
|
||||
ecore_file_recursive_rm(build_chkdir);
|
||||
ecore_file_recursive_rm(build_objdir);
|
||||
}
|
||||
else if (!strcmp(argv[1], "src"))
|
||||
{
|
||||
char tmp[4096];
|
||||
|
@ -228,9 +239,9 @@ main(int argc, char **argv)
|
|||
_mrk_err("Failed to install\n");
|
||||
if (!mrk_package_bin_clean()) _mrk_err("Failed to clean\n");
|
||||
}
|
||||
else if (!strcmp(argv[1], "clean"))
|
||||
else if (!strcmp(argv[1], "fixup"))
|
||||
{
|
||||
if (!mrk_package_bin_clean()) _mrk_err("Failed to clean\n");
|
||||
if (!mrk_package_bin_clean()) _mrk_err("Failed to fix up dangling links\n");
|
||||
}
|
||||
else if (!strcmp(argv[1], "rm"))
|
||||
{
|
||||
|
@ -246,11 +257,11 @@ main(int argc, char **argv)
|
|||
Mrk_Build *bld;
|
||||
char tmp[4096];
|
||||
|
||||
ecore_file_recursive_rm("Marrakesh-Check");
|
||||
ecore_file_mkdir("Marrakesh-Check");
|
||||
ecore_file_recursive_rm(build_chkdir);
|
||||
ecore_file_mkdir(build_chkdir);
|
||||
bld = mrk_build_load("Marrakesh.mrk");
|
||||
if (!bld) _mrk_err("Failed to load Marrakesh.mrk\n");
|
||||
if (!mrk_build_do(bld, build_tmpdir))
|
||||
if (!mrk_build_do(bld, build_tmpdir, build_objdir))
|
||||
{
|
||||
mrk_build_free(bld);
|
||||
_mrk_err("Failed to build Marrakesh.mrk\n");
|
||||
|
|
2
mrklib.h
2
mrklib.h
|
@ -127,7 +127,7 @@ struct _Mrk_Build
|
|||
|
||||
EAPI Mrk_Build *mrk_build_load(const char *file);
|
||||
EAPI void mrk_build_free(Mrk_Build *bld);
|
||||
EAPI Eina_Bool mrk_build_do(Mrk_Build *bld, const char *tmpd);
|
||||
EAPI Eina_Bool mrk_build_do(Mrk_Build *bld, const char *tmpd, const char *objd);
|
||||
EAPI Eina_Bool mrk_build_pakage_bin(Mrk_Build *bld, const char *file, const char *tmpd, const char *os, const char *arch);
|
||||
EAPI Eina_Bool mrk_build_package_src(Mrk_Build *bld, const char *buildfile, const char *file);
|
||||
|
||||
|
|
|
@ -419,25 +419,36 @@ mrk_build_free(Mrk_Build *bld)
|
|||
}
|
||||
|
||||
EAPI Eina_Bool
|
||||
mrk_build_do(Mrk_Build *bld, const char *tmpd)
|
||||
mrk_build_do(Mrk_Build *bld, const char *tmpd, const char *objd)
|
||||
{
|
||||
Eina_List *l, *ll;
|
||||
Eina_List *l, *ll, *lll;
|
||||
Mrk_Build_Bin *bin;
|
||||
Mrk_Build_Data *data;
|
||||
Eina_Strbuf *buf;
|
||||
char *s, *extn, *s2;
|
||||
char *s, *extn, *s2, *p;
|
||||
char tmp[4096];
|
||||
char tmp2[4096];
|
||||
const char *ss, *cc;
|
||||
int res;
|
||||
#define err(reason) do { fprintf(stderr, "%s\n", reason); goto error; } while (0)
|
||||
|
||||
if (!(buf = eina_strbuf_new())) goto error;
|
||||
snprintf(tmp, sizeof(tmp), "%s", tmpd);
|
||||
ecore_file_mkpath(tmp);
|
||||
snprintf(tmp, sizeof(tmp), "%s", objd);
|
||||
ecore_file_mkpath(tmp);
|
||||
EINA_LIST_FOREACH(bld->po, l, s)
|
||||
{
|
||||
snprintf(tmp, sizeof(tmp), "%s/share/locale/%s/LC_MESSAGES/", tmpd, s);
|
||||
ecore_file_mkpath(tmp);
|
||||
snprintf(tmp2, sizeof(tmp2), "po/%s.gmo", s);
|
||||
snprintf(tmp, sizeof(tmp), "%s/share/locale/%s/LC_MESSAGES/%s.mo", tmpd, s, bld->domain);
|
||||
ecore_file_cp(tmp2, tmp);
|
||||
if ((!ecore_file_exists(tmp)) ||
|
||||
(ecore_file_mod_time(tmp2) >= ecore_file_mod_time(tmp)))
|
||||
{
|
||||
printf("%c[36;01m%s%c[0m%c[35m -%c[1m>%c[0m\n", 27, tmp2, 27, 27, 27, 27);
|
||||
ecore_file_cp(tmp2, tmp);
|
||||
}
|
||||
}
|
||||
EINA_LIST_FOREACH(bld->data, l, data)
|
||||
{
|
||||
|
@ -449,7 +460,12 @@ mrk_build_do(Mrk_Build *bld, const char *tmpd)
|
|||
free(s);
|
||||
}
|
||||
snprintf(tmp, sizeof(tmp), "%s/%s", tmpd, data->dest);
|
||||
ecore_file_cp(data->src, tmp);
|
||||
if ((!ecore_file_exists(tmp)) ||
|
||||
(ecore_file_mod_time(data->src) >= ecore_file_mod_time(tmp)))
|
||||
{
|
||||
printf("%c[36;01m%s%c[0m%c[35m -%c[1m>%c[0m\n", 27, data->src, 27, 27, 27, 27);
|
||||
ecore_file_cp(data->src, tmp);
|
||||
}
|
||||
}
|
||||
snprintf(tmp, sizeof(tmp), "%s/%s", tmpd, "share/applications");
|
||||
ecore_file_mkpath(tmp);
|
||||
|
@ -459,7 +475,12 @@ mrk_build_do(Mrk_Build *bld, const char *tmpd)
|
|||
if (!(!strncmp(ss, bld->domain, strlen(bld->domain))))
|
||||
err("destkop file wrong domain");
|
||||
snprintf(tmp, sizeof(tmp), "%s/share/applications/%s", tmpd, ss);
|
||||
ecore_file_cp(s, tmp);
|
||||
if ((!ecore_file_exists(tmp)) ||
|
||||
(ecore_file_mod_time(s) >= ecore_file_mod_time(tmp)))
|
||||
{
|
||||
printf("%c[36;01m%s%c[0m%c[35m -%c[1m>%c[0m\n", 27, s, 27, 27, 27, 27);
|
||||
ecore_file_cp(s, tmp);
|
||||
}
|
||||
}
|
||||
snprintf(tmp, sizeof(tmp), "%s/%s", tmpd, "share/icons");
|
||||
ecore_file_mkpath(tmp);
|
||||
|
@ -469,7 +490,12 @@ mrk_build_do(Mrk_Build *bld, const char *tmpd)
|
|||
if (!(!strncmp(ss, bld->domain, strlen(bld->domain))))
|
||||
err("icon file wrong domain");
|
||||
snprintf(tmp, sizeof(tmp), "%s/share/icons/%s", tmpd, ss);
|
||||
ecore_file_cp(s, tmp);
|
||||
if ((!ecore_file_exists(tmp)) ||
|
||||
(ecore_file_mod_time(s) >= ecore_file_mod_time(tmp)))
|
||||
{
|
||||
printf("%c[36;01m%s%c[0m%c[35m -%c[1m>%c[0m\n", 27, s, 27, 27, 27, 27);
|
||||
ecore_file_cp(s, tmp);
|
||||
}
|
||||
}
|
||||
EINA_LIST_FOREACH(bld->copying, l, s)
|
||||
{
|
||||
|
@ -483,11 +509,50 @@ mrk_build_do(Mrk_Build *bld, const char *tmpd)
|
|||
snprintf(tmp, sizeof(tmp), "%s/share/licenses", tmpd);
|
||||
ecore_file_mkpath(tmp);
|
||||
snprintf(tmp, sizeof(tmp), "%s/share/licenses/%s", tmpd, s);
|
||||
ecore_file_cp(s, tmp);
|
||||
if ((!ecore_file_exists(tmp)) ||
|
||||
(ecore_file_mod_time(s) >= ecore_file_mod_time(tmp)))
|
||||
{
|
||||
printf("%c[36;01m%s%c[0m%c[35m -%c[1m>%c[0m\n", 27, s, 27, 27, 27, 27);
|
||||
ecore_file_cp(s, tmp);
|
||||
}
|
||||
}
|
||||
|
||||
cc = getenv("CC");
|
||||
if (!cc) cc = "gcc";
|
||||
|
||||
EINA_LIST_FOREACH(bld->bins, l, bin)
|
||||
{
|
||||
if ((buf = eina_strbuf_new()))
|
||||
Eina_Bool rebuild, rebuild2, touchme;
|
||||
|
||||
printf("%c[37;01m%s%c[0m%c[32m =%c[1m>>%c[0m\n", 27, bin->bin, 27, 27, 27, 27);
|
||||
snprintf(tmp, sizeof(tmp), "%s/%s", tmpd, bin->bin);
|
||||
if (!ecore_file_exists(tmp)) rebuild = EINA_TRUE;
|
||||
rebuild = EINA_FALSE;
|
||||
if (!rebuild)
|
||||
{
|
||||
EINA_LIST_FOREACH(bin->srcs, ll, s)
|
||||
{
|
||||
snprintf(tmp, sizeof(tmp), "%s-%s", bin->bin, s);
|
||||
for (p = tmp; *p; p++)
|
||||
{
|
||||
if (*p == '/') *p = '.';
|
||||
}
|
||||
extn = strrchr(tmp, '.');
|
||||
if ((extn) && (!strcasecmp(extn, ".c"))) extn[1] = 'o';
|
||||
snprintf(tmp2, sizeof(tmp2), "%s/%s", objd, tmp);
|
||||
if (!ecore_file_exists(tmp2))
|
||||
{
|
||||
rebuild = EINA_TRUE;
|
||||
break;
|
||||
}
|
||||
if (ecore_file_mod_time(s) >= ecore_file_mod_time(tmp2))
|
||||
{
|
||||
rebuild = EINA_TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (rebuild)
|
||||
{
|
||||
s = ecore_file_dir_get(bin->bin);
|
||||
if (s)
|
||||
|
@ -496,60 +561,142 @@ mrk_build_do(Mrk_Build *bld, const char *tmpd)
|
|||
ecore_file_mkpath(tmp);
|
||||
free(s);
|
||||
}
|
||||
cc = getenv("CC");
|
||||
if (!cc) cc = "gcc";
|
||||
EINA_LIST_FOREACH(bin->srcs, ll, s)
|
||||
{
|
||||
touchme = EINA_FALSE;
|
||||
rebuild2 = EINA_FALSE;
|
||||
snprintf(tmp, sizeof(tmp), "%s-%s", bin->bin, s);
|
||||
for (p = tmp; *p; p++)
|
||||
{
|
||||
if (*p == '/') *p = '.';
|
||||
}
|
||||
extn = strrchr(tmp, '.');
|
||||
if ((extn) && (!strcasecmp(extn, ".c"))) extn[1] = 'o';
|
||||
else touchme = EINA_TRUE;
|
||||
snprintf(tmp2, sizeof(tmp2), "%s/%s", objd, tmp);
|
||||
if (!ecore_file_exists(tmp2))
|
||||
{
|
||||
rebuild2 = EINA_TRUE;
|
||||
}
|
||||
if (ecore_file_mod_time(s) >= ecore_file_mod_time(tmp2))
|
||||
{
|
||||
rebuild2 = EINA_TRUE;
|
||||
}
|
||||
if ((rebuild2) && (!touchme))
|
||||
{
|
||||
eina_strbuf_reset(buf);
|
||||
eina_strbuf_append(buf, cc);
|
||||
eina_strbuf_append(buf, " -c ");
|
||||
eina_strbuf_append(buf, s);
|
||||
eina_strbuf_append(buf, " -I. -o ");
|
||||
eina_strbuf_append(buf, tmp2);
|
||||
|
||||
eina_strbuf_append(buf, " -DLOCALEDIR=\\\"/tmp/X/share/locale\\\"");
|
||||
eina_strbuf_append(buf, " -DPACKAGE_BIN_DIR=\\\"/tmp/X/bin\\\"");
|
||||
eina_strbuf_append(buf, " -DPACKAGE_LIB_DIR=\\\"/tmp/X/lib\\\"");
|
||||
eina_strbuf_append(buf, " -DPACKAGE_DATA_DIR=\\\"/tmp/X/share/");
|
||||
eina_strbuf_append(buf, bld->domain);
|
||||
eina_strbuf_append(buf, "\\\"");
|
||||
|
||||
eina_strbuf_append(buf, " -DPACKAGE_NAME=\\\"");
|
||||
eina_strbuf_append(buf, bld->domain);
|
||||
eina_strbuf_append(buf, "\\\"");
|
||||
|
||||
eina_strbuf_append(buf, " -DPACKAGE_VERSION=\\\"");
|
||||
eina_strbuf_append(buf, bld->version);
|
||||
eina_strbuf_append(buf, "\\\"");
|
||||
|
||||
eina_strbuf_append(buf, " -D_REENTRANT -DHAVE_CONFIG_H -pthread ");
|
||||
eina_strbuf_append(buf, " $CFLAGS ");
|
||||
EINA_LIST_FOREACH(bin->deps, lll, s2)
|
||||
{
|
||||
eina_strbuf_append(buf, " `pkg-config --cflags ");
|
||||
eina_strbuf_append(buf, s2);
|
||||
eina_strbuf_append(buf, "`");
|
||||
}
|
||||
EINA_LIST_FOREACH(bin->incs, lll, s2)
|
||||
{
|
||||
eina_strbuf_append(buf, " -I");
|
||||
eina_strbuf_append(buf, s2);
|
||||
eina_strbuf_append(buf, " ");
|
||||
}
|
||||
s2 = (char *)eina_strbuf_string_get(buf);
|
||||
if (s2)
|
||||
{
|
||||
printf(" %c[31mCC%c[33m %s%c[0m\n", 27, 27, s, 27);
|
||||
if (getenv("V")) printf("%s\n", s2);
|
||||
printf("%c[34m", 27);
|
||||
fflush(stdout);
|
||||
res = system(s2);
|
||||
printf("%c[0m", 27);
|
||||
if (res != 0)
|
||||
{
|
||||
printf("%c[31;1mERROR ERROR ERROR%c[0m\n", 27, 27);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((rebuild2) && (touchme))
|
||||
{
|
||||
FILE *f;
|
||||
|
||||
unlink(tmp2);
|
||||
f = fopen(tmp2, "wb");
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
eina_strbuf_reset(buf);
|
||||
eina_strbuf_append(buf, cc);
|
||||
eina_strbuf_append(buf, " -I. -lm -o ");
|
||||
eina_strbuf_append(buf, " -lm -o ");
|
||||
eina_strbuf_append(buf, tmpd);
|
||||
eina_strbuf_append(buf, "/");
|
||||
eina_strbuf_append(buf, bin->bin);
|
||||
|
||||
eina_strbuf_append(buf, " -DLOCALEDIR=\\\"/tmp/X/share/locale\\\"");
|
||||
eina_strbuf_append(buf, " -DPACKAGE_BIN_DIR=\\\"/tmp/X/bin\\\"");
|
||||
eina_strbuf_append(buf, " -DPACKAGE_LIB_DIR=\\\"/tmp/X/lib\\\"");
|
||||
eina_strbuf_append(buf, " -DPACKAGE_DATA_DIR=\\\"/tmp/X/share/");
|
||||
eina_strbuf_append(buf, bld->domain);
|
||||
eina_strbuf_append(buf, "\\\"");
|
||||
|
||||
eina_strbuf_append(buf, " -DPACKAGE_NAME=\\\"");
|
||||
eina_strbuf_append(buf, bld->domain);
|
||||
eina_strbuf_append(buf, "\\\"");
|
||||
|
||||
eina_strbuf_append(buf, " -DPACKAGE_VERSION=\\\"");
|
||||
eina_strbuf_append(buf, bld->version);
|
||||
eina_strbuf_append(buf, "\\\"");
|
||||
|
||||
eina_strbuf_append(buf, " -D_REENTRANT -DHAVE_CONFIG_H -pthread ");
|
||||
eina_strbuf_append(buf, " $CFLAGS ");
|
||||
|
||||
EINA_LIST_FOREACH(bin->srcs, ll, s)
|
||||
{
|
||||
extn = strrchr(s, '.');
|
||||
if ((extn) && (!strcasecmp(extn, ".c")))
|
||||
{
|
||||
eina_strbuf_append(buf, s);
|
||||
eina_strbuf_append(buf, " ");
|
||||
}
|
||||
}
|
||||
EINA_LIST_FOREACH(bin->deps, ll, s)
|
||||
{
|
||||
eina_strbuf_append(buf, " `pkg-config --cflags --libs ");
|
||||
eina_strbuf_append(buf, " `pkg-config --libs ");
|
||||
eina_strbuf_append(buf, s);
|
||||
eina_strbuf_append(buf, "`");
|
||||
}
|
||||
EINA_LIST_FOREACH(bin->incs, ll, s)
|
||||
EINA_LIST_FOREACH(bin->srcs, ll, s)
|
||||
{
|
||||
eina_strbuf_append(buf, " -I");
|
||||
eina_strbuf_append(buf, s);
|
||||
eina_strbuf_append(buf, " ");
|
||||
rebuild2 = EINA_FALSE;
|
||||
snprintf(tmp, sizeof(tmp), "%s-%s", bin->bin, s);
|
||||
for (p = tmp; *p; p++)
|
||||
{
|
||||
if (*p == '/') *p = '.';
|
||||
}
|
||||
extn = strrchr(tmp, '.');
|
||||
if ((extn) && (!strcasecmp(extn, ".c")))
|
||||
{
|
||||
extn[1] = 'o';
|
||||
snprintf(tmp2, sizeof(tmp2), "%s/%s", objd, tmp);
|
||||
eina_strbuf_append(buf, tmp2);
|
||||
eina_strbuf_append(buf, " ");
|
||||
}
|
||||
}
|
||||
s = (char *)eina_strbuf_string_get(buf);
|
||||
if (s) system(s);
|
||||
eina_strbuf_free(buf);
|
||||
if (s)
|
||||
{
|
||||
printf(" %c[1;31mLD%c[1;33m %s%c[0m\n", 27, 27, bin->bin, 27);
|
||||
if (getenv("V")) printf("%s\n", s2);
|
||||
printf("%c[34m", 27);
|
||||
fflush(stdout);
|
||||
res = system(s);
|
||||
printf("%c[0m", 27);
|
||||
if (res != 0)
|
||||
{
|
||||
printf("%c[31;0mERROR ERROR ERROR%c[0m\n", 27, 27);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
eina_strbuf_free(buf);
|
||||
return EINA_TRUE;
|
||||
error:
|
||||
eina_strbuf_free(buf);
|
||||
return EINA_FALSE;
|
||||
#undef err
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue