edje: add edje_watch.

edje_watch call edje_cc and monitor all the source file (edc, font
image, sound). If any of them change, it call edje_cc, update its
watching list and so on. edje_watch as the same command line as
edje_cc.
   Still a little bit rought, but it's the beginning of an interesting
experiment.


SVN revision: 70872
This commit is contained in:
Cedric BAIL 2012-05-08 10:35:57 +00:00
parent f0a9acefa0
commit dd9c491c5b
11 changed files with 242 additions and 11 deletions

View File

@ -423,3 +423,7 @@
2012-05-02 Cedric Bail
* Doing less allocation and reuse Evas_Map does help.
2012-05-08 Cedric Bail
* Add edje_watch tools to automatically rebuild edc.

View File

@ -3,6 +3,9 @@ Edje 1.3.0
Changes since Edje 1.2.0:
-------------------------
Additions:
* Add edje_watch to monitore change on edje source.
Improvements:
* Allocate once and reuse Evas_Map.

View File

@ -104,6 +104,7 @@ EFL_ENABLE_BIN([edje-recc])
EFL_ENABLE_BIN([edje-player])
EFL_ENABLE_BIN([edje-inspector])
EFL_ENABLE_BIN([edje-external-inspector])
EFL_ENABLE_BIN([edje-watch])
# Optional EDJE_PROGRAM_CACHE (use much more ram, but increase speed in some cases)
want_edje_program_cache="no"
@ -292,6 +293,18 @@ PKG_CHECK_MODULES([ECORE_IMF],
],
[have_ecore_imf="no"])
have_eio="no"
PKG_CHECK_MODULES([EIO],
[
eio >= 1.0.0
],
[
AC_DEFINE([HAVE_EIO], [1], [Eio is available for monitoring file assynchronously])
have_eio="yes"
requirement_edje="eio >= 1.0.0 ${requirement_edje}"
],
[have_eio="no"])
# Enable Multisense use
want_multisense="yes"
AC_ARG_ENABLE([multisense],
@ -467,6 +480,9 @@ if test "x$have_edje_external_inspector" = "xyes"; then
PKG_CHECK_MODULES([EDJE_EXTERNAL_INSPECTOR], [ecore >= 1.2.0 evas >= 1.2.0 eina >= 1.2.0])
fi
if test "x$have_edje_watch" = "xyes"; then
PKG_CHECK_MODULES([EDJE_WATCH], [ecore >= 1.2.0 eina >= 1.2.0 eio >= 1.0.0])
fi
### Checks for header files
AC_CHECK_HEADERS([locale.h sys/resource.h])
@ -614,6 +630,7 @@ echo " Build edje_recc..............: $have_edje_recc"
echo " Build edje_player............: $have_edje_player"
echo " Build edje_inspector.........: $have_edje_inspector"
echo " Build edje_external_inspector: $have_edje_external_inspector"
echo " Build edje_watch.............: $have_edje_watch"
echo
echo "Compilation............: make (or gmake)"
echo " CPPFLAGS.............: $CPPFLAGS"

View File

@ -6,9 +6,9 @@ endif
bin_SCRIPTS = @EDJE_RECC_PRG@
bin_PROGRAMS = @EDJE_CC_PRG@ @EDJE_DECC_PRG@ @EDJE_PLAYER_PRG@ @EDJE_INSPECTOR_PRG@ @EDJE_EXTERNAL_INSPECTOR_PRG@
bin_PROGRAMS = @EDJE_CC_PRG@ @EDJE_DECC_PRG@ @EDJE_PLAYER_PRG@ @EDJE_INSPECTOR_PRG@ @EDJE_EXTERNAL_INSPECTOR_PRG@ @EDJE_WATCH_PRG@
EXTRA_PROGRAMS = edje_cc edje_decc edje_player edje_inspector edje_external_inspector
EXTRA_PROGRAMS = edje_cc edje_decc edje_player edje_inspector edje_external_inspector edje_watch
edje_cc_SOURCES = \
edje_cc.c \
@ -26,10 +26,20 @@ edje_cc_CPPFLAGS = \
-DPACKAGE_LIB_DIR=\"$(libdir)\" \
-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
-DEPP_DIR=\"$(libdir)/$(PACKAGE)/utils\" \
@EDJE_CFLAGS@ @EDJE_CC_CFLAGS@ @EVIL_CFLAGS@ @SNDFILE_CFLAGS@
@EDJE_CFLAGS@ @EDJE_CC_CFLAGS@ @EIO_CFLAGS@ @EVIL_CFLAGS@ @SNDFILE_CFLAGS@
edje_cc_LDADD = $(top_builddir)/src/lib/libedje.la @EDJE_CC_LIBS@ @EVIL_LIBS@ @VORBISENC_LIBS@ @FLAC_LIBS@ @SNDFILE_LIBS@ -lm
edje_cc_LDFLAGS = @lt_enable_auto_import@
edje_watch_SOURCES = \
edje_watch.c
edje_watch_CPPFLAGS = \
-I$(top_srcdir)/src/bin \
-I$(top_srcdir)/src/lib \
-DPACKAGE_BIN_DIR=\"$(bindir)\" \
@EDJE_CFLAGS@ @EDJE_CC_CFLAGS@ @EIO_CFLAGS@ @EVIL_CFLAGS@ @EDJE_WATCH_CFLAGS@
edje_watch_LDADD = $(top_builddir)/src/lib/libedje.la @EDJE_WATCH_LIBS@
edje_watch_LDFLAGS = @lt_enable_auto_import@
edje_decc_SOURCES = \
edje_decc.c \
@ -40,7 +50,7 @@ edje_cc_sources.c
edje_decc_CPPFLAGS = \
-I$(top_srcdir)/src/bin \
-I$(top_srcdir)/src/lib \
@EDJE_CFLAGS@ @EDJE_DECC_CFLAGS@ @EVIL_CFLAGS@
@EDJE_CFLAGS@ @EDJE_DECC_CFLAGS@ @EIO_CFLAGS@ @EVIL_CFLAGS@
edje_decc_LDADD = $(top_builddir)/src/lib/libedje.la @EDJE_DECC_LIBS@ @VORBISENC_LIBS@ @FLAC_LIBS@ @SNDFILE_LIBS@
edje_decc_LDFLAGS = @lt_enable_auto_import@
@ -48,7 +58,7 @@ edje_player_SOURCES = edje_player.c
edje_player_CPPFLAGS = \
-I$(top_srcdir)/src/bin \
-I$(top_srcdir)/src/lib \
@EDJE_PLAYER_CFLAGS@ @EVIL_CFLAGS@
@EDJE_PLAYER_CFLAGS@ @EVIL_CFLAGS@ @EIO_CFLAGS@
edje_player_LDADD = $(top_builddir)/src/lib/libedje.la @EDJE_PLAYER_LIBS@ @EVIL_LIBS@ @VORBISENC_LIBS@ @FLAC_LIBS@ @SNDFILE_LIBS@
edje_player_LDFLAGS = @lt_enable_auto_import@
@ -56,7 +66,7 @@ edje_inspector_SOURCES = edje_inspector.c
edje_inspector_CPPFLAGS = \
-I$(top_srcdir)/src/bin \
-I$(top_srcdir)/src/lib \
@EDJE_INSPECTOR_CFLAGS@
@EDJE_INSPECTOR_CFLAGS@ @EIO_CFLAGS@
edje_inspector_LDADD = $(top_builddir)/src/lib/libedje.la @EDJE_INSPECTOR_LIBS@ @VORBISENC_LIBS@ @FLAC_LIBS@
edje_inspector_LDFLAGS = @lt_enable_auto_import@
@ -64,7 +74,7 @@ edje_external_inspector_SOURCES = edje_external_inspector.c
edje_external_inspector_CPPFLAGS = \
-I$(top_srcdir)/src/bin \
-I$(top_srcdir)/src/lib \
@EDJE_EXTERNAL_INSPECTOR_CFLAGS@
@EDJE_EXTERNAL_INSPECTOR_CFLAGS@ @EIO_CFLAGS@
edje_external_inspector_LDADD = $(top_builddir)/src/lib/libedje.la @EDJE_EXTERNAL_INSPECTOR_LIBS@ @VORBISENC_LIBS@ @FLAC_LIBS@ @SNDFILE_LIBS@
edje_external_inspector_LDFLAGS = @lt_enable_auto_import@

View File

@ -20,6 +20,7 @@ char *file_in = NULL;
char *tmp_dir = NULL;
char *file_out = NULL;
char *progname = NULL;
char *watchfile = NULL;
int verbose = 0;
int no_lossy = 0;
@ -38,6 +39,7 @@ main_help(void)
"\n"
"Where OPTIONS is one or more of:\n"
"\n"
"-w files.txt Dump all sources files path into files.txt\n"
"-id image/directory Add a directory to look in for relative path images\n"
"-fd font/directory Add a directory to look in for relative path fonts\n"
"-sd sound/directory Add a directory to look in for relative path sounds samples\n"
@ -151,6 +153,12 @@ main(int argc, char **argv)
i++;
file_out = argv[i];
}
else if ((!strcmp(argv[i], "-w")) && (i < (argc - 1)))
{
i++;
watchfile = argv[i];
unlink(watchfile);
}
else if (!file_in)
file_in = argv[i];
else if (!file_out)

View File

@ -194,6 +194,8 @@ void *mem_alloc(size_t size);
char *mem_strdup(const char *s);
#define SZ sizeof
void using_file(const char *filename);
void error_and_abort(Eet_File *ef, const char *fmt, ...);
/* global vars */
@ -205,6 +207,7 @@ extern char *file_in;
extern char *tmp_dir;
extern char *file_out;
extern char *progname;
extern char *watchfile;
extern int verbose;
extern int no_lossy;
extern int no_comp;

View File

@ -323,6 +323,7 @@ data_write_fonts(Eet_File *ef, int *font_num, int *input_bytes, int *input_raw_b
{
long pos;
using_file(fn->file);
fseek(f, 0, SEEK_END);
pos = ftell(f);
rewind(f);
@ -350,6 +351,7 @@ data_write_fonts(Eet_File *ef, int *font_num, int *input_bytes, int *input_raw_b
{
long pos;
using_file(buf);
fseek(f, 0, SEEK_END);
pos = ftell(f);
rewind(f);
@ -533,7 +535,10 @@ data_write_images(Eet_File *ef, int *image_num, int *input_bytes, int *input_raw
evas_object_image_file_set(im, buf, NULL);
load_err = evas_object_image_load_error_get(im);
if (load_err == EVAS_LOAD_ERROR_NONE)
break;
{
using_file(buf);
break;
}
evas_object_del(im);
im = NULL;
if (load_err != EVAS_LOAD_ERROR_DOES_NOT_EXIST)
@ -552,6 +557,7 @@ data_write_images(Eet_File *ef, int *image_num, int *input_bytes, int *input_raw
evas_object_del(im);
im = NULL;
}
if (im) using_file(img->entry);
}
}
if (im)
@ -716,8 +722,10 @@ data_write_sounds(Eet_File * ef, int *sound_num, int *input_bytes, int *input_ra
stat(enc_info->file, &st);
size = st.st_size;
fp = fopen(enc_info->file, "rb");
if (fp) using_file(enc_info->file);
#else
fp = fopen(snd_path, "rb");
if (fp) using_file(snd_path);
#endif
if (!fp)
{
@ -2167,3 +2175,15 @@ data_process_script_lookups(void)
strncpy(cl->ptr, buf, n);
}
}
void
using_file(const char *filename)
{
FILE *f;
f = fopen(watchfile, "a");
if (!f) return ;
fputs(filename, f);
fputc('\n', f);
fclose(f);
}

View File

@ -739,8 +739,8 @@ compile(void)
eina_prefix_lib_get(pfx));
if (ecore_file_exists(buf2))
{
snprintf(buf, sizeof(buf), "%s %s -I%s %s -o %s",
buf2, file_in, inc, def, tmpn);
snprintf(buf, sizeof(buf), "%s -a %s %s -I%s %s -o %s",
buf2, watchfile ? watchfile : "/dev/null", file_in, inc, def, tmpn);
ret = system(buf);
}
else

View File

@ -0,0 +1,127 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <Eina.h>
#include <Ecore.h>
#include <Eio.h>
#ifdef HAVE_EVIL
# include <Evil.h>
#endif
char watchfile[PATH_MAX];
char *edje_cc_command = NULL;
Eina_List *watching = NULL;
Ecore_Timer *timeout = NULL;
static void
read_watch_file(const char *file)
{
Eina_File *f;
Eina_Iterator *it;
Eina_File_Lines *ln;
Eio_Monitor *mon;
Eina_List *r = NULL;
f = eina_file_open(file, EINA_FALSE);
if (!f) return ;
it = eina_file_map_lines(f);
if (!it) goto err;
EINA_ITERATOR_FOREACH(it, ln)
{
const char *path;
path = eina_stringshare_add_length(ln->line.start, ln->length);
r = eina_list_append(r, eio_monitor_add(path));
eina_stringshare_del(path);
}
eina_iterator_free(it);
EINA_LIST_FREE(watching, mon)
eio_monitor_del(mon);
watching = r;
err:
eina_file_close(f);
}
Eina_Bool
rebuild(void *data __UNUSED__)
{
fprintf(stderr, "SYSTEM('%s')\n", edje_cc_command);
if (system(edje_cc_command) == 0)
read_watch_file(watchfile);
fprintf(stderr, "DONE\n");
timeout = NULL;
return EINA_FALSE;
}
Eina_Bool
some_change(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
{
Eio_Monitor_Event *ev = event;
fprintf(stderr, "EVENT %i on [%s]\n", type, ev->filename);
if (timeout) ecore_timer_del(timeout);
timeout = ecore_timer_add(0.5, rebuild, NULL);
return ECORE_CALLBACK_PASS_ON;
}
int
main(int argc, char **argv)
{
char *watchout;
Eina_Strbuf *buf;
int tfd;
int i;
eina_init();
ecore_init();
eio_init();
if (argc < 2) return -1;
ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, some_change, NULL);
ecore_event_handler_add(EIO_MONITOR_FILE_CREATED, some_change, NULL);
ecore_event_handler_add(EIO_MONITOR_FILE_DELETED, some_change, NULL);
ecore_event_handler_add(EIO_MONITOR_FILE_CLOSED, some_change, NULL);
#ifdef HAVE_EVIL
watchout = (char *)evil_tmpdir_get();
#else
watchout = "/tmp";
#endif
snprintf(watchfile, PATH_MAX, "%s/edje_watch-tmp-XXXXXX", watchout);
tfd = mkstemp(watchfile);
if (tfd < 0) return -1;
close(tfd);
buf = eina_strbuf_new();
if (!buf) return -1;
eina_strbuf_append_printf(buf, "%s/edje_cc -w %s ", PACKAGE_BIN_DIR, watchfile);
for (i = 1; i < argc; ++i)
eina_strbuf_append_printf(buf, "%s ", argv[i]);
edje_cc_command = eina_strbuf_string_steal(buf);
eina_strbuf_free(buf);
fprintf(stderr, "SYSTEM('%s')\n", edje_cc_command);
system(edje_cc_command);
read_watch_file(watchfile);
ecore_main_loop_begin();
eio_shutdown();
ecore_shutdown();
eina_shutdown();
return 1;
}

View File

@ -5489,6 +5489,7 @@ open_include_file(cpp_reader * pfile, char *filename,
&& !strncmp(searchptr->fname, filename, p - filename))
{
/* FILENAME is in SEARCHPTR, which we've already checked. */
using_file(filename);
return open(filename, O_RDONLY | O_BINARY, 0666);
}
if (p == filename)
@ -5508,8 +5509,12 @@ open_include_file(cpp_reader * pfile, char *filename,
}
for (map = read_name_map(pfile, dir); map; map = map->map_next)
if (!strcmp(map->map_from, from))
return open(map->map_to, O_RDONLY | O_BINARY, 0666);
{
using_file(map->map_to);
return open(map->map_to, O_RDONLY | O_BINARY, 0666);
}
using_file(filename);
return open(filename, O_RDONLY | O_BINARY, 0666);
}
@ -5519,6 +5524,7 @@ static int
open_include_file(cpp_reader * pfile __UNUSED__, char *filename,
file_name_list * searchptr __UNUSED__)
{
using_file(filename);
return open(filename, O_RDONLY | O_BINARY, 0666);
}
@ -6561,6 +6567,20 @@ cpp_handle_options(cpp_reader * pfile, int argc, char **argv)
i++, push_pending(pfile, "-D", argv[i]);
break;
case 'a':
{
if (!strcmp(argv[i], "-a"))
{
if (i + 1 == argc)
cpp_fatal("Filename missing after `-a` option");
else if (strcmp(argv[++i], "/dev/null"))
{
opts->watchfile = argv[i];
}
}
break;
}
case 'A':
{
char *p = NULL;
@ -7425,3 +7445,17 @@ cpp_perror_with_name(cpp_reader * pfile, const char *name)
*
* Support for_lint flag.
*/
extern cpp_options options;
void
using_file(const char *filename)
{
FILE *f;
f = fopen(options.watchfile, "a");
if (!f) return ;
fputs(filename, f);
fputc('\n', f);
fclose(f);
}

View File

@ -473,6 +473,9 @@ struct cpp_options {
/* Target-name to write with the dependency information. */
char *deps_target;
/* Target file to write all include file */
const char *watchfile;
};
#define CPP_TRADITIONAL(PFILE) (CPP_OPTIONS(PFILE)-> traditional)
@ -636,6 +639,8 @@ void *xmalloc(unsigned size);
void *xrealloc(void *old, unsigned size);
void *xcalloc(unsigned number, unsigned size);
void using_file(const char *filename);
#ifdef __EMX__
#define PATH_SEPARATOR ';'
#endif