Added support for phony script targets

This commit is contained in:
Pierre Pronchery 2014-12-13 02:40:32 +01:00
parent f97abe5eab
commit 5308765aa2

View File

@ -46,6 +46,9 @@
/* prototypes */ /* prototypes */
/* accessors */
static int _makefile_is_phony(Configure * configure, char const * target);
static int _makefile_link(FILE * fp, int symlink, char const * link, static int _makefile_link(FILE * fp, int symlink, char const * link,
char const * path); char const * path);
static int _makefile_output_variable(FILE * fp, char const * name, static int _makefile_output_variable(FILE * fp, char const * name,
@ -98,6 +101,8 @@ static int _write_dist(Configure * configure, FILE * fp, configArray * ca,
int from, int to); int from, int to);
static int _write_distcheck(Configure * configure, FILE * fp); static int _write_distcheck(Configure * configure, FILE * fp);
static int _write_install(Configure * configure, FILE * fp); static int _write_install(Configure * configure, FILE * fp);
static int _write_phony(Configure * configure, FILE * fp,
char const ** targets);
static int _write_uninstall(Configure * configure, FILE * fp); static int _write_uninstall(Configure * configure, FILE * fp);
static int _makefile_write(Configure * configure, FILE * fp, configArray * ca, static int _makefile_write(Configure * configure, FILE * fp, configArray * ca,
int from, int to) int from, int to)
@ -116,8 +121,6 @@ static int _makefile_write(Configure * configure, FILE * fp, configArray * ca,
|| _write_install(configure, fp) != 0 || _write_install(configure, fp) != 0
|| _write_uninstall(configure, fp) != 0) || _write_uninstall(configure, fp) != 0)
return 1; return 1;
if(!(configure->prefs->flags & PREFS_n))
{
if(config_get(config, NULL, "subdirs") != NULL) if(config_get(config, NULL, "subdirs") != NULL)
depends[i++] = "subdirs"; depends[i++] = "subdirs";
depends[i++] = "clean"; depends[i++] = "clean";
@ -131,9 +134,7 @@ static int _makefile_write(Configure * configure, FILE * fp, configArray * ca,
depends[i++] = "install"; depends[i++] = "install";
depends[i++] = "uninstall"; depends[i++] = "uninstall";
depends[i++] = NULL; depends[i++] = NULL;
_makefile_targetv(fp, ".PHONY", depends); return _write_phony(configure, fp, depends);
}
return 0;
} }
static int _variables_package(Configure * configure, FILE * fp, static int _variables_package(Configure * configure, FILE * fp,
@ -289,6 +290,7 @@ static int _variables_targets(Configure * configure, FILE * fp)
size_t i; size_t i;
char c; char c;
String const * type; String const * type;
int phony;
if(configure->prefs->flags & PREFS_n) if(configure->prefs->flags & PREFS_n)
return 0; return 0;
@ -316,11 +318,6 @@ static int _variables_targets(Configure * configure, FILE * fp)
if(configure->os == HO_WIN32) if(configure->os == HO_WIN32)
fputs("$(EXEEXT)", fp); fputs("$(EXEEXT)", fp);
break; break;
case TT_OBJECT:
case TT_SCRIPT:
case TT_UNKNOWN:
fprintf(fp, " $(OBJDIR)%s", prints);
break;
case TT_LIBRARY: case TT_LIBRARY:
ret |= _variables_targets_library( ret |= _variables_targets_library(
configure, fp, prints); configure, fp, prints);
@ -329,8 +326,20 @@ static int _variables_targets(Configure * configure, FILE * fp)
fprintf(fp, " $(OBJDIR)%s%s", prints, fprintf(fp, " $(OBJDIR)%s%s", prints,
".la"); ".la");
break; break;
case TT_OBJECT:
case TT_UNKNOWN:
fprintf(fp, " $(OBJDIR)%s", prints);
break;
case TT_SCRIPT:
phony = _makefile_is_phony(configure,
prints);
fprintf(fp, " %s%s", phony
? "" : "$(OBJDIR)",
prints);
break;
case TT_PLUGIN: case TT_PLUGIN:
fprintf(fp, " $(OBJDIR)%s%s", prints, soext); fprintf(fp, " $(OBJDIR)%s%s", prints,
soext);
break; break;
} }
if(c == '\0') if(c == '\0')
@ -1412,6 +1421,7 @@ static int _target_script(Configure * configure, FILE * fp,
{ {
String const * prefix; String const * prefix;
String const * script; String const * script;
int phony;
if((script = config_get(configure->config, target, "script")) == NULL) if((script = config_get(configure->config, target, "script")) == NULL)
{ {
@ -1423,15 +1433,16 @@ static int _target_script(Configure * configure, FILE * fp,
error_set_print(PROGNAME, 0, "%s: %s%s%s", target, "The \"", error_set_print(PROGNAME, 0, "%s: %s%s%s", target, "The \"",
script, script,
"\" script is executed while compiling"); "\" script is executed while compiling");
phony = _makefile_is_phony(configure, target);
if(configure->prefs->flags & PREFS_n) if(configure->prefs->flags & PREFS_n)
return 0; return 0;
fprintf(fp, "\n$(OBJDIR)%s:", target); fprintf(fp, "\n%s%s:", phony ? "" : "$(OBJDIR)", target);
_script_depends(configure->config, fp, target); _script_depends(configure->config, fp, target);
fputc('\n', fp); fputc('\n', fp);
if((prefix = config_get(configure->config, target, "prefix")) == NULL) if((prefix = config_get(configure->config, target, "prefix")) == NULL)
prefix = "$(PREFIX)"; prefix = "$(PREFIX)";
fprintf(fp, "\t%s -P \"%s\" -- \"$(OBJDIR)%s\"\n", script, prefix, fprintf(fp, "\t%s -P \"%s\" -- \"%s%s\"\n", script, prefix,
target); phony ? "" : "$(OBJDIR)", target);
return 0; return 0;
} }
@ -2260,6 +2271,60 @@ static int _dist_install(Configure * configure, FILE * fp,
return 0; return 0;
} }
static int _write_phony_targets(Configure * configure, FILE * fp);
static int _write_phony(Configure * configure, FILE * fp, char const ** targets)
{
size_t i;
if(configure->prefs->flags & PREFS_n)
return 0;
fprintf(fp, "\n%s:", ".PHONY");
for(i = 0; targets[i] != NULL; i++)
fprintf(fp, " %s", targets[i]);
if(_write_phony_targets(configure, fp) != 0)
return 1;
fprintf(fp, "\n");
return 0;
}
static int _write_phony_targets(Configure * configure, FILE * fp)
{
String const * p;
String * prints;
String * q;
size_t i;
char c;
String const * type;
if((p = config_get(configure->config, NULL, "targets")) == NULL)
return 0;
if((prints = string_new(p)) == NULL)
return 1;
q = prints;
for(i = 0;; i++)
{
if(prints[i] != ',' && prints[i] != '\0')
continue;
c = prints[i];
prints[i] = '\0';
if((type = config_get(configure->config, prints, "type"))
!= NULL)
switch(enum_string(TT_LAST, sTargetType, type))
{
case TT_SCRIPT:
if(_makefile_is_phony(configure,
prints))
fprintf(fp, " %s", prints);
break;
}
if(c == '\0')
break;
prints += i + 1;
i = 0;
}
return 0;
}
static int _uninstall_target(Configure * configure, FILE * fp, static int _uninstall_target(Configure * configure, FILE * fp,
String const * target); String const * target);
static int _uninstall_include(Config * config, FILE * fp, static int _uninstall_include(Config * config, FILE * fp,
@ -2471,6 +2536,18 @@ static int _uninstall_dist(Config * config, FILE * fp, String const * dist)
} }
/* makefile_is_phony */
static int _makefile_is_phony(Configure * configure, char const * target)
{
String const * p;
if((p = config_get(configure->config, target, "phony")) != NULL
&& strtol(p, NULL, 10) == 1)
return 1;
return 0;
}
/* makefile_link */ /* makefile_link */
static int _makefile_link(FILE * fp, int symlink, char const * link, static int _makefile_link(FILE * fp, int symlink, char const * link,
char const * path) char const * path)