B<afs_compile_et> [B<-debug>] S<<< [B<-language> <I<lang>>] >>>
S<<< [B<-prefix> <I<prefix>>] >>> S<<< [B<-v> <I<version>>] >>>
- S<<< [B<-h> <I<include>>] >>> <I<error_table>>
+ S<<< [B<-h> <I<include>>] >>> <S<<< [B<-emit> <I<output>>] >>>
+ I<error_table>>
=for html
</div>
directory or in the directory specified with B<-prefix> and should be
named F<error_table.et>.
+By default, B<afs_compile_et> generates two files in one invocation. This is
+problematic for parallel build systems. The B<-emit> option may be used to
+generate the output files independently with two separate invocations of
+B<afs_compile_et> for a given error table. This allows parallel build systems
+to generate the source and header files, and the targets which depend on the
+generated source and headers files, in parallel.
+
=head1 CAUTIONS
This command is used internally within the build process for OpenAFS.
Specified the type of output file: valid values are 1 (the default, for C
files) or 2, for B<.msf> file generation.
+=item B<-emit> <I<output>>
+
+Specifies which program file to generate; the header file or the source file.
+Specify B<-emit header> (or B<-emit h>) to generate the F<.h> header file.
+Specify B<-emit source> (or B<-emit c>) to generate the F<.c> (or F<.msf>)
+source file.
+
=back
=head1 EXAMPLES
% afs_compile_et -p path/to/src/ptserver -lang 'k&r-c' pterror
+The following command generates the F<pterror.h> file, but not the F<pterror.c>
+file.
+
+ % afs_compile_et -p path/to/src/ptserver -emit header pterror
+
+The following command generates the F<pterror.c> file, but not the F<pterror.h>
+file.
+
+ % afs_compile_et -p path/to/src/ptserver -emit source pterror
+
=head1 SEE ALSO
L<translate_et(1)>
extern int table_number, current;
char buffer[BUFSIZ];
char *table_name = NULL;
-FILE *hfile, *cfile, *msfile;
+FILE *hfile = NULL, *cfile = NULL, *msfile = NULL;
int version = 1;
int use_msf = 0;
+int emit_source = 0;
+int emit_header = 0;
/* lex stuff */
extern FILE *yyin;
0,
};
+static const char *const emit_args[] = {
+ "e",
+ "emit",
+ 0,
+};
+
static const char *const language_names[] = {
"C",
"K&R C",
usage(void)
{
fprintf(stderr,
- "%s: usage: %s ERROR_TABLE [-debug] [-language LANG] [-h INCLUDE] [-p prefix] [-v version]\n",
+ "%s: usage: %s ERROR_TABLE [-debug] [-language LANG] [-h INCLUDE] [-p PREFIX] [-v VERSION] [-emit source|header]\n",
whoami, whoami);
exit(1);
}
int got_language = 0;
char *got_include = 0;
char *got_prefix = ".";
+ int got_emit = 0;
char lcname[6];
#ifdef AFS_AIX32_ENV
}
if (version == 2)
use_msf = 1;
+ } else if (check_arg(emit_args, arg)) {
+ arg = *++argv;
+ argc--;
+ got_emit = 1;
+ if (!strcasecmp(arg, "source")) {
+ emit_source = 1;
+ } else if (!strcasecmp(arg, "c")) {
+ emit_source = 1;
+ } else if (!strcasecmp(arg, "header")) {
+ emit_header = 1;
+ } else if (!strcasecmp(arg, "h")) {
+ emit_header = 1;
+ } else {
+ fprintf(stderr, "%s: unknown emit argument - `%s'\n",
+ whoami, arg);
+ usage();
+ exit(1);
+ }
} else {
fprintf(stderr, "%s: unknown control argument -`%s'\n",
whoami, arg);
exit(1);
}
+ if (!got_emit) {
+ emit_source = emit_header = 1; /* generate both by default */
+ }
p = strrchr(filename, '/');
if (p == NULL)
*p = 0;
}
- if (use_msf) {
- sprintf(msf_file, "%s.msf", ename);
- } else {
- sprintf(c_file, "%s.c", ename);
+ if (emit_source) {
+ if (use_msf) {
+ sprintf(msf_file, "%s.msf", ename);
+ } else {
+ sprintf(c_file, "%s.c", ename);
+ }
}
- if (got_include) {
- sprintf(h_file, "%s.h", got_include);
- } else {
- sprintf(h_file, "%s.h", ename);
+ if (emit_header) {
+ if (got_include) {
+ sprintf(h_file, "%s.h", got_include);
+ } else {
+ sprintf(h_file, "%s.h", ename);
+ }
}
p = strrchr(filename, '.');
if (p == NULL) {
yyout = stdout;
}
- hfile = fopen(h_file, "w");
- if (hfile == NULL) {
- perror(h_file);
- exit(1);
+ if (emit_header) {
+ hfile = fopen(h_file, "w");
+ if (hfile == NULL) {
+ perror(h_file);
+ exit(1);
+ }
+ fprintf(hfile, warning, h_file);
}
- fprintf(hfile, warning, h_file);
- if (got_include) {
+ if (emit_header && got_include) {
char buffer[BUFSIZ];
char prolog_h_file[MAXPATHLEN];
FILE *prolog_hfile;
}
}
- if (use_msf) {
+ if (emit_source && use_msf) {
msfile = fopen(msf_file, "w");
if (msfile == NULL) {
perror(msf_file);
exit(1);
}
fprintf(msfile, msf_warning, msf_file);
- } else {
+ } else if (emit_source) {
cfile = fopen(c_file, "w");
if (cfile == NULL) {
perror(c_file);
fclose(yyin); /* bye bye input file */
if (!use_msf) {
- fputs(" 0\n};\n\n", cfile);
- fprintf(cfile,
- "static const struct error_table et = { text, %ldL, %d };\n\n",
- (long int)table_number, current);
- fputs("static struct et_list etlink = { 0, &et};\n\n", cfile);
- fprintf(cfile, "void initialize_%s_error_table(void) {\n",
- table_name);
- fputs(" afs_add_to_error_table(&etlink);\n", cfile);
- fputs("}\n", cfile);
- fclose(cfile);
-
-
- fprintf(hfile, "extern void initialize_%s_error_table(void);\n",
- table_name);
+ if (cfile) {
+ fputs(" 0\n};\n\n", cfile);
+ fprintf(cfile,
+ "static const struct error_table et = { text, %ldL, %d };\n\n",
+ (long int)table_number, current);
+ fputs("static struct et_list etlink = { 0, &et};\n\n", cfile);
+ fprintf(cfile, "void initialize_%s_error_table(void) {\n",
+ table_name);
+ fputs(" afs_add_to_error_table(&etlink);\n", cfile);
+ fputs("}\n", cfile);
+ fclose(cfile);
+ }
+ if (hfile) {
+ fprintf(hfile, "extern void initialize_%s_error_table(void);\n",
+ table_name);
+ }
} else {
- fprintf(hfile, "#define initialize_%s_error_table(void)\n",
- table_name);
+ if (hfile) {
+ fprintf(hfile, "#define initialize_%s_error_table(void)\n",
+ table_name);
+ }
}
- fprintf(hfile, "#define ERROR_TABLE_BASE_%s (%ldL)\n", table_name,
- (long int)table_number);
- /* compatibility... */
- fprintf(hfile, "\n/* for compatibility with older versions... */\n");
- fprintf(hfile, "#define init_%s_err_tbl initialize_%s_error_table\n",
- table_name, table_name);
- fprintf(hfile, "#define %s_err_base ERROR_TABLE_BASE_%s\n", table_name,
- table_name);
- fprintf(hfile, "\n/* for compatibility with other users... */\n");
- lcstring(lcname, table_name, sizeof(lcname));
- fprintf(hfile, "#define ERROR_TABLE_BASE_%s (%ldL)\n", lcname,
- (long int)table_number);
- fprintf(hfile, "#define init_%s_err_tbl initialize_%s_error_table\n",
- lcname, table_name);
- fprintf(hfile,
- "#define initialize_%s_error_table initialize_%s_error_table\n",
- lcname, table_name);
- fprintf(hfile, "#define %s_err_base ERROR_TABLE_BASE_%s\n", lcname,
- lcname);
- fclose(hfile); /* bye bye include file */
- if (use_msf)
+ if (hfile) {
+ fprintf(hfile, "#define ERROR_TABLE_BASE_%s (%ldL)\n", table_name,
+ (long int)table_number);
+ /* compatibility... */
+ fprintf(hfile, "\n/* for compatibility with older versions... */\n");
+ fprintf(hfile, "#define init_%s_err_tbl initialize_%s_error_table\n",
+ table_name, table_name);
+ fprintf(hfile, "#define %s_err_base ERROR_TABLE_BASE_%s\n",
+ table_name, table_name);
+ fprintf(hfile, "\n/* for compatibility with other users... */\n");
+ lcstring(lcname, table_name, sizeof(lcname));
+ fprintf(hfile, "#define ERROR_TABLE_BASE_%s (%ldL)\n", lcname,
+ (long int)table_number);
+ fprintf(hfile, "#define init_%s_err_tbl initialize_%s_error_table\n",
+ lcname, table_name);
+ fprintf(hfile,
+ "#define initialize_%s_error_table initialize_%s_error_table\n",
+ lcname, table_name);
+ fprintf(hfile, "#define %s_err_base ERROR_TABLE_BASE_%s\n", lcname,
+ lcname);
+ fclose(hfile); /* bye bye include file */
+ }
+ if (msfile)
fclose(msfile);
return 0;
}