Abstract a good part of the output in helpers
This commit is contained in:
parent
011a4b6140
commit
61c0351965
134
src/makefile.c
134
src/makefile.c
@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <System.h>
|
#include <System.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -45,8 +46,13 @@
|
|||||||
|
|
||||||
|
|
||||||
/* prototypes */
|
/* prototypes */
|
||||||
|
static int _makefile_link(FILE * fp, int symlink, char const * link,
|
||||||
|
char const * path);
|
||||||
static int _makefile_output_variable(FILE * fp, char const * name,
|
static int _makefile_output_variable(FILE * fp, char const * name,
|
||||||
char const * value);
|
char const * value);
|
||||||
|
static int _makefile_remove(FILE * fp, int recursive, ...);
|
||||||
|
static int _makefile_subdirs(FILE * fp, char const * target);
|
||||||
|
static int _makefile_target(FILE * fp, char const * target, ...);
|
||||||
|
|
||||||
|
|
||||||
/* functions */
|
/* functions */
|
||||||
@ -817,14 +823,16 @@ static int _write_targets(Configure * configure, FILE * fp)
|
|||||||
|
|
||||||
static int _targets_all(Configure * configure, FILE * fp)
|
static int _targets_all(Configure * configure, FILE * fp)
|
||||||
{
|
{
|
||||||
|
char const * depends[] = { NULL, NULL };
|
||||||
|
size_t i = 0;
|
||||||
|
|
||||||
if(configure->prefs->flags & PREFS_n)
|
if(configure->prefs->flags & PREFS_n)
|
||||||
return 0;
|
return 0;
|
||||||
fprintf(fp, "%s", "\nall:");
|
|
||||||
if(config_get(configure->config, NULL, "subdirs") != NULL)
|
if(config_get(configure->config, NULL, "subdirs") != NULL)
|
||||||
fprintf(fp, "%s", " subdirs");
|
depends[i++] = "subdirs";
|
||||||
if(config_get(configure->config, NULL, "targets") != NULL)
|
if(config_get(configure->config, NULL, "targets") != NULL)
|
||||||
fprintf(fp, "%s", " $(TARGETS)");
|
depends[i++] = "$(TARGETS)";
|
||||||
fprintf(fp, "%s", "\n");
|
_makefile_target(fp, "all", depends[0], depends[1], NULL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -835,8 +843,10 @@ static int _targets_subdirs(Configure * configure, FILE * fp)
|
|||||||
if(configure->prefs->flags & PREFS_n)
|
if(configure->prefs->flags & PREFS_n)
|
||||||
return 0;
|
return 0;
|
||||||
if((subdirs = config_get(configure->config, NULL, "subdirs")) != NULL)
|
if((subdirs = config_get(configure->config, NULL, "subdirs")) != NULL)
|
||||||
fprintf(fp, "%s", "\nsubdirs:\n\t@for i in $(SUBDIRS); do"
|
{
|
||||||
" (cd \"$$i\" && $(MAKE)) || exit; done\n");
|
_makefile_target(fp, "subdirs", NULL);
|
||||||
|
_makefile_subdirs(fp, NULL);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1588,10 +1598,9 @@ static int _write_clean(Configure * configure, FILE * fp)
|
|||||||
{
|
{
|
||||||
if(configure->prefs->flags & PREFS_n)
|
if(configure->prefs->flags & PREFS_n)
|
||||||
return 0;
|
return 0;
|
||||||
fputs("\nclean:\n", fp);
|
_makefile_target(fp, "clean", NULL);
|
||||||
if(config_get(configure->config, NULL, "subdirs") != NULL)
|
if(config_get(configure->config, NULL, "subdirs") != NULL)
|
||||||
fputs("\t@for i in $(SUBDIRS); do (cd \"$$i\" && $(MAKE) clean)"
|
_makefile_subdirs(fp, "clean");
|
||||||
" || exit; done\n", fp);
|
|
||||||
return _clean_targets(configure->config, fp);
|
return _clean_targets(configure->config, fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1654,19 +1663,18 @@ static int _write_distclean(Configure * configure, FILE * fp)
|
|||||||
|
|
||||||
if(configure->prefs->flags & PREFS_n)
|
if(configure->prefs->flags & PREFS_n)
|
||||||
return 0;
|
return 0;
|
||||||
fputs("\ndistclean:", fp);
|
|
||||||
/* only depend on the "clean" target if we do not have subfolders */
|
/* only depend on the "clean" target if we do not have subfolders */
|
||||||
if((subdirs = config_get(configure->config, NULL, "subdirs")) == NULL)
|
if((subdirs = config_get(configure->config, NULL, "subdirs")) == NULL)
|
||||||
fputs(" clean\n", fp);
|
_makefile_target(fp, "distclean", "clean", NULL);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fputs("\n\t@for i in $(SUBDIRS); do (cd \"$$i\""
|
_makefile_target(fp, "distclean", NULL);
|
||||||
" && $(MAKE) distclean) || exit; done\n", fp);
|
_makefile_subdirs(fp, "distclean");
|
||||||
_clean_targets(configure->config, fp);
|
_clean_targets(configure->config, fp);
|
||||||
}
|
}
|
||||||
/* FIXME do not erase targets that need be distributed */
|
/* FIXME do not erase targets that need be distributed */
|
||||||
if(config_get(configure->config, NULL, "targets") != NULL)
|
if(config_get(configure->config, NULL, "targets") != NULL)
|
||||||
fputs("\t$(RM) -- $(TARGETS)\n", fp);
|
_makefile_remove(fp, 0, "$(TARGETS)", NULL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1685,9 +1693,10 @@ static int _write_dist(Configure * configure, FILE * fp, configArray * ca,
|
|||||||
version = config_get(configure->config, NULL, "version");
|
version = config_get(configure->config, NULL, "version");
|
||||||
if(package == NULL || version == NULL)
|
if(package == NULL || version == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
fputs("\ndist:\n\t$(RM) -r -- $(PACKAGE)-$(VERSION)\n"
|
_makefile_target(fp, "dist", NULL);
|
||||||
"\t$(LN) -s -- . $(PACKAGE)-$(VERSION)\n"
|
_makefile_remove(fp, 1, "$(PACKAGE)-$(VERSION)", NULL);
|
||||||
"\t@$(TAR) -czvf $(PACKAGE)-$(VERSION).tar.gz -- \\\n", fp);
|
_makefile_link(fp, 1, ".", "$(PACKAGE)-$(VERSION)");
|
||||||
|
fputs("\t@$(TAR) -czvf $(PACKAGE)-$(VERSION).tar.gz -- \\\n", fp);
|
||||||
for(i = from + 1; i < to; i++)
|
for(i = from + 1; i < to; i++)
|
||||||
{
|
{
|
||||||
array_get_copy(ca, i, &p);
|
array_get_copy(ca, i, &p);
|
||||||
@ -1700,7 +1709,7 @@ static int _write_dist(Configure * configure, FILE * fp, configArray * ca,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
return 1;
|
return 1;
|
||||||
fputs("\t$(RM) -- $(PACKAGE)-$(VERSION)\n", fp);
|
_makefile_remove(fp, 0, "$(PACKAGE)-$(VERSION)", NULL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1826,17 +1835,15 @@ static int _install_dist(Configure * configure, FILE * fp);
|
|||||||
static int _write_install(Configure * configure, FILE * fp)
|
static int _write_install(Configure * configure, FILE * fp)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
char const * targets;
|
||||||
|
|
||||||
if(configure->prefs->flags & PREFS_n)
|
if(configure->prefs->flags & PREFS_n)
|
||||||
return 0;
|
return 0;
|
||||||
fputs("\ninstall:", fp);
|
targets = config_get(configure->config, NULL, "targets");
|
||||||
if(config_get(configure->config, NULL, "targets") != NULL)
|
_makefile_target(fp, "install", (targets != NULL) ? "$(TARGETS)" : NULL,
|
||||||
fputs(" $(TARGETS)", fp);
|
NULL);
|
||||||
fputc('\n', fp);
|
|
||||||
if(config_get(configure->config, NULL, "subdirs") != NULL)
|
if(config_get(configure->config, NULL, "subdirs") != NULL)
|
||||||
fputs("\t@for i in $(SUBDIRS); do (cd \"$$i\""
|
_makefile_subdirs(fp, "install");
|
||||||
" && $(MAKE) install)"
|
|
||||||
" || exit; done\n", fp);
|
|
||||||
ret |= _install_targets(configure, fp);
|
ret |= _install_targets(configure, fp);
|
||||||
ret |= _install_includes(configure, fp);
|
ret |= _install_includes(configure, fp);
|
||||||
ret |= _install_dist(configure, fp);
|
ret |= _install_dist(configure, fp);
|
||||||
@ -1995,14 +2002,23 @@ static void _install_target_plugin(Configure * configure, FILE * fp,
|
|||||||
{
|
{
|
||||||
String const * path;
|
String const * path;
|
||||||
String const * soext;
|
String const * soext;
|
||||||
|
String const * mode;
|
||||||
|
mode_t m = 0755;
|
||||||
|
String * p;
|
||||||
|
|
||||||
if((path = config_get(configure->config, target, "install")) == NULL)
|
if((path = config_get(configure->config, target, "install")) == NULL)
|
||||||
return;
|
return;
|
||||||
soext = configure_get_soext(configure);
|
soext = configure_get_soext(configure);
|
||||||
|
if((mode = config_get(configure->config, target, "mode")) == NULL
|
||||||
|
/* XXX these tests are not sufficient */
|
||||||
|
|| mode[0] == '\0'
|
||||||
|
|| (m = strtol(mode, &p, 8)) == 0
|
||||||
|
|| *p != '\0')
|
||||||
|
mode = "0755";
|
||||||
fprintf(fp, "%s%s\n", "\t$(MKDIR) $(DESTDIR)", path);
|
fprintf(fp, "%s%s\n", "\t$(MKDIR) $(DESTDIR)", path);
|
||||||
fprintf(fp, "%s%s%s%s%s/%s%s%s", "\t$(INSTALL) -m 0644 $(OBJDIR)",
|
fprintf(fp, "%s%04o%s%s%s%s%s%s%s%s%s", "\t$(INSTALL) -m ", m,
|
||||||
target, soext, " $(DESTDIR)", path, target, soext,
|
" $(OBJDIR)", target, soext, " $(DESTDIR)", path, "/",
|
||||||
"\n");
|
target, soext, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _install_target_script(Configure * configure, FILE * fp,
|
static void _install_target_script(Configure * configure, FILE * fp,
|
||||||
@ -2175,10 +2191,9 @@ static int _write_uninstall(Configure * configure, FILE * fp)
|
|||||||
|
|
||||||
if(configure->prefs->flags & PREFS_n)
|
if(configure->prefs->flags & PREFS_n)
|
||||||
return 0;
|
return 0;
|
||||||
fputs("\nuninstall:\n", fp);
|
_makefile_target(fp, "uninstall", NULL);
|
||||||
if(config_get(configure->config, NULL, "subdirs") != NULL)
|
if(config_get(configure->config, NULL, "subdirs") != NULL)
|
||||||
fputs("\t@for i in $(SUBDIRS); do (cd \"$$i\" &&"
|
_makefile_subdirs(fp, "uninstall");
|
||||||
" $(MAKE) uninstall) || exit; done\n", fp);
|
|
||||||
if((p = config_get(configure->config, NULL, "targets")) != NULL)
|
if((p = config_get(configure->config, NULL, "targets")) != NULL)
|
||||||
{
|
{
|
||||||
if((targets = string_new(p)) == NULL)
|
if((targets = string_new(p)) == NULL)
|
||||||
@ -2345,6 +2360,15 @@ static int _uninstall_dist(Config * config, FILE * fp, String const * dist)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* makefile_link */
|
||||||
|
static int _makefile_link(FILE * fp, int symlink, char const * link,
|
||||||
|
char const * path)
|
||||||
|
{
|
||||||
|
fprintf(fp, "\t$(LN)%s -- %s %s\n", symlink ? " -s" : "", link, path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* makefile_output_variable */
|
/* makefile_output_variable */
|
||||||
static int _makefile_output_variable(FILE * fp, char const * name,
|
static int _makefile_output_variable(FILE * fp, char const * name,
|
||||||
char const * value)
|
char const * value)
|
||||||
@ -2364,3 +2388,51 @@ static int _makefile_output_variable(FILE * fp, char const * name,
|
|||||||
res = fprintf(fp, "%s%s%s%s\n", name, align, equals, value);
|
res = fprintf(fp, "%s%s%s%s\n", name, align, equals, value);
|
||||||
return (res >= 0) ? 0 : -1;
|
return (res >= 0) ? 0 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* makefile_remove */
|
||||||
|
static int _makefile_remove(FILE * fp, int recursive, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
char const * sep = " -- ";
|
||||||
|
char const * p;
|
||||||
|
|
||||||
|
fprintf(fp, "\t$(RM)%s", recursive ? " -r" : "");
|
||||||
|
va_start(ap, recursive);
|
||||||
|
while((p = va_arg(ap, char const * )) != NULL)
|
||||||
|
{
|
||||||
|
fprintf(fp, "%s%s", sep, p);
|
||||||
|
sep = " ";
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
fputc('\n', fp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* makefile_subdirs */
|
||||||
|
static int _makefile_subdirs(FILE * fp, char const * target)
|
||||||
|
{
|
||||||
|
fprintf(fp, "\t@for i in $(SUBDIRS); do (cd \"$$i\" && $(MAKE)%s%s)"
|
||||||
|
" || exit; done\n",
|
||||||
|
(target != NULL) ? " " : "",
|
||||||
|
(target != NULL) ? target : "");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* makefile_target */
|
||||||
|
static int _makefile_target(FILE * fp, char const * target, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
char const * sep = " ";
|
||||||
|
char const * p;
|
||||||
|
|
||||||
|
fprintf(fp, "\n%s:", target);
|
||||||
|
va_start(ap, target);
|
||||||
|
while((p = va_arg(ap, char const *)) != NULL)
|
||||||
|
fprintf(fp, "%s%s", sep, p);
|
||||||
|
va_end(ap);
|
||||||
|
fputc('\n', fp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user