bulk changes, but autotools

This commit is contained in:
2025-09-04 21:36:29 -04:00
parent 19c1e37cd2
commit b99a13f426
5 changed files with 118 additions and 22 deletions

View File

@@ -9,18 +9,16 @@
#ifndef YAIT_H #ifndef YAIT_H
#define YAIT_H #define YAIT_H
typedef enum { MIT, GPL, BSD, UNL, _LICENCE_COUNT_ } licence_t; typedef enum { MIT, GPL, BSD, UNL, LCOUNT } licence_t;
typedef enum { MAKE, CMAKE, AUTOTOOLS, BARE, BCOUNT } built_t;
typedef struct { typedef struct {
licence_t licence; licence_t licence;
built_t build;
bool lib; bool lib;
bool git; bool git;
bool autotools;
bool cmake;
bool make;
bool bare;
bool flat; bool flat;
bool open_editor; bool open_editor;

View File

@@ -8,6 +8,7 @@
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <stdio.h> #include <stdio.h>
@@ -29,7 +30,7 @@ int create_project(manifest_t manifest)
if (status) if (status)
return 1; return 1;
if (manifest.bare) { if (manifest.build == BARE) {
cfprintf("main.c", ""); cfprintf("main.c", "");
cfprintf( cfprintf(
"Makefile", "Makefile",
@@ -48,7 +49,8 @@ int create_project(manifest_t manifest)
"\treturn 0;\n" "\treturn 0;\n"
"}\n"); "}\n");
char *upr_name = tostrupr(manifest.project); char *upr_name = tostrupr(manifest.project);
if (manifest.make) { switch (manifest.build) {
case MAKE:
cfprintf( cfprintf(
"Makefile", "Makefile",
"PREFIX = /usr/bin\n" "PREFIX = /usr/bin\n"
@@ -63,6 +65,52 @@ int create_project(manifest_t manifest)
"ifeq ($(wildcard config.mak),)\n", "ifeq ($(wildcard config.mak),)\n",
upr_name, upr_name, upr_name, upr_name, upr_name, upr_name, upr_name, upr_name,
manifest.project); manifest.project);
break;
case CMAKE:
cfprintf("CMakeLists.txt",
"cmake_minimum_required(VERSION 3.16)\n"
"\n"
"project(%s\n"
" VERSION 0.1.0\n"
" LANGUAGES C)\n"
"\n"
"set(CMAKE_C_STANDARD 23)\n"
"set(CMAKE_C_STANDARD_REQUIRED ON)\n"
"set(CMAKE_C_EXTENSIONS OFF)\n"
"\n"
"include(GNUInstallDirs)\n"
"\n"
"add_executable(%s\n"
" src/main.c\n"
")\n"
"\n"
"install(TARGETS %s\n"
" RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}\n"
")\n",
manifest.project, manifest.project, manifest.project);
break;
case AUTOTOOLS:
cfprintf("configure.ac",
"AC_PREREQ([2.69])\n"
"AC_INIT([%s], [0.1], [bug-report@exmaple.com])\n"
"AM_INIT_AUTOMAKE([foreign -Wall])\n"
"AC_CONFIG_SRCDIR([src/main.c])\n"
"AC_CONFIG_HEADERS([config.h])"
"AC_PROG_CC\n"
"AC_CONFIG_FILES([Makefile src/Makefile])\n"
"AC_OUTPUT\n",
manifest.project);
cfprintf("Makefile.am", "SUBDIRS = src\n");
cfprintf("src/Makefile.am",
"bin_PROGRAMS = %s\n"
"%s_SOURCES = main.c\n",
manifest.project, manifest.project);
cfprintf("bootstrap",
"#!/bin/sh\n"
"set -e\n"
"\n"
"autoreconf --install --verbose --force\n");
break;
} }
bare_skip: bare_skip:
@@ -90,6 +138,21 @@ bare_skip:
fprintf(stderr, ", done.\n"); fprintf(stderr, ", done.\n");
} }
if (manifest.build == AUTOTOOLS) {
fprintf(stderr, "Changing files permissions 1");
struct stat st;
if (stat("bootstrap", &st) == -1) {
perror("stat failed");
return 1;
}
mode_t new_mode = st.st_mode | S_IXUSR;
if (chmod("bootstrap", new_mode) == -1) {
perror("chmod failed");
return 1;
}
fprintf(stderr, ", done.\n");
}
if (manifest.open_editor) { if (manifest.open_editor) {
snprintf(buffer, BUFSIZ, "nvim %s", main_source); snprintf(buffer, BUFSIZ, "nvim %s", main_source);
system(buffer); system(buffer);

View File

@@ -49,7 +49,7 @@ int mkdir_p(const char *path)
int cfprintf(const char *path, const char *format, ...) int cfprintf(const char *path, const char *format, ...)
{ {
int lines = atoi(getenv("LINES")); // int lines = atoi(getenv("LINES"));
char *dirpath; char *dirpath;
const char *slash = strrchr(path, '/'); const char *slash = strrchr(path, '/');
if (slash) { if (slash) {

View File

@@ -122,22 +122,16 @@ static int parse_arguments(manifest_t *conf, int argc, char **argv)
conf->lib = true; conf->lib = true;
break; break;
case 'a': case 'a':
conf->autotools = true; conf->build = AUTOTOOLS;
conf->cmake = false;
conf->make = false;
break; break;
case 'c': case 'c':
conf->cmake = true; conf->build = CMAKE;
conf->autotools = false;
conf->make = false;
break; break;
case 'm': case 'm':
conf->make = true; conf->build = MAKE;
conf->autotools = false;
conf->cmake = false;
break; break;
case 'B': case 'B':
conf->bare = true; conf->build = BARE;
break; break;
case 'f': case 'f':
conf->flat = true; conf->flat = true;
@@ -214,10 +208,7 @@ int main(int argc, char **argv)
.licence = UNL, .licence = UNL,
.git = true, .git = true,
.autotools = false, .build = MAKE,
.cmake = false,
.make = true,
.bare = false,
.flat = false, .flat = false,
.open_editor = false, .open_editor = false,
.lib = false, .lib = false,

44
tools/tostr Executable file
View File

@@ -0,0 +1,44 @@
#!/bin/sh
awk '
BEGIN {
printf "\""
}
{
for (i = 1; i <= length($0); i++) {
c = substr($0, i, 1)
if (c == "\\") {
printf "\\\\"
} else if (c == "\"") {
printf "\\\""
} else if (c == "\t") {
printf "\\t"
} else if (c == "\r") {
printf "\\r"
} else if (c == "\n") {
printf "\\n"
} else if (c == "\f") {
printf "\\f"
} else if (c == "\b") {
printf "\\b"
} else if (c == "\a") {
printf "\\a"
} else if (c == "\v") {
printf "\\v"
} else if (c ~ /[[:cntrl:]]/) {
printf "\\x%02x", ord(c)
} else {
printf "%s", c
}
}
printf "\\n"
}
END {
printf "\"\n"
}
function ord(str, l, r) {
l = sprintf("%c", 255)
r = sprintf("%c", 0)
return index(l str r, str) - 1
}
'