save
This commit is contained in:
7
Makefile
7
Makefile
@@ -22,10 +22,9 @@ build:
|
|||||||
c-out/obj/%.o: yait/%.c
|
c-out/obj/%.o: yait/%.c
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
$(YAIT): $(YAIT_OBJS)
|
$(YAIT): $(YAIT_OBJS) $(EMBED_HEADER)
|
||||||
$(CC) $(CFLAGS) -DCOMMIT=$(shell git rev-list --count --all) $^ -o $@
|
$(CC) $(CFLAGS) -DCOMMIT=$(shell git rev-list --count --all) $^ -o $@
|
||||||
|
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
install:
|
install:
|
||||||
@@ -38,8 +37,10 @@ uninstall:
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf c-out
|
rm -rf c-out
|
||||||
|
rm -f $(EMBED_HEADER)
|
||||||
|
rm -f $(EMBED_HEADERS)
|
||||||
|
|
||||||
dist-clean: clean
|
dist-clean: clean
|
||||||
rm -f config.mak
|
rm -f config.mak
|
||||||
|
|
||||||
.PHONY: all clean dist-clean install uninstall build format
|
.PHONY: all clean dist-clean install uninstall build format gen-file-embeds
|
||||||
|
|||||||
6
README
6
README
@@ -6,8 +6,4 @@ project files needed for your new C ( maybe C++ ) project. It provides you with
|
|||||||
a build system and some basic source files to give you a kick start on your new
|
a build system and some basic source files to give you a kick start on your new
|
||||||
project--with optional libraries!
|
project--with optional libraries!
|
||||||
|
|
||||||
The future of this project may be uncertain--however there are a few features I
|
For more detailed documentation vist: <https://vx-clutch.github.io/vxserver.dev/docs/yait.html>
|
||||||
for sure want to have.
|
|
||||||
|
|
||||||
A --GNU flag that will add basic flag parsing into the project for the
|
|
||||||
--version and --help flags.
|
|
||||||
|
|||||||
4
config.mak
Normal file
4
config.mak
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
PREFIX=/usr/bin/
|
||||||
|
CFLAGS=-Wall -Wextra -O2
|
||||||
|
LDFLAGS=
|
||||||
|
CC=gcc
|
||||||
3
configure
vendored
3
configure
vendored
@@ -37,6 +37,9 @@ trycc cc
|
|||||||
trycc clang
|
trycc clang
|
||||||
printf "%s\n" "$CC"
|
printf "%s\n" "$CC"
|
||||||
|
|
||||||
|
printf "checking for xxd... "
|
||||||
|
trycc xxd
|
||||||
|
|
||||||
printf "checking weather C compiler works... "
|
printf "checking weather C compiler works... "
|
||||||
status="fail"
|
status="fail"
|
||||||
tmpc="$(mktemp -d)/test.c"
|
tmpc="$(mktemp -d)/test.c"
|
||||||
|
|||||||
58
embed/Makefile
Normal file
58
embed/Makefile
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
prefix = /usr/bin
|
||||||
|
|
||||||
|
YAIT_SRCS := $(wildcard yait/*.c) $(wildcard core/*.c)
|
||||||
|
YAIT_OBJS := $(patsubst yait/%.c,c-out/obj/%.o,$(YAIT_SRCS))
|
||||||
|
|
||||||
|
YAIT := c-out/bin/yait
|
||||||
|
|
||||||
|
-include config.mak
|
||||||
|
|
||||||
|
ifeq ($(wildcard config.mak),)
|
||||||
|
all:
|
||||||
|
@echo "File config.mak not found, run configure"
|
||||||
|
@exit 1
|
||||||
|
else
|
||||||
|
|
||||||
|
all: build $(YAIT) $(YAIT_DOC)
|
||||||
|
|
||||||
|
build:
|
||||||
|
mkdir -p c-out/bin
|
||||||
|
mkdir -p c-out/obj
|
||||||
|
|
||||||
|
EMBED_FILES := $(wildcard embed/*)
|
||||||
|
gen-file-embeds:
|
||||||
|
@echo "// Generated header with embedded files" > $(EMBED_HEADER)
|
||||||
|
@echo "#ifndef EMBEDDED_FILES_H" >> $(EMBED_HEADER)
|
||||||
|
@echo "#define EMBEDDED_FILES_H" >> $(EMBED_HEADER)
|
||||||
|
@echo "" >> $(EMBED_HEADER)
|
||||||
|
@for f in $(EMBED_FILES); do \
|
||||||
|
var=$$(echo $$f | tr './-' '__' | tr '[:lower:]' '[:upper:]'); \
|
||||||
|
xxd -i $$f | sed "s/^unsigned char/${var}_data/" | sed "s/^unsigned int/${var}_len/" >> $(EMBED_HEADER); \
|
||||||
|
echo "" >> $(EMBED_HEADER); \
|
||||||
|
done
|
||||||
|
@echo "#endif // EMBEDDED_FILES_H" >> $(EMBED_HEADER)
|
||||||
|
|
||||||
|
c-out/obj/%.o: yait/%.c
|
||||||
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
$(YAIT): $(YAIT_OBJS)
|
||||||
|
$(CC) $(CFLAGS) -DCOMMIT=$(shell git rev-list --count --all) $^ -o $@
|
||||||
|
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
install:
|
||||||
|
@echo "NOT IMPL"
|
||||||
|
exit 1
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
@echo "NOT IMPL"
|
||||||
|
exit 1
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf c-out
|
||||||
|
|
||||||
|
dist-clean: clean
|
||||||
|
rm -f config.mak
|
||||||
|
|
||||||
|
.PHONY: all clean dist-clean install uninstall build format gen-file-embeds
|
||||||
56
embed/configure
vendored
Executable file
56
embed/configure
vendored
Executable file
@@ -0,0 +1,56 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<EOF
|
||||||
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
|
To assign environment variables (e.g., CC, CFLAGS...), specify them as
|
||||||
|
VAR=VALUE.
|
||||||
|
|
||||||
|
CC C compiler command [detected]
|
||||||
|
CFLAGS C compiler flags [-g, ...]
|
||||||
|
|
||||||
|
EOF
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
echo () { printf "%s\n" "$*" ; }
|
||||||
|
cmdexists () { type "$1" >/dev/null 2>&1 ; }
|
||||||
|
trycc () { test -z "$CC" && cmdexists "$1" && CC=$1 ; }
|
||||||
|
|
||||||
|
prefix=/usr/bin/
|
||||||
|
CFLAGS="-Wall -Wextra -O2"
|
||||||
|
LDFLAGS=
|
||||||
|
CC=
|
||||||
|
|
||||||
|
for arg ; do
|
||||||
|
case "$arg" in
|
||||||
|
--help|h) usage ;;
|
||||||
|
CFLAGS=*) CFLAGS=${arg#*=} ;;
|
||||||
|
LDFLAGS=*) LDFLAGS=${arg#*=} ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
printf "checking for C compiler... "
|
||||||
|
trycc gcc
|
||||||
|
trycc cc
|
||||||
|
trycc clang
|
||||||
|
printf "%s\n" "$CC"
|
||||||
|
|
||||||
|
printf "checking weather C compiler works... "
|
||||||
|
status="fail"
|
||||||
|
tmpc="$(mktemp -d)/test.c"
|
||||||
|
echo "typedef int x;" > "$tmpc"
|
||||||
|
if output=$($CC $CFLAGS -c -o /dev/null "$tmpc" 2>&1) ; then
|
||||||
|
printf "yes\n"
|
||||||
|
else
|
||||||
|
printf "no; %s\n" "$output"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "creating config.mak... "
|
||||||
|
printf "PREFIX=%s\n" "$prefix" > config.mak
|
||||||
|
printf "CFLAGS=%s\n" "$CFLAGS" >> config.mak
|
||||||
|
printf "LDFLAGS=%s\n" "$LDFLAGS" >> config.mak
|
||||||
|
printf "CC=%s\n" "$CC" >> config.mak
|
||||||
|
printf "done\n"
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
|
|
||||||
def c_escape_byte(b):
|
|
||||||
if b == 0x09:
|
|
||||||
return r'\t'
|
|
||||||
elif b == 0x0A:
|
|
||||||
return r'\n'
|
|
||||||
elif b == 0x0D:
|
|
||||||
return r'\r'
|
|
||||||
elif b == 0x5C: # \
|
|
||||||
return r'\\'
|
|
||||||
elif b == 0x22: # "
|
|
||||||
return r'\"'
|
|
||||||
elif 0x20 <= b <= 0x7E:
|
|
||||||
return chr(b)
|
|
||||||
elif b == 0x25: # %
|
|
||||||
return '%%'
|
|
||||||
else:
|
|
||||||
return f'\\x{b:02x}'
|
|
||||||
|
|
||||||
|
|
||||||
def file_to_c_string(filepath):
|
|
||||||
with open(filepath, 'rb') as f:
|
|
||||||
content = f.read()
|
|
||||||
escaped = ''.join(c_escape_byte(b) for b in content)
|
|
||||||
return f'"{escaped}"'
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description='Convert file contents to a valid C string literal.')
|
|
||||||
parser.add_argument('input', help='Path to input file')
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
c_string = file_to_c_string(args.input)
|
|
||||||
print(c_string)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
10
tools/gen-embed-header
Executable file
10
tools/gen-embed-header
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/env bash
|
||||||
|
|
||||||
|
files=./embed/*
|
||||||
|
|
||||||
|
touch embed_header.h
|
||||||
|
echo "" > embed_header.h
|
||||||
|
|
||||||
|
for f in $files; do
|
||||||
|
xxd -i >> embed_header.h
|
||||||
|
done
|
||||||
@@ -25,14 +25,20 @@ typedef enum {
|
|||||||
*/
|
*/
|
||||||
} lib_flags_t;
|
} lib_flags_t;
|
||||||
|
|
||||||
|
/* Flag option type struct */
|
||||||
|
typedef struct {
|
||||||
|
bool GNU;
|
||||||
|
bool git;
|
||||||
|
bool clang_format;
|
||||||
|
} flags_t;
|
||||||
|
|
||||||
/* Project configuration structure */
|
/* Project configuration structure */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool git; /* Whether to initialize git repository */
|
|
||||||
bool clang_format; /* Whether to create .clang-format file */
|
|
||||||
licence_t licence; /* License type for the project */
|
licence_t licence; /* License type for the project */
|
||||||
char *project; /* Project name */
|
char *project; /* Project name */
|
||||||
char *name; /* Author/creator name */
|
char *name; /* Author/creator name */
|
||||||
lib_flags_t libraries; /* Selected libraries (bit field) */
|
lib_flags_t libraries; /* Selected libraries (bit field) */
|
||||||
|
flags_t flag; /* Flags */
|
||||||
} format_t;
|
} format_t;
|
||||||
|
|
||||||
/* Default values */
|
/* Default values */
|
||||||
|
|||||||
91
yait/main.c
91
yait/main.c
@@ -3,7 +3,6 @@
|
|||||||
#include "../core/print.h"
|
#include "../core/print.h"
|
||||||
#include "../core/standard.h"
|
#include "../core/standard.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
#include <ctype.h>
|
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -81,8 +80,11 @@ main (int argc, char **argv)
|
|||||||
else
|
else
|
||||||
conf.name = DEFAULT_USER_NAME;
|
conf.name = DEFAULT_USER_NAME;
|
||||||
}
|
}
|
||||||
conf.git = DEFAULT_GIT_INIT;
|
conf.flag.git = DEFAULT_GIT_INIT;
|
||||||
conf.clang_format = DEFAULT_CLANG_FORMAT;
|
conf.flag.clang_format = DEFAULT_CLANG_FORMAT;
|
||||||
|
|
||||||
|
conf.flag.GNU = true; // debug
|
||||||
|
|
||||||
conf.licence = DEFAULT_LICENSE;
|
conf.licence = DEFAULT_LICENSE;
|
||||||
|
|
||||||
int result = create_project (conf);
|
int result = create_project (conf);
|
||||||
@@ -103,7 +105,7 @@ create_project (format_t fmt)
|
|||||||
printfn ("failed to create or enter directory: %s", strerror (err));
|
printfn ("failed to create or enter directory: %s", strerror (err));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (fmt.git)
|
if (fmt.flag.git)
|
||||||
err = system ("git init --quiet");
|
err = system ("git init --quiet");
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
@@ -202,7 +204,7 @@ create_project (format_t fmt)
|
|||||||
create_file_with_content (
|
create_file_with_content (
|
||||||
"Makefile",
|
"Makefile",
|
||||||
"prefix = /usr/bin\n\n"
|
"prefix = /usr/bin\n\n"
|
||||||
"%s_SRCS := $(wildcard *.c)\n"
|
"%s_SRCS := $(wildcard %s*.c)\n"
|
||||||
"%s_OBJS := $(patsubst %%.c,c-out/obj/%%.o,$(%s_SRCS))\n\n"
|
"%s_OBJS := $(patsubst %%.c,c-out/obj/%%.o,$(%s_SRCS))\n\n"
|
||||||
"%s := c-out/bin/%s\n\n"
|
"%s := c-out/bin/%s\n\n"
|
||||||
"-include config.mak\n\n"
|
"-include config.mak\n\n"
|
||||||
@@ -232,15 +234,18 @@ create_project (format_t fmt)
|
|||||||
"dist-clean: clean\n"
|
"dist-clean: clean\n"
|
||||||
"\trm -f config.mak\n\n"
|
"\trm -f config.mak\n\n"
|
||||||
".PHONY: all clean dist-clean install uninstall build format\n",
|
".PHONY: all clean dist-clean install uninstall build format\n",
|
||||||
mkfile_name, mkfile_name, mkfile_name, mkfile_name, fmt.project,
|
mkfile_name, mkfile_name, mkfile_name, mkfile_name, mkfile_name,
|
||||||
mkfile_name, mkfile_name, mkfile_name);
|
fmt.project, mkfile_name, mkfile_name, mkfile_name);
|
||||||
free (mkfile_name);
|
free (mkfile_name);
|
||||||
if (fmt.clang_format)
|
if (fmt.flag.clang_format)
|
||||||
create_file_with_content (".clang-format",
|
create_file_with_content (".clang-format",
|
||||||
"Language: Cpp\nBasedOnStyle: GNU\n");
|
"Language: Cpp\nBasedOnStyle: GNU\n");
|
||||||
|
char *license_line = "";
|
||||||
switch (fmt.licence)
|
switch (fmt.licence)
|
||||||
{
|
{
|
||||||
case BSD3:
|
case BSD3:
|
||||||
|
license_line = "License BSD-3-Clause: BSD-3-Clause "
|
||||||
|
"<https://opensource.org/licence/bsd-3-clause>";
|
||||||
create_file_with_content (
|
create_file_with_content (
|
||||||
"COPYING",
|
"COPYING",
|
||||||
"BSD 3-Clause License\n\nCopyright (c) %d, "
|
"BSD 3-Clause License\n\nCopyright (c) %d, "
|
||||||
@@ -274,12 +279,70 @@ create_project (format_t fmt)
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
create_file_with_content ("config.h",
|
||||||
|
"#ifndef CONFIG_H\n"
|
||||||
|
"#define CONFIG_H\n\n"
|
||||||
|
"/* Program information */\n"
|
||||||
|
"#define PROGRAM \"%s\"\n"
|
||||||
|
"#define LICENSE_LINE \"%s\"\n"
|
||||||
|
"#define AUTHORS \"%s\"\n"
|
||||||
|
"#define VERSION \"pre-alpha\"\n"
|
||||||
|
"#define YEAR 2025\n\n"
|
||||||
|
"#endif",
|
||||||
|
fmt.project, license_line, fmt.name, YEAR);
|
||||||
create_and_enter_directory (fmt.project);
|
create_and_enter_directory (fmt.project);
|
||||||
create_file_with_content (
|
if (!fmt.flag.GNU)
|
||||||
"main.c",
|
{
|
||||||
"#include <stdio.h>\n\nint main(void) {\n printf(\"%s: Hello "
|
create_file_with_content (
|
||||||
"%s!\\n\");\nreturn 0;\n}",
|
"main.c",
|
||||||
fmt.project ? fmt.project : DEFAULT_PROJECT_NAME,
|
"#include <stdio.h>\n\nint main(void) {\n printf(\"%s: Hello "
|
||||||
fmt.name ? fmt.name : "World");
|
"%s!\\n\");\n return 0;\n}",
|
||||||
|
fmt.project ? fmt.project : DEFAULT_PROJECT_NAME,
|
||||||
|
fmt.name ? fmt.name : "World");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
create_file_with_content (
|
||||||
|
"main.c",
|
||||||
|
"#include <stdio.h>\n"
|
||||||
|
"#include \"standard.h\"\n"
|
||||||
|
"\n"
|
||||||
|
"void usage(int status) {\nprintf(\"Usage: %s [OPTION...]\\n\")\n}\n"
|
||||||
|
"\n"
|
||||||
|
"int main(void) {\n"
|
||||||
|
"parse_standard_options(NULL, argc, argv);\n"
|
||||||
|
"printf(\"%s: Hello "
|
||||||
|
"%s!\\n\");\n return 0;\n}",
|
||||||
|
fmt.project, fmt.project ? fmt.project : DEFAULT_PROJECT_NAME,
|
||||||
|
fmt.name ? fmt.name : "World");
|
||||||
|
}
|
||||||
|
if (fmt.flag.GNU)
|
||||||
|
{
|
||||||
|
create_file_with_content (
|
||||||
|
"standard.c",
|
||||||
|
"#include \"standard.h\"\n#include \"../config.h\"\n#include "
|
||||||
|
"<stdio.h>\n#include <stdlib.h>\n#include "
|
||||||
|
"<string.h>\n\nint\nparse_standard_options (void (*usage) (int), "
|
||||||
|
"int argc, char **argv)\n{\n for (int i = 1; i < argc; ++i)\n "
|
||||||
|
"{\n if (strcmp (argv[i], \"--help\") == 0)\n {\n "
|
||||||
|
" usage (0);\n exit (EXIT_SUCCESS);\n }\n "
|
||||||
|
"else if (strcmp (argv[i], \"--version\") == 0)\n {\n "
|
||||||
|
" printf (\"%%s %%s %%d\\nCopyright (C) %%d %%s.\\n%%s\\nThis is "
|
||||||
|
"free "
|
||||||
|
"software: \"\n \"you are free to change and "
|
||||||
|
"redistribute it.\\nThere is NO \"\n \"WARRNTY, to "
|
||||||
|
"the extent permitted by law.\\n\",\n PROGRAM, "
|
||||||
|
"VERSION, COMMIT, YEAR, AUTHORS, LICENSE_LINE);\n exit "
|
||||||
|
"(EXIT_SUCCESS);\n }\n }\n return HELP_REQUESTED;\n}\n");
|
||||||
|
create_file_with_content (
|
||||||
|
"standard.h",
|
||||||
|
"#ifndef STANDARD_H\n#define STANDARD_H\n\n/**\n * Parse standard "
|
||||||
|
"command line options (--help, --version)\n * @param usage_func "
|
||||||
|
"Function pointer to usage display function\n * @param argc "
|
||||||
|
"Argument count\n * @param argv Argument vector\n * @return 0 on "
|
||||||
|
"success, 1 if help/version requested, errno on error\n */\nint "
|
||||||
|
"parse_standard_options(void (*usage_func)(), int argc, char "
|
||||||
|
"**argv);\n\n#endif\n");
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user