save
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
@c %**start of header
|
@c %**start of header
|
||||||
@setfilename yait.info
|
@setfilename yait.info
|
||||||
@include version.texi
|
@include version.texi
|
||||||
@settitle VX yait @value{VERSION}
|
@settitle GCK yait @value{VERSION}
|
||||||
|
|
||||||
@c Define a new index for options.
|
@c Define a new index for options.
|
||||||
@defcodeindex op
|
@defcodeindex op
|
||||||
@@ -12,10 +12,10 @@
|
|||||||
@c %**end of header
|
@c %**end of header
|
||||||
|
|
||||||
@copying
|
@copying
|
||||||
This manual is for VX yait (version @value{VERSION}, @value{UPDATED}),
|
This manual is for GCK yait (version @value{VERSION}, @value{UPDATED}),
|
||||||
which generates an optionated C project.
|
which generates an optionated C project.
|
||||||
|
|
||||||
Copyright @copyright{} 2025 VX.
|
Copyright @copyright{} 2025 GCK.
|
||||||
|
|
||||||
@quotation
|
@quotation
|
||||||
Copying and distribution of this file, with or without modification,
|
Copying and distribution of this file, with or without modification,
|
||||||
@@ -25,7 +25,7 @@ notice and this notice are preserved.
|
|||||||
@end copying
|
@end copying
|
||||||
|
|
||||||
@titlepage
|
@titlepage
|
||||||
@title VX yait
|
@title GCK yait
|
||||||
@subtitle for version @value{VERSION}, @value{UPDATED}
|
@subtitle for version @value{VERSION}, @value{UPDATED}
|
||||||
@page
|
@page
|
||||||
@vskip 0pt plus 1filll
|
@vskip 0pt plus 1filll
|
||||||
@@ -39,7 +39,7 @@ notice and this notice are preserved.
|
|||||||
@node Top
|
@node Top
|
||||||
@top GNU Hello
|
@top GNU Hello
|
||||||
|
|
||||||
This manual is for VX yait (version @value{VERSION}, @value{UPDATED}),
|
This manual is for GCK yait (version @value{VERSION}, @value{UPDATED}),
|
||||||
which generates an optionated C project.
|
which generates an optionated C project.
|
||||||
@end ifnottex
|
@end ifnottex
|
||||||
|
|
||||||
|
|||||||
233
src/yait.c
233
src/yait.c
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) vx-clutch
|
/* Copyright (C) GCK
|
||||||
*
|
*
|
||||||
* This file is part of yait
|
* This file is part of yait
|
||||||
*
|
*
|
||||||
@@ -18,6 +18,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "../config.h"
|
#include "../config.h"
|
||||||
#include "../lib/err.h"
|
#include "../lib/err.h"
|
||||||
@@ -83,7 +84,7 @@ sysuser: {
|
|||||||
if (pw && pw->pw_name)
|
if (pw && pw->pw_name)
|
||||||
return str_dup(pw->pw_name);
|
return str_dup(pw->pw_name);
|
||||||
}
|
}
|
||||||
return "author";
|
return str_dup("author");
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
@@ -97,14 +98,21 @@ int main(int argc, char **argv)
|
|||||||
bool quiet = false;
|
bool quiet = false;
|
||||||
bool force = false;
|
bool force = false;
|
||||||
bool editor = false;
|
bool editor = false;
|
||||||
const char *author = get_name();
|
char *author = get_name();
|
||||||
licence_t licence;
|
licence_t licence = BSD;
|
||||||
|
|
||||||
parse_standard_options(argc, argv, print_help, print_version);
|
parse_standard_options(argc, argv, print_help, print_version);
|
||||||
|
|
||||||
while ((optc = getopt_long(argc, argv, "a:l:Eqf", longopts, NULL)) !=
|
while ((optc = getopt_long(argc, argv, "a:l:Eqf", longopts, NULL)) !=
|
||||||
-1)
|
-1)
|
||||||
switch (optc) {
|
switch (optc) {
|
||||||
|
case 'a':
|
||||||
|
if (optarg) {
|
||||||
|
if (author)
|
||||||
|
free(author);
|
||||||
|
author = str_dup(optarg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
if (!strcmp(optarg, "list")) {
|
if (!strcmp(optarg, "list")) {
|
||||||
puts("BSD\nGPL\nMIT\nUNL");
|
puts("BSD\nGPL\nMIT\nUNL");
|
||||||
@@ -156,6 +164,192 @@ int main(int argc, char **argv)
|
|||||||
pdir[len] = '/';
|
pdir[len] = '/';
|
||||||
pdir[len + 1] = '\0';
|
pdir[len + 1] = '\0';
|
||||||
|
|
||||||
|
fs_new(pdir);
|
||||||
|
if (chdir(pdir))
|
||||||
|
fatalfa(errno);
|
||||||
|
|
||||||
|
fs_write("doc/version.texi", "\
|
||||||
|
@set UPDATED %s\
|
||||||
|
@set UPDATED-MONTH %s\
|
||||||
|
@set EDITION 1\
|
||||||
|
@set VERSION alpha\
|
||||||
|
",
|
||||||
|
"1 January 1970", "January 2025");
|
||||||
|
|
||||||
|
char path[BUFSIZ];
|
||||||
|
snprintf(path, sizeof(path), "doc/%s.texi", package);
|
||||||
|
fs_write(path, "\
|
||||||
|
\\input texinfo @c -*-texinfo-*-\n\
|
||||||
|
@c %**start of header\n\
|
||||||
|
@setfilename foo.info\n\
|
||||||
|
@include version.texi\n\
|
||||||
|
@settitle %s foo @value{VERSION}\n\
|
||||||
|
\n\
|
||||||
|
@defcodeindex op\n\
|
||||||
|
@syncodeindex op cp\n\
|
||||||
|
@c %**end of header\n\
|
||||||
|
\n\
|
||||||
|
@copying\n\
|
||||||
|
This manual is for %s foo (version @value{VERSION}, @value{UPDATED}),\n\
|
||||||
|
a simple program for demonstrating Texinfo documentation.\n\
|
||||||
|
\n\
|
||||||
|
Copyright @copyright{} 2025 VX.\n\
|
||||||
|
\n\
|
||||||
|
@quotation\n\
|
||||||
|
Copying and distribution of this file, with or without modification,\n\
|
||||||
|
are permitted in any medium without royalty provided the copyright\n\
|
||||||
|
notice and this notice are preserved.\n\
|
||||||
|
@end quotation\n\
|
||||||
|
@end copying\n\
|
||||||
|
\n\
|
||||||
|
@titlepage\n\
|
||||||
|
@title %s foo\n\
|
||||||
|
@subtitle for version @value{VERSION}, @value{UPDATED}\n\
|
||||||
|
@page\n\
|
||||||
|
@vskip 0pt plus 1filll\n\
|
||||||
|
@insertcopying\n\
|
||||||
|
@end titlepage\n\
|
||||||
|
\n\
|
||||||
|
@contents\n\
|
||||||
|
\n\
|
||||||
|
@ifnottex\n\
|
||||||
|
@node Top\n\
|
||||||
|
@top %s foo\n\
|
||||||
|
\n\
|
||||||
|
This manual is for %s foo (version @value{VERSION}, @value{UPDATED}),\n\
|
||||||
|
a simple program for demonstrating Texinfo documentation.\n\
|
||||||
|
@end ifnottex\n\
|
||||||
|
\n\
|
||||||
|
@menu\n\
|
||||||
|
* Overview:: General overview and purpose.\n\
|
||||||
|
* Sample output:: Example usage and output.\n\
|
||||||
|
* Invoking foo:: How to run @command{foo}.\n\
|
||||||
|
* Reporting bugs:: Sending bug reports and suggestions.\n\
|
||||||
|
* Concept index:: Index of concepts.\n\
|
||||||
|
@end menu\n\
|
||||||
|
\n\
|
||||||
|
\n\
|
||||||
|
@node Overview\n\
|
||||||
|
@chapter Overview\n\
|
||||||
|
\n\
|
||||||
|
@cindex overview\n\
|
||||||
|
@cindex purpose\n\
|
||||||
|
\n\
|
||||||
|
The %s @command{foo} program serves as a minimal example of a %s utility.\n\
|
||||||
|
Its purpose is to show how to build and document small command-line tools\n\
|
||||||
|
that follow GNU-style conventions.\n\
|
||||||
|
\n\
|
||||||
|
@itemize @bullet\n\
|
||||||
|
@item\n\
|
||||||
|
Implements clean command-line option parsing using GNU-style long options.\n\
|
||||||
|
@item\n\
|
||||||
|
Provides simple, predictable behavior for testing build systems.\n\
|
||||||
|
@item\n\
|
||||||
|
Demonstrates how to write Texinfo manuals for %s programs.\n\
|
||||||
|
@end itemize\n\
|
||||||
|
\n\
|
||||||
|
@cindex implementation\n\
|
||||||
|
%s foo is implemented in C and follows the GNU coding and maintainer standards.\n\
|
||||||
|
It uses Autotools for configuration and build setup, and Texinfo for documentation.\n\
|
||||||
|
\n\
|
||||||
|
\n\
|
||||||
|
@node Sample output\n\
|
||||||
|
@chapter Sample output\n\
|
||||||
|
\n\
|
||||||
|
@cindex examples\n\
|
||||||
|
@cindex sample output\n\
|
||||||
|
\n\
|
||||||
|
Here are some examples of running %s foo:\n\
|
||||||
|
\n\
|
||||||
|
@example\n\
|
||||||
|
$ foo\n\
|
||||||
|
foo: hello, world!\n\
|
||||||
|
@end example\n\
|
||||||
|
\n\
|
||||||
|
@example\n\
|
||||||
|
$ foo --message=\"VX rules!\"\n\
|
||||||
|
foo: VX rules!\n\
|
||||||
|
@end example\n\
|
||||||
|
\n\
|
||||||
|
@example\n\
|
||||||
|
$ foo --version\n\
|
||||||
|
VX foo @value{VERSION}\n\
|
||||||
|
@end example\n\
|
||||||
|
\n\
|
||||||
|
\n\
|
||||||
|
@node Invoking foo\n\
|
||||||
|
@chapter Invoking @command{foo}\n\
|
||||||
|
\n\
|
||||||
|
@cindex invoking\n\
|
||||||
|
@cindex usage\n\
|
||||||
|
@cindex options\n\
|
||||||
|
\n\
|
||||||
|
The general form for running @command{foo} is:\n\
|
||||||
|
\n\
|
||||||
|
@example\n\
|
||||||
|
foo @var{option} @dots{}\n\
|
||||||
|
@end example\n\
|
||||||
|
\n\
|
||||||
|
With no options, @command{foo} prints a default message.\n\
|
||||||
|
\n\
|
||||||
|
@command{foo} supports the following options:\n\
|
||||||
|
\n\
|
||||||
|
@table @option\n\
|
||||||
|
@item --message=@var{text}\n\
|
||||||
|
@itemx -m @var{text}\n\
|
||||||
|
@opindex --message\n\
|
||||||
|
@opindex -m\n\
|
||||||
|
Print @var{text} instead of the default greeting.\n\
|
||||||
|
\n\
|
||||||
|
@item --help\n\
|
||||||
|
@itemx -h\n\
|
||||||
|
@opindex --help\n\
|
||||||
|
@opindex -h\n\
|
||||||
|
Display help text and exit successfully.\n\
|
||||||
|
\n\
|
||||||
|
@item --version\n\
|
||||||
|
@itemx -v\n\
|
||||||
|
@opindex --version\n\
|
||||||
|
@opindex -v\n\
|
||||||
|
Print the version number and licensing information, then exit.\n\
|
||||||
|
@end table\n\
|
||||||
|
\n\
|
||||||
|
\n\
|
||||||
|
@node Reporting bugs\n\
|
||||||
|
@chapter Reporting bugs\n\
|
||||||
|
\n\
|
||||||
|
@cindex bugs\n\
|
||||||
|
@cindex reporting\n\
|
||||||
|
@cindex contact\n\
|
||||||
|
\n\
|
||||||
|
When reporting bugs, include:\n\
|
||||||
|
@itemize @bullet\n\
|
||||||
|
@item The output of @samp{foo --version}.\n\
|
||||||
|
@item Your operating system and compiler version.\n\
|
||||||
|
@item The exact command line used.\n\
|
||||||
|
@item Any relevant output or error messages.\n\
|
||||||
|
@end itemize\n\
|
||||||
|
\n\
|
||||||
|
Patches are welcome, preferably made with @samp{diff -u} and including\n\
|
||||||
|
a @file{ChangeLog} entry.\n\
|
||||||
|
\n\
|
||||||
|
\n\
|
||||||
|
@node GNU Free Documentation License\n\
|
||||||
|
@appendix GNU Free Documentation License\n\
|
||||||
|
\n\
|
||||||
|
@include fdl.texi\n\
|
||||||
|
\n\
|
||||||
|
\n\
|
||||||
|
@node Concept index\n\
|
||||||
|
@unnumbered Concept index\n\
|
||||||
|
\n\
|
||||||
|
@printindex cp\n\
|
||||||
|
\n\
|
||||||
|
@bye\
|
||||||
|
",
|
||||||
|
author, author, author, author, author, author, author, author,
|
||||||
|
author, author);
|
||||||
|
|
||||||
fs_write("README", "\
|
fs_write("README", "\
|
||||||
This is the README for the GCK %s distribution.\n\
|
This is the README for the GCK %s distribution.\n\
|
||||||
%s does a thing.\n\
|
%s does a thing.\n\
|
||||||
@@ -289,8 +483,8 @@ See also the AUTHORS file.\n\
|
|||||||
#define VERSION \"beta\"\n\
|
#define VERSION \"beta\"\n\
|
||||||
#define YEAR %d\n\
|
#define YEAR %d\n\
|
||||||
\n\
|
\n\
|
||||||
#endif\n\
|
#endif\
|
||||||
",
|
",
|
||||||
package, YEAR);
|
package, YEAR);
|
||||||
|
|
||||||
fs_write("configure", "\
|
fs_write("configure", "\
|
||||||
@@ -327,7 +521,7 @@ trycc gcc\n\
|
|||||||
trycc clang\n\
|
trycc clang\n\
|
||||||
trycc cc\n\
|
trycc cc\n\
|
||||||
trycc icx\n\
|
trycc icx\n\
|
||||||
printf \"%s\n\" \"$CC\"\n\
|
printf \"%%s\n\" \"$CC\"\n\
|
||||||
\n\
|
\n\
|
||||||
DEBUG=false\n\
|
DEBUG=false\n\
|
||||||
for arg; do\n\
|
for arg; do\n\
|
||||||
@@ -338,7 +532,7 @@ case \"$arg\" in\n\
|
|||||||
CFLAGS=*) CFLAGS=${arg#*=} ;;\n\
|
CFLAGS=*) CFLAGS=${arg#*=} ;;\n\
|
||||||
LDFLAGS=*) LDFLAGS=${arg#*=} ;;\n\
|
LDFLAGS=*) LDFLAGS=${arg#*=} ;;\n\
|
||||||
CC=*) CC=${arg#*=} ;;\n\
|
CC=*) CC=${arg#*=} ;;\n\
|
||||||
*) printf \"Unrecognized option %s\n\" \"$arg\" ;;\n\
|
*) printf \"Unrecognized option %%s\n\" \"$arg\" ;;\n\
|
||||||
esac\n\
|
esac\n\
|
||||||
done\n\
|
done\n\
|
||||||
\n\
|
\n\
|
||||||
@@ -355,10 +549,10 @@ fi\n\
|
|||||||
GDEBUGCFLAGS=\"-std=c23 -O0 -g3 -Wall -Wextra -Wpedantic -Werror -Wshadow -Wdouble-promotion -Wformat=2 -Wnull-dereference -Wconversion -Wsign-conversion -Wcast-qual -Wcast-align=strict -Wpointer-arith -Wstrict-overflow=5 -Wstrict-aliasing=2 -Wundef -Wunreachable-code -Wswitch-enum -fanalyzer -fsanitize=undefined,address -fstack-protector-strong -D_FORTIFY_SOURCE=3\"\n\
|
GDEBUGCFLAGS=\"-std=c23 -O0 -g3 -Wall -Wextra -Wpedantic -Werror -Wshadow -Wdouble-promotion -Wformat=2 -Wnull-dereference -Wconversion -Wsign-conversion -Wcast-qual -Wcast-align=strict -Wpointer-arith -Wstrict-overflow=5 -Wstrict-aliasing=2 -Wundef -Wunreachable-code -Wswitch-enum -fanalyzer -fsanitize=undefined,address -fstack-protector-strong -D_FORTIFY_SOURCE=3\"\n\
|
||||||
CDEBUGCFLAGS=\"-std=gnu2x -O0 -g3 -Wall -Wextra -Wpedantic -Werror -Wshadow -Wdouble-promotion -Wformat=2 -Wnull-dereference -Wconversion -Wsign-conversion -Wcast-qual -Wcast-align=strict -Wpointer-arith -Wstrict-overflow=5 -Wstrict-aliasing=2 -Wundef -Wunreachable-code -Wswitch-enum -fanalyzer -fsanitize=undefined,address -fstack-protector-strong -D_FORTIFY_SOURCE=3\"\n\
|
CDEBUGCFLAGS=\"-std=gnu2x -O0 -g3 -Wall -Wextra -Wpedantic -Werror -Wshadow -Wdouble-promotion -Wformat=2 -Wnull-dereference -Wconversion -Wsign-conversion -Wcast-qual -Wcast-align=strict -Wpointer-arith -Wstrict-overflow=5 -Wstrict-aliasing=2 -Wundef -Wunreachable-code -Wswitch-enum -fanalyzer -fsanitize=undefined,address -fstack-protector-strong -D_FORTIFY_SOURCE=3\"\n\
|
||||||
\n\
|
\n\
|
||||||
if [ -z \"$DEBUG\" ]; then\n\
|
if [ \"$DEBUG\" = \"false\" ]; then\n\
|
||||||
case \"$CC\" in\n\
|
case \"$CC\" in\n\
|
||||||
gcc) CFLAGS=\"$GDEBUGFLAGS\";;\n\
|
gcc) CFLAGS=\"$GDEBUGCFLAGS\";;\n\
|
||||||
clang) CFLAGS=\"$CDEBUGFLAGS\";;\n\
|
clang) CFLAGS=\"$CDEBUGCFLAGS\";;\n\
|
||||||
*) ;;\n\
|
*) ;;\n\
|
||||||
esac\n\
|
esac\n\
|
||||||
else\n\
|
else\n\
|
||||||
@@ -383,7 +577,7 @@ printf \"CFLAGS=%%s\n\" \"$CFLAGS\"\n\
|
|||||||
printf \"LDFLAGS=%%s\n\" \"$LDFLAGS\"\n\
|
printf \"LDFLAGS=%%s\n\" \"$LDFLAGS\"\n\
|
||||||
printf \"CC=%%s\n\" \"$CC\"\n\
|
printf \"CC=%%s\n\" \"$CC\"\n\
|
||||||
} > config.mak\n\
|
} > config.mak\n\
|
||||||
printf \"done\n\"\n\
|
printf \"done\n\"\
|
||||||
");
|
");
|
||||||
|
|
||||||
fs_write("Makefile", "\
|
fs_write("Makefile", "\
|
||||||
@@ -440,17 +634,10 @@ distclean: clean\n\
|
|||||||
release: clean all\n\
|
release: clean all\n\
|
||||||
tar -czf $(TARBALL) $(RELEASE_FILES)\n\
|
tar -czf $(TARBALL) $(RELEASE_FILES)\n\
|
||||||
\n\
|
\n\
|
||||||
.PHONY: all clean distclean install uninstall build release\n\
|
.PHONY: all clean distclean install uninstall build release\
|
||||||
",
|
",
|
||||||
package);
|
package);
|
||||||
|
|
||||||
char *cwd = getcwd(NULL, 0);
|
|
||||||
if (cwd == NULL)
|
|
||||||
fatalfa(errno);
|
|
||||||
if (!quiet)
|
|
||||||
fprintf(stderr, "Created %s at\n %s\n", package, cwd);
|
|
||||||
free(cwd);
|
|
||||||
|
|
||||||
return exit_status;
|
return exit_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -458,12 +645,12 @@ static void print_help()
|
|||||||
{
|
{
|
||||||
printf("Usage: %s [OPTION]... [project-name]...\n", PROGRAM);
|
printf("Usage: %s [OPTION]... [project-name]...\n", PROGRAM);
|
||||||
fputs("\
|
fputs("\
|
||||||
Generates an optionated C project.\n",
|
Generates an opinionated C project.\n",
|
||||||
stdout);
|
stdout);
|
||||||
puts("");
|
puts("");
|
||||||
fputs("\
|
fputs("\
|
||||||
--help display this help and exit\n\
|
--help display this help and exit\n\
|
||||||
--version display version information and eixt\n",
|
--version display version information and exit\n",
|
||||||
stdout);
|
stdout);
|
||||||
puts("");
|
puts("");
|
||||||
fputs("\
|
fputs("\
|
||||||
@@ -483,6 +670,6 @@ static void print_version()
|
|||||||
printf("Copyright (C) %d GCK.\n", YEAR);
|
printf("Copyright (C) %d GCK.\n", YEAR);
|
||||||
|
|
||||||
puts("This is free software: you are free to change and redistribute it.");
|
puts("This is free software: you are free to change and redistribute it.");
|
||||||
puts("There is NO WARRNTY, to the extent permitted by law.");
|
puts("There is NO WARRANTY, to the extent permitted by law.");
|
||||||
exit(exit_status);
|
exit(exit_status);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user