Use msi for dependency rules generation
Added -D command, modified RULES.Db to use it.
This commit is contained in:
@@ -87,9 +87,9 @@ YACC = $(EYACC)
|
||||
LEX = $(ELEX)
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# msi used to be an external tool
|
||||
# Our use of msi is incompatible with older versions
|
||||
|
||||
MSI ?= $(EPICS_BASE_HOST_BIN)/msi
|
||||
MSI3_15 = $(EPICS_BASE_HOST_BIN)/msi
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# External tools and tool flags - must be in path or defined in application
|
||||
|
||||
@@ -259,23 +259,19 @@ menu%.h$(DEP): ../menu%.dbd
|
||||
|
||||
%.db$(RAW)$(DEP): %$(SUBST_SUFFIX)
|
||||
@$(RM) $@
|
||||
$(MKMF) -m$@ $(DBFLAGS) $(COMMONDEP_TARGET) $< $(TEMPLATE_FILENAME)
|
||||
@echo "$(COMMONDEP_TARGET): $(TEMPLATE_FILENAME)" >> $@
|
||||
@echo "$@: $(TEMPLATE_FILENAME)" >> $@
|
||||
$(MSI3_15) -D $(DBFLAGS) -o $(COMMONDEP_TARGET) -S$< $(TEMPLATE_FILENAME) > $@
|
||||
|
||||
%.db$(RAW)$(DEP): ../%$(SUBST_SUFFIX)
|
||||
@$(RM) $@
|
||||
$(MKMF) -m$@ $(DBFLAGS) $(COMMONDEP_TARGET) $< $(TEMPLATE_FILENAME)
|
||||
@echo "$(COMMONDEP_TARGET): $(TEMPLATE_FILENAME)" >> $@
|
||||
@echo "$@: $(TEMPLATE_FILENAME)" >> $@
|
||||
$(MSI3_15) -D $(DBFLAGS) -o $(COMMONDEP_TARGET) -S$< $(TEMPLATE_FILENAME) > $@
|
||||
|
||||
%.db$(RAW)$(DEP): %.template
|
||||
@$(RM) $@
|
||||
$(MKMF) -m$@ $(DBFLAGS) $(COMMONDEP_TARGET) $<
|
||||
$(MSI3_15) -D $(DBFLAGS) -o $(COMMONDEP_TARGET) $< > $@
|
||||
|
||||
%.db$(RAW)$(DEP): ../%.template
|
||||
@$(RM) $@
|
||||
$(MKMF) -m$@ $(DBFLAGS) $(COMMONDEP_TARGET) $<
|
||||
$(MSI3_15) -D $(DBFLAGS) -o $(COMMONDEP_TARGET) $< > $@
|
||||
|
||||
%.acf$(DEP): %.acs
|
||||
@$(RM) $@
|
||||
@@ -461,27 +457,27 @@ $(COMMON_DIR)/%.db$(RAW): $(COMMON_DIR)/%.edf
|
||||
|
||||
$(COMMON_DIR)/%.db$(RAW): %$(SUBST_SUFFIX)
|
||||
$(ECHO) "Inflating database from $< $(TEMPLATE_FILENAME)"
|
||||
@$(RM) $@ $*.tmp
|
||||
$(MSI) $(DBFLAGS) -S$< $(TEMPLATE_FILENAME) > $*.tmp
|
||||
$(MV) $*.tmp $@
|
||||
@$(RM) $(notdir $@)
|
||||
$(MSI3_15) $(DBFLAGS) -o $(notdir $@) -S$< $(TEMPLATE_FILENAME)
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(COMMON_DIR)/%.db$(RAW): ../%$(SUBST_SUFFIX)
|
||||
$(ECHO) "Inflating database from $< $(TEMPLATE_FILENAME)"
|
||||
@$(RM) $@ $*.tmp
|
||||
$(MSI) $(DBFLAGS) -S$< $(TEMPLATE_FILENAME) > $*.tmp
|
||||
$(MV) $*.tmp $@
|
||||
@$(RM) $(notdir $@)
|
||||
$(MSI3_15) $(DBFLAGS) -o $(notdir $@) -S$< $(TEMPLATE_FILENAME)
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(COMMON_DIR)/%.db$(RAW): %.template
|
||||
$(ECHO) "Inflating database from $<"
|
||||
@$(RM) $@ $*.tmp
|
||||
$(MSI) $(DBFLAGS) $< > $*.tmp
|
||||
$(MV) $*.tmp $@
|
||||
@$(RM) $(notdir $@)
|
||||
$(MSI3_15) $(DBFLAGS) -o $(notdir $@) $<
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(COMMON_DIR)/%.db$(RAW): ../%.template
|
||||
$(ECHO) "Inflating database from $<"
|
||||
@$(RM) $@ $*.tmp
|
||||
$(MSI) $(DBFLAGS) $< > $*.tmp
|
||||
$(MV) $*.tmp $@
|
||||
@$(RM) $(notdir $@)
|
||||
$(MSI3_15) $(DBFLAGS) -o $(notdir $@) $<
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(COMMON_DIR)/%.acf: %.acs
|
||||
$(ECHO) "Creating acf file $@"
|
||||
|
||||
@@ -14,6 +14,17 @@
|
||||
<h2 align="center">Changes between 3.15.1 and 3.15.2</h2>
|
||||
<!-- Insert new items immediately below here ... -->
|
||||
|
||||
<h3>Using msi for dependencies</h3>
|
||||
|
||||
<p>To reduce confusion the msi program has been modified to allow the generation
|
||||
of dependency rules by adding support for a <tt>-D</tt> option, and changing the
|
||||
commands in RULES.Db to use this option instead of the mkmf.pl script. The new
|
||||
build rules will not work with old versions of the msi program, so the command
|
||||
variable name used in the rules has been changed from MSI to MSI3_15. Sites that
|
||||
use a modified version of msi must provide support for both the <tt>-D</tt> and
|
||||
<tt>-o outfile</tt> options, and should then point the MSI3_15 variable in
|
||||
their applications' CONFIG_SITE files to that updated executable.</p>
|
||||
|
||||
<h2 align="center">Changes between 3.15.0.2 and 3.15.1</h2>
|
||||
|
||||
<h3>epicsStrnEscapedFromRaw() and epicsStrnRawFromEscaped()</h3>
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <osiFileName.h>
|
||||
|
||||
#define MAX_BUFFER_SIZE 4096
|
||||
#define MAX_DEPS 1024
|
||||
|
||||
/* Module to read the template files */
|
||||
typedef struct inputData inputData;
|
||||
@@ -47,12 +48,16 @@ static char *substituteGetReplacements(subInfo *pvt);
|
||||
static char *substituteGetGlobalReplacements(subInfo *pvt);
|
||||
|
||||
/* Forward references to local routines */
|
||||
static void usageExit(void);
|
||||
static void usageExit(int status);
|
||||
static void addMacroReplacements(MAC_HANDLE *macPvt, char *pval);
|
||||
static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *templateName);
|
||||
|
||||
/*Global variables */
|
||||
static int opt_V = 0;
|
||||
static int opt_D = 0;
|
||||
|
||||
static char *outFile = 0;
|
||||
static int numDeps = 0, depHashes[MAX_DEPS];
|
||||
|
||||
|
||||
int main(int argc,char **argv)
|
||||
@@ -73,24 +78,26 @@ int main(int argc,char **argv)
|
||||
pval = (narg==1) ? (argv[1]+2) : argv[2];
|
||||
if(strncmp(argv[1],"-I",2)==0) {
|
||||
inputAddPath(inputPvt,pval);
|
||||
} else if (strcmp(argv[1], "-D") == 0) {
|
||||
opt_D = 1;
|
||||
narg = 1; /* no argument for this option */
|
||||
} else if(strncmp(argv[1],"-o",2)==0) {
|
||||
if(freopen(pval,"w",stdout)==NULL) {
|
||||
fprintf(stderr,"msi: Can't open %s for writing: %s\n",
|
||||
pval, strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
outFile = epicsStrDup(pval);
|
||||
} else if(strncmp(argv[1],"-M",2)==0) {
|
||||
addMacroReplacements(macPvt,pval);
|
||||
} else if(strncmp(argv[1],"-S",2)==0) {
|
||||
substitutionName = epicsStrDup(pval);
|
||||
} else if(strncmp(argv[1],"-V",2)==0) {
|
||||
} else if (strcmp(argv[1], "-V") == 0) {
|
||||
opt_V = 1;
|
||||
narg = 1; /* no argument for this option */
|
||||
} else if(strncmp(argv[1],"-g",2)==0) {
|
||||
} else if (strcmp(argv[1], "-g") == 0) {
|
||||
localScope = 0;
|
||||
narg = 1; /* no argument for this option */
|
||||
} else if (strcmp(argv[1], "-h") == 0) {
|
||||
usageExit(0);
|
||||
} else {
|
||||
usageExit();
|
||||
fprintf(stderr, "msi: Bad argument \"%s\"\n", argv[1]);
|
||||
usageExit(1);
|
||||
}
|
||||
argc -= narg;
|
||||
for(i=1; i<argc; i++) argv[i] = argv[i + narg];
|
||||
@@ -99,7 +106,19 @@ int main(int argc,char **argv)
|
||||
macSuppressWarning(macPvt,1);
|
||||
if(argc>2) {
|
||||
fprintf(stderr,"msi: Too many arguments\n");
|
||||
usageExit();
|
||||
usageExit(1);
|
||||
}
|
||||
if (opt_D) {
|
||||
if (!outFile) {
|
||||
fprintf(stderr, "msi: Option -D requires -o for Makefile target\n");
|
||||
exit(1);
|
||||
}
|
||||
printf("%s:", outFile);
|
||||
}
|
||||
else if (outFile && freopen(outFile, "w", stdout) == NULL) {
|
||||
fprintf(stderr, "msi: Can't open %s for writing: %s\n",
|
||||
outFile, strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
if(argc==2) {
|
||||
templateName = epicsStrDup(argv[1]);
|
||||
@@ -122,7 +141,7 @@ int main(int argc,char **argv)
|
||||
if(templateName) filename = templateName;
|
||||
if(!filename) {
|
||||
fprintf(stderr,"msi: No template file\n");
|
||||
usageExit();
|
||||
usageExit(1);
|
||||
}
|
||||
while((pval = substituteGetReplacements(substitutePvt))){
|
||||
if (localScope) macPushScope(macPvt);
|
||||
@@ -137,24 +156,30 @@ int main(int argc,char **argv)
|
||||
errlogFlush();
|
||||
macDeleteHandle(macPvt);
|
||||
inputDestruct(inputPvt);
|
||||
if (opt_D) {
|
||||
printf("\n");
|
||||
}
|
||||
free(templateName);
|
||||
free(substitutionName);
|
||||
return opt_V & 2;
|
||||
}
|
||||
|
||||
void usageExit(void)
|
||||
void usageExit(int status)
|
||||
{
|
||||
fprintf(stderr,"usage: msi [options] [template]\n");
|
||||
fprintf(stderr,"stdin is used if neither template nor substitution file is given\n");
|
||||
fprintf(stderr,"options:\n");
|
||||
fprintf(stderr," -V Undefined macros generate an error\n");
|
||||
fprintf(stderr," -g All macros have global scope\n");
|
||||
fprintf(stderr," -o<FILE> Save output to <FILE>\n");
|
||||
fprintf(stderr," -I<DIR> Add <DIR> to include file search path\n");
|
||||
fprintf(stderr," -M<SUBST> Add <SUBST> to (global) macro definitions\n");
|
||||
fprintf(stderr," (<SUBST> takes the form VAR=VALUE,...)\n");
|
||||
fprintf(stderr," -S<FILE> Expand the substitutions in FILE\n");
|
||||
exit(1);
|
||||
fprintf(stderr,
|
||||
"Usage: msi [options] [template]\n"
|
||||
" stdin is used if neither template nor substitution file is given\n"
|
||||
" options:\n"
|
||||
" -h Print this help message\n"
|
||||
" -D Output file dependencies, not substitutions\n"
|
||||
" -V Undefined macros generate an error\n"
|
||||
" -g All macros have global scope\n"
|
||||
" -o<FILE> Send output to <FILE>\n"
|
||||
" -I<DIR> Add <DIR> to include file search path\n"
|
||||
" -M<SUBST> Add <SUBST> to (global) macro definitions\n"
|
||||
" (<SUBST> takes the form VAR=VALUE,...)\n"
|
||||
" -S<FILE> Expand the substitutions in FILE\n");
|
||||
exit(status);
|
||||
}
|
||||
|
||||
static void addMacroReplacements(MAC_HANDLE *macPvt,char *pval)
|
||||
@@ -165,13 +190,13 @@ static void addMacroReplacements(MAC_HANDLE *macPvt,char *pval)
|
||||
status = macParseDefns(macPvt,pval,&pairs);
|
||||
if(status==-1) {
|
||||
fprintf(stderr,"msi: Error from macParseDefns\n");
|
||||
usageExit();
|
||||
usageExit(1);
|
||||
}
|
||||
if(status) {
|
||||
status = macInstallMacros(macPvt,pairs);
|
||||
if(!status) {
|
||||
fprintf(stderr,"Error from macInstallMacros\n");
|
||||
usageExit();
|
||||
usageExit(1);
|
||||
}
|
||||
free(pairs);
|
||||
}
|
||||
@@ -249,7 +274,7 @@ static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *tem
|
||||
expand = 0;
|
||||
}
|
||||
endif:
|
||||
if (expand) {
|
||||
if (expand && !opt_D) {
|
||||
n = macExpandString(macPvt,input,buffer,MAX_BUFFER_SIZE-1);
|
||||
fputs(buffer,stdout);
|
||||
if (opt_V == 1 && n < 0) {
|
||||
@@ -432,6 +457,32 @@ static void inputOpenFile(inputData *pinputData,char *filename)
|
||||
} else {
|
||||
pinputFile->filename = epicsStrDup("stdin");
|
||||
}
|
||||
|
||||
if (opt_D) {
|
||||
int hash = epicsStrHash(pinputFile->filename, 12345);
|
||||
int i = 0;
|
||||
int match = 0;
|
||||
|
||||
while (i < numDeps) {
|
||||
if (hash == depHashes[i++]) {
|
||||
match = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!match) {
|
||||
const char *wrap = numDeps ? " \\\n" : "";
|
||||
|
||||
printf("%s %s", wrap, pinputFile->filename);
|
||||
if (numDeps < MAX_DEPS) {
|
||||
depHashes[numDeps++] = hash;
|
||||
}
|
||||
else {
|
||||
fprintf(stderr, "msi: More than %d dependencies!\n", MAX_DEPS);
|
||||
depHashes[0] = hash;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pinputFile->fp = fp;
|
||||
ellInsert(&pinputData->inputFileList,0,&pinputFile->node);
|
||||
}
|
||||
|
||||
@@ -22,6 +22,6 @@ TARGETS += $(TARGETS_$(BUILD_CLASS))
|
||||
|
||||
include $(TOP)/configure/RULES
|
||||
|
||||
msi-copy$(EXE): $(INSTALL_BIN)/msi$(EXE) ../Makefile
|
||||
msi-copy$(EXE): $(INSTALL_BIN)/msi$(EXE)
|
||||
@$(RM) $@
|
||||
$(CP) $< $@
|
||||
|
||||
@@ -11,23 +11,40 @@
|
||||
use strict;
|
||||
use Test;
|
||||
|
||||
BEGIN {plan tests => 7}
|
||||
BEGIN {plan tests => 9}
|
||||
|
||||
# Check include/substitute command model
|
||||
ok(msi('-I .. ../t1-template.txt'), slurp('../t1-result.txt'));
|
||||
ok(msi('-I.. -S ../t2-substitution.txt'), slurp('../t2-result.txt'));
|
||||
ok(msi('-I. -I.. -S ../t3-substitution.txt'), slurp('../t3-result.txt'));
|
||||
ok(msi('-g -I.. -S ../t4-substitution.txt'), slurp('../t4-result.txt'));
|
||||
ok(msi('-S ../t5-substitute.txt ../t5-template.txt'), slurp('../t5-result.txt'));
|
||||
ok(msi('-S ../t6-substitute.txt ../t6-template.txt'), slurp('../t6-result.txt'));
|
||||
|
||||
# Check -o works
|
||||
# Substitution file, dbLoadTemplate format
|
||||
ok(msi('-I.. -S ../t2-substitution.txt'), slurp('../t2-result.txt'));
|
||||
|
||||
# Macro scoping
|
||||
ok(msi('-I. -I.. -S ../t3-substitution.txt'), slurp('../t3-result.txt'));
|
||||
|
||||
# Global scope (backwards compatibility check)
|
||||
ok(msi('-g -I.. -S ../t4-substitution.txt'), slurp('../t4-result.txt'));
|
||||
|
||||
# Substitution file, regular format
|
||||
ok(msi('-S ../t5-substitute.txt ../t5-template.txt'), slurp('../t5-result.txt'));
|
||||
|
||||
# Substitution file, pattern format
|
||||
ok(msi('-S../t6-substitute.txt ../t6-template.txt'), slurp('../t6-result.txt'));
|
||||
|
||||
# Output option -o
|
||||
my $out = 't7-output.txt';
|
||||
unlink $out;
|
||||
msi("-I.. -o $out ../t1-template.txt");
|
||||
ok(slurp($out), slurp('../t1-result.txt'));
|
||||
|
||||
# Dependency generation, include/substitute model
|
||||
ok(msi('-I.. -D -o t8.txt ../t1-template.txt'), slurp('../t8-result.txt'));
|
||||
|
||||
# Support routines
|
||||
# Dependency generation, dbLoadTemplate format
|
||||
ok(msi('-I.. -D -ot9.txt -S ../t2-substitution.txt'), slurp('../t9-result.txt'));
|
||||
|
||||
|
||||
# Test support routines
|
||||
|
||||
sub slurp {
|
||||
my ($file) = @_;
|
||||
|
||||
2
src/ioc/dbtemplate/test/t8-result.txt
Normal file
2
src/ioc/dbtemplate/test/t8-result.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
t8.txt: ../t1-template.txt \
|
||||
../t1-include.txt
|
||||
1
src/ioc/dbtemplate/test/t9-result.txt
Normal file
1
src/ioc/dbtemplate/test/t9-result.txt
Normal file
@@ -0,0 +1 @@
|
||||
t9.txt: ../t2-template.txt
|
||||
Reference in New Issue
Block a user