From 5b66f341479637f5850f4f7f260bc4b2b4a58b96 Mon Sep 17 00:00:00 2001 From: Nicola Fontana Date: Mon, 28 Jan 2013 19:21:05 +0100 Subject: [PATCH] build: corrected installed vs uninstalled behavior Relying on the binary name to discriminate between installed and uninstalled behaviors. This implementation has been succesfully tested in the ntdisp project: check http://dev.entidi.com/p/ntdisp/issues/95/ for technical details. Closes issue #94: http://dev.entidi.com/p/adg/issues/94/ --- build/adg.nsi.in | 5 +++- demo/.gitignore | 4 ++-- demo/Makefile.am | 39 +++++++++++++++++++++----------- demo/adg-demo.c | 69 ++++++++++++++++++++++++++++++++++++++++++++------------ 4 files changed, 87 insertions(+), 30 deletions(-) diff --git a/build/adg.nsi.in b/build/adg.nsi.in index 98bfd4dd..f11d19db 100644 --- a/build/adg.nsi.in +++ b/build/adg.nsi.in @@ -67,7 +67,8 @@ Section "ADG canvas" SecBase SectionIn RO SetOutPath "$INSTDIR" - File "${BUILDDIR}/demo/.libs/adg-demo.exe" + File /oname=adg-demo.exe "${BUILDDIR}/demo/.libs/adg-demo-uninstalled.exe" + File /oname=cpml-demo.exe "${BUILDDIR}/demo/.libs/cpml-demo-uninstalled.exe" File "${BUILDDIR}/demo/adg-demo.ui" File "${SRCDIR}/demo/adg-16.png" File "${SRCDIR}/demo/adg-32.png" @@ -104,6 +105,7 @@ Section "ADG canvas" SecBase CreateDirectory "$SMPROGRAMS\ADG Canvas" CreateShortcut "$SMPROGRAMS\ADG Canvas\ADG demonstration program.lnk" "$INSTDIR\adg-demo.exe" + CreateShortcut "$SMPROGRAMS\ADG Canvas\CPML test case.lnk" "$INSTDIR\cpml-demo.exe" CreateShortcut "$SMPROGRAMS\ADG Canvas\Uninstall ADG Canvas.lnk" "$INSTDIR\uninstall.exe" WriteUninstaller "$INSTDIR\uninstall.exe" @@ -164,6 +166,7 @@ Section "Uninstall" RMDir "$INSTDIR\share" Delete "$INSTDIR\adg-demo.exe" + Delete "$INSTDIR\cpml-demo.exe" Delete "$INSTDIR\adg-128.png" Delete "$INSTDIR\adg-64.png" Delete "$INSTDIR\adg-48.png" diff --git a/demo/.gitignore b/demo/.gitignore index a103780e..ace25a57 100644 --- a/demo/.gitignore +++ b/demo/.gitignore @@ -1,5 +1,5 @@ -/adg-demo +/adg-demo-uninstalled /adg-demo.ui /adg-glade -/cpml-demo +/cpml-demo-uninstalled /cpml-demo.ui diff --git a/demo/Makefile.am b/demo/Makefile.am index 61291165..e9ad8cb5 100644 --- a/demo/Makefile.am +++ b/demo/Makefile.am @@ -2,6 +2,7 @@ include $(top_srcdir)/build/Makefile.am.common AM_CPPFLAGS= -I$(top_srcdir)/src \ -I$(top_builddir)/src \ + -DPKGDATADIR='"$(pkgdatadir)"' \ -DSRCDIR='"$(abs_srcdir)"' \ -DBUILDDIR='"$(abs_builddir)"' AM_CFLAGS= $(GTK3_CFLAGS) $(GTK2_CFLAGS) \ @@ -10,27 +11,22 @@ AM_CFLAGS= $(GTK3_CFLAGS) $(GTK2_CFLAGS) \ LDADD= $(top_builddir)/src/adg/libadg-1.la -bin_PROGRAMS= adg-demo \ - cpml-demo -adg_demo_SOURCES= adg-demo.c +bin_PROGRAMS= adg-demo-uninstalled \ + cpml-demo-uninstalled + +adg_demo_uninstalled_SOURCES= adg-demo.c if HAVE_GTK3 -cpml_demo_SOURCES= cpml-demo.c +cpml_demo_uninstalled_SOURCES= cpml-demo.c endif if HAVE_GTK2 -cpml_demo_SOURCES= cpml-demo-gtk2.c -endif - -if OS_WINDOWS -adgdatadir= $(bindir) -else -adgdatadir= $(pkgdatadir) +cpml_demo_uninstalled_SOURCES= cpml-demo-gtk2.c endif -nodist_adgdata_DATA= adg-demo.ui \ +nodist_pkgdata_DATA= adg-demo.ui \ cpml-demo.ui -dist_adgdata_DATA= adg-16.png \ +dist_pkgdata_DATA= adg-16.png \ adg-32.png \ adg-48.png \ adg-64.png \ @@ -39,3 +35,20 @@ dist_adgdata_DATA= adg-16.png \ EXTRA_DIST= cpml-demo.ui.in \ adg-demo.ui.in + + +# adg-demo-uninstalled and cpml-demo-uninstalled are renamed after installation: +# the uninstalled version should not be checked for --help and --version. +AM_INSTALLCHECK_STD_OPTIONS_EXEMPT= \ + adg-demo-uninstalled$(EXEEXT) \ + cpml-demo-uninstalled$(EXEEXT) + +install-exec-hook: + $(AM_V_at)cd $(DESTDIR)$(bindir) ; \ + mv -f adg-demo-uninstalled$(EXEEXT) adg-demo$(EXEEXT) ; \ + mv -f cpml-demo-uninstalled$(EXEEXT) cpml-demo$(EXEEXT) + +uninstall-hook: + $(AM_V_at)cd $(DESTDIR)$(bindir) ; \ + rm -f adg-demo$(EXEEXT) ; \ + rm -f cpml-demo$(EXEEXT) diff --git a/demo/adg-demo.c b/demo/adg-demo.c index fafc4950..64fdba28 100644 --- a/demo/adg-demo.c +++ b/demo/adg-demo.c @@ -12,6 +12,17 @@ #define CHAMFER 0.3 +/* Whether render the boxes to highlight the extents of every entity */ +static gboolean show_extents = FALSE; + +/* Whether the program is running installed or uninstalled */ +static gboolean is_installed = TRUE; + +/* The base directory where all files must be referred, + * usually left unset _adg_init() on POSIX systems. */ +static gchar *basedir = NULL; + + typedef struct _DemoPart DemoPart; struct _DemoPart { @@ -71,32 +82,63 @@ _adg_version(void) } static void -_adg_parse_args(gint *p_argc, gchar **p_argv[], gboolean *show_extents) +_adg_init(gint *p_argc, gchar **p_argv[]) { - GError *error = NULL; GOptionEntry entries[] = { {"version", 'V', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) _adg_version, _("Display version information"), NULL}, {"show-extents", 'E', 0, G_OPTION_ARG_NONE, - NULL, _("Show the boundary boxes of every entity"), NULL}, + &show_extents, _("Show the boundary boxes of every entity"), NULL}, {NULL} }; + GError *error; + gchar *name; - entries[1].arg_data = show_extents; - *show_extents = FALSE; + if (p_argc == NULL || p_argv == NULL || *p_argc < 1 || *p_argv[0] == NULL) { + g_error(_("Invalid arguments: arg[0] not set")); + g_assert_not_reached(); + } + + name = g_path_get_basename(*p_argv[0]); + if (name == NULL) + return; + is_installed = strstr(name, "uninstalled") == NULL; + g_free(name); + + basedir = g_path_get_dirname(*p_argv[0]); + + error = NULL; gtk_init_with_args(p_argc, p_argv, _("- ADG demonstration program"), entries, GETTEXT_PACKAGE, &error); - if (error != NULL) { - gint error_code = error->code; + g_error("%s", error->message); + g_assert_not_reached(); + } +} - g_printerr("%s\n", error->message); +static gchar * +_adg_file(const gchar *file_name) +{ + static gchar *pkg_data_dir = NULL; - g_error_free(error); - exit(error_code); + if (! is_installed) { + /* Running uninstalled: look up the file in BUILDDIR before and + * in SRCDIR after, returning the first match */ + return adg_find_file(file_name, BUILDDIR, SRCDIR, NULL); } -} + /* Otherwise, look up the file only in PKGDATADIR */ + if (pkg_data_dir == NULL) { +#ifdef G_OS_WIN32 + pkg_data_dir = g_build_filename(basedir != NULL ? basedir : "", + PKGDATADIR, NULL); +#else + pkg_data_dir = g_strdup(PKGDATADIR); +#endif + } + + return adg_find_file(file_name, pkg_data_dir, NULL); +} /** * _adg_error: @@ -1119,16 +1161,15 @@ _adg_main_window(GtkBuilder *builder) int main(gint argc, gchar **argv) { - gboolean show_extents; gchar *path; GtkBuilder *builder; GError *error; GtkWidget *main_window; - _adg_parse_args(&argc, &argv, &show_extents); + _adg_init(&argc, &argv); adg_switch_extents(show_extents); - path = adg_find_file("adg-demo.ui", adg_datadir(), BUILDDIR, NULL); + path = _adg_file("adg-demo.ui"); if (path == NULL) { g_print(_("adg-demo.ui not found!\n")); return 1; -- 2.11.4.GIT