macos and something else
This commit is contained in:
parent
cdacf0868b
commit
a2eccd422f
7
cbt.c
7
cbt.c
|
@ -1,4 +1,4 @@
|
||||||
// x-run: python3 ./add-impl.py && ~/scripts/runc.sh % -Wall -Wextra
|
// x-run: python3 ./add-impl.py && ~/scripts/runc.sh % -Wall -Wextra -X-gdb
|
||||||
#define CBT_IMPLEMENTATION
|
#define CBT_IMPLEMENTATION
|
||||||
#include "cbt.h"
|
#include "cbt.h"
|
||||||
|
|
||||||
|
@ -7,8 +7,9 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
cbt_shell(CBT_PROC_AUTO, "sh", "-c", "echo 'owo'");
|
cbt_shell(CBT_PROC_AUTO, "sh", "-c", "echo 'owo'");
|
||||||
|
|
||||||
struct cbt_lib raylib = cbt_lib("raylib", "./raylib");
|
// example usage, won't actually work
|
||||||
cbt_lib_src(&raylib, "rcore.c");
|
struct cbt_lib raylib = cbt_lib("raylib");
|
||||||
|
cbt_lib_src(&raylib, "./raylib/*.c");
|
||||||
cbt_lib_ldflags(&raylib, "-lm");
|
cbt_lib_ldflags(&raylib, "-lm");
|
||||||
cbt_lib_cflags(&raylib, "-Wall", "-Wextra");
|
cbt_lib_cflags(&raylib, "-Wall", "-Wextra");
|
||||||
cbt_lib_build(raylib, NULL);
|
cbt_lib_build(raylib, NULL);
|
||||||
|
|
96
cbt.h
96
cbt.h
|
@ -15,7 +15,7 @@ enum cbt_loglevel {
|
||||||
CBT_LOG_ALL
|
CBT_LOG_ALL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cbt_chararray {
|
struct cbt_strarr {
|
||||||
char **items;
|
char **items;
|
||||||
size_t size, cap;
|
size_t size, cap;
|
||||||
};
|
};
|
||||||
|
@ -40,7 +40,7 @@ bool cbt_needs_recompilation(const char *input, const char *output);
|
||||||
|
|
||||||
const char *cbt_escape_shell(char *arg);
|
const char *cbt_escape_shell(char *arg);
|
||||||
const char *cbt_escape_args(char **args);
|
const char *cbt_escape_args(char **args);
|
||||||
const char *cbt_escape_argsd(struct cbt_chararray arr);
|
const char *cbt_escape_argsd(struct cbt_strarr arr);
|
||||||
|
|
||||||
#ifndef CBT_FMT_NBUFS
|
#ifndef CBT_FMT_NBUFS
|
||||||
#define CBT_FMT_NBUFS 64
|
#define CBT_FMT_NBUFS 64
|
||||||
|
@ -74,21 +74,21 @@ enum cbt_proc_mode {
|
||||||
#define cbt_shell(...) cbt_proc_wait(_cbt_proc_new(__VA_ARGS__, NULL))
|
#define cbt_shell(...) cbt_proc_wait(_cbt_proc_new(__VA_ARGS__, NULL))
|
||||||
struct cbt_proc _cbt_proc_new(enum cbt_proc_mode mode, ...);
|
struct cbt_proc _cbt_proc_new(enum cbt_proc_mode mode, ...);
|
||||||
struct cbt_proc cbt_proc_newv(enum cbt_proc_mode mode, va_list args);
|
struct cbt_proc cbt_proc_newv(enum cbt_proc_mode mode, va_list args);
|
||||||
|
struct cbt_proc cbt_proc_newd(enum cbt_proc_mode mode, struct cbt_strarr args);
|
||||||
int cbt_proc_wait(struct cbt_proc proc);
|
int cbt_proc_wait(struct cbt_proc proc);
|
||||||
|
|
||||||
enum cbt_libtype { CBT_LIB_STATIC, CBT_LIB_SHARED };
|
enum cbt_libtype { CBT_LIB_STATIC, CBT_LIB_SHARED };
|
||||||
|
|
||||||
struct cbt_lib {
|
struct cbt_lib {
|
||||||
enum cbt_libtype type;
|
enum cbt_libtype type;
|
||||||
const char *basepath;
|
|
||||||
const char *libname;
|
const char *libname;
|
||||||
struct cbt_chararray sources, cflags, ldflags;
|
struct cbt_strarr sources, cflags, ldflags;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define cbt_lib_src(LIB, ...) _cbt_lib_src(LIB, __VA_ARGS__, NULL)
|
#define cbt_lib_src(LIB, ...) _cbt_lib_src(LIB, __VA_ARGS__, NULL)
|
||||||
#define cbt_lib_cflags(LIB, ...) _cbt_lib_cflags(LIB, __VA_ARGS__, NULL)
|
#define cbt_lib_cflags(LIB, ...) _cbt_lib_cflags(LIB, __VA_ARGS__, NULL)
|
||||||
#define cbt_lib_ldflags(LIB, ...) _cbt_lib_ldflags(LIB, __VA_ARGS__, NULL)
|
#define cbt_lib_ldflags(LIB, ...) _cbt_lib_ldflags(LIB, __VA_ARGS__, NULL)
|
||||||
struct cbt_lib cbt_lib(const char *libname, const char *basepath);
|
struct cbt_lib cbt_lib(const char *libname);
|
||||||
void _cbt_lib_src(struct cbt_lib *lib, ...);
|
void _cbt_lib_src(struct cbt_lib *lib, ...);
|
||||||
void _cbt_lib_cflags(struct cbt_lib *lib, ...);
|
void _cbt_lib_cflags(struct cbt_lib *lib, ...);
|
||||||
void _cbt_lib_ldflags(struct cbt_lib *lib, ...);
|
void _cbt_lib_ldflags(struct cbt_lib *lib, ...);
|
||||||
|
@ -97,7 +97,7 @@ void cbt_lib_free(struct cbt_lib lib);
|
||||||
|
|
||||||
struct cbt_binary {
|
struct cbt_binary {
|
||||||
const char *out_path;
|
const char *out_path;
|
||||||
struct cbt_chararray sources, cflags, ldflags;
|
struct cbt_strarr sources, cflags, ldflags;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define cbt_binary_add_src(B, ...) _cbt_binary_add_src(B, __VA_ARGS__, NULL)
|
#define cbt_binary_add_src(B, ...) _cbt_binary_add_src(B, __VA_ARGS__, NULL)
|
||||||
|
@ -141,12 +141,13 @@ void cbt_binary_free(struct cbt_binary bin);
|
||||||
memmove(&OUT.items[offset], IN.items, sizeof(OUT.items[0]) * IN.size); \
|
memmove(&OUT.items[offset], IN.items, sizeof(OUT.items[0]) * IN.size); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define cbt_da_copy(OUT, IN, T) { \
|
#define cbt_da_copy(OUT, IN, T) \
|
||||||
OUT.size = IN.size; \
|
{ \
|
||||||
OUT.cap = IN.size; \
|
OUT.size = IN.size; \
|
||||||
OUT.items = malloc(sizeof(IN.items[0]) * IN.size); \
|
OUT.cap = IN.size; \
|
||||||
memcpy(OUT.items, IN.items, sizeof(IN.items[0]) * IN.size); \
|
OUT.items = malloc(sizeof(IN.items[0]) * IN.size); \
|
||||||
}
|
memcpy(OUT.items, IN.items, sizeof(IN.items[0]) * IN.size); \
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CBT_IMPLEMENTATION
|
#ifdef CBT_IMPLEMENTATION
|
||||||
//-*- begin cbt_impl.c 5
|
//-*- begin cbt_impl.c 5
|
||||||
|
@ -155,7 +156,9 @@ void cbt_binary_free(struct cbt_binary bin);
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <glob.h>
|
#include <glob.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
|
#ifdef __APPLE__
|
||||||
#include <linux/limits.h>
|
#include <linux/limits.h>
|
||||||
|
#endif
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
@ -182,6 +185,11 @@ void cbt_binary_free(struct cbt_binary bin);
|
||||||
abort(); \
|
abort(); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef PATH_MAX
|
||||||
|
#define PATH_MAX 1024
|
||||||
|
#endif
|
||||||
|
|
||||||
enum cbt_loglevel cbt_verbosity = CBT_LOG_INFO;
|
enum cbt_loglevel cbt_verbosity = CBT_LOG_INFO;
|
||||||
char *cbt_cc = NULL;
|
char *cbt_cc = NULL;
|
||||||
char cbt_location[PATH_MAX] = {0};
|
char cbt_location[PATH_MAX] = {0};
|
||||||
|
@ -355,7 +363,7 @@ const char *cbt_escape_args(char **args) {
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *cbt_escape_argsd(struct cbt_chararray arr) {
|
const char *cbt_escape_argsd(struct cbt_strarr arr) {
|
||||||
if (arr.size == 0 || arr.items[0] == NULL)
|
if (arr.size == 0 || arr.items[0] == NULL)
|
||||||
return cbt_fmt("");
|
return cbt_fmt("");
|
||||||
char *out = (char *)cbt_escape_shell(arr.items[0]);
|
char *out = (char *)cbt_escape_shell(arr.items[0]);
|
||||||
|
@ -373,8 +381,8 @@ unsigned long cbt_get_modtime(const char *filename) {
|
||||||
if (ret == -1)
|
if (ret == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
cbt_log(CBT_LOG_DEBUG, "stat(%s) -> %ld", filename, st.st_mtim.tv_sec);
|
cbt_log(CBT_LOG_DEBUG, "stat(%s) -> %ld", filename, st.st_mtime);
|
||||||
return st.st_mtim.tv_sec;
|
return st.st_mtime;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cbt_needs_recompilation(const char *input, const char *output) {
|
bool cbt_needs_recompilation(const char *input, const char *output) {
|
||||||
|
@ -414,9 +422,8 @@ struct cbt_proc _cbt_proc_new(enum cbt_proc_mode mode, ...) {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct cbt_proc cbt_proc_newv(enum cbt_proc_mode mode, va_list args) {
|
struct cbt_proc cbt_proc_newv(enum cbt_proc_mode mode, va_list args) {
|
||||||
struct cbt_proc procinfo = {0};
|
|
||||||
|
|
||||||
struct cbt_chararray args_da = {0};
|
struct cbt_strarr args_da = {0};
|
||||||
while (true) {
|
while (true) {
|
||||||
const char *arg = va_arg(args, const char *);
|
const char *arg = va_arg(args, const char *);
|
||||||
if (arg == NULL)
|
if (arg == NULL)
|
||||||
|
@ -425,8 +432,13 @@ struct cbt_proc cbt_proc_newv(enum cbt_proc_mode mode, va_list args) {
|
||||||
}
|
}
|
||||||
cbt_da_add(args_da, NULL);
|
cbt_da_add(args_da, NULL);
|
||||||
|
|
||||||
|
return cbt_proc_newd(mode, args_da);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cbt_proc cbt_proc_newd(enum cbt_proc_mode mode, struct cbt_strarr args) {
|
||||||
|
struct cbt_proc procinfo = {0};
|
||||||
cbt_log(CBT_LOG_DEBUG, "Spawning process with mode %d and args %s", mode,
|
cbt_log(CBT_LOG_DEBUG, "Spawning process with mode %d and args %s", mode,
|
||||||
cbt_escape_args(args_da.items));
|
cbt_escape_args(args.items));
|
||||||
|
|
||||||
int pipe_fds_sout[2] = {0}, pipe_fds_serr[2] = {0}, pipe_fds_sin[2] = {0};
|
int pipe_fds_sout[2] = {0}, pipe_fds_serr[2] = {0}, pipe_fds_sin[2] = {0};
|
||||||
if (mode & CBT_PROC_W)
|
if (mode & CBT_PROC_W)
|
||||||
|
@ -447,7 +459,7 @@ struct cbt_proc cbt_proc_newv(enum cbt_proc_mode mode, va_list args) {
|
||||||
CBT_FAIL(dup2(pipe_fds_sout[1], STDOUT_FILENO) == -1);
|
CBT_FAIL(dup2(pipe_fds_sout[1], STDOUT_FILENO) == -1);
|
||||||
CBT_FAIL(dup2(pipe_fds_serr[1], STDERR_FILENO) == -1);
|
CBT_FAIL(dup2(pipe_fds_serr[1], STDERR_FILENO) == -1);
|
||||||
|
|
||||||
execvp(args_da.items[0], (char *const *)args_da.items);
|
execvp(args.items[0], (char *const *)args.items);
|
||||||
__builtin_unreachable();
|
__builtin_unreachable();
|
||||||
} else {
|
} else {
|
||||||
if (mode & CBT_PROC_W)
|
if (mode & CBT_PROC_W)
|
||||||
|
@ -471,10 +483,10 @@ struct cbt_proc cbt_proc_newv(enum cbt_proc_mode mode, va_list args) {
|
||||||
|
|
||||||
cbt_proc_new_cleanup:
|
cbt_proc_new_cleanup:
|
||||||
cbt_log(CBT_LOG_DEBUG, "freeing up args");
|
cbt_log(CBT_LOG_DEBUG, "freeing up args");
|
||||||
for (size_t i = 0; i < args_da.size; i++) {
|
for (size_t i = 0; i < args.size; i++) {
|
||||||
free(args_da.items[i]);
|
free(args.items[i]);
|
||||||
}
|
}
|
||||||
free(args_da.items);
|
free(args.items);
|
||||||
|
|
||||||
return procinfo;
|
return procinfo;
|
||||||
}
|
}
|
||||||
|
@ -522,7 +534,7 @@ void *cbt__line_processor(void *arg) {
|
||||||
while (cbt_running) {
|
while (cbt_running) {
|
||||||
pthread_mutex_lock(&_cbt__autoproc_mut);
|
pthread_mutex_lock(&_cbt__autoproc_mut);
|
||||||
|
|
||||||
#if 1
|
#if 1 || defined(__APPLE__)
|
||||||
int res = ppoll(cbt__autoproc_fdset.items, cbt__autoproc_fdset.size,
|
int res = ppoll(cbt__autoproc_fdset.items, cbt__autoproc_fdset.size,
|
||||||
&timeout, &sigmask);
|
&timeout, &sigmask);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
|
@ -557,9 +569,8 @@ void *cbt__line_processor(void *arg) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct cbt_lib cbt_lib(const char *libname, const char *basepath) {
|
struct cbt_lib cbt_lib(const char *libname) {
|
||||||
return (struct cbt_lib){.type = CBT_LIB_STATIC,
|
return (struct cbt_lib){.type = CBT_LIB_STATIC,
|
||||||
.basepath = basepath,
|
|
||||||
.libname = libname,
|
.libname = libname,
|
||||||
.cflags = {0},
|
.cflags = {0},
|
||||||
.ldflags = {0},
|
.ldflags = {0},
|
||||||
|
@ -578,8 +589,7 @@ void _cbt_lib_src(struct cbt_lib *lib, ...) {
|
||||||
glob_t globbuf;
|
glob_t globbuf;
|
||||||
|
|
||||||
for (char *arg = va_arg(args, char *); arg; arg = va_arg(args, char *)) {
|
for (char *arg = va_arg(args, char *); arg; arg = va_arg(args, char *)) {
|
||||||
glob(cbt_fmt("%s/%s", lib->basepath, arg),
|
glob(arg, GLOB_APPEND | GLOB_BRACE, _cbt_globerr, &globbuf);
|
||||||
GLOB_APPEND | GLOB_BRACE | GLOB_NOCHECK, _cbt_globerr, &globbuf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < globbuf.gl_pathc; i++) {
|
for (size_t i = 0; i < globbuf.gl_pathc; i++) {
|
||||||
|
@ -610,13 +620,18 @@ void _cbt_lib_ldflags(struct cbt_lib *lib, ...) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cbt_lib_build(struct cbt_lib lib, const char *compiler) {
|
bool cbt_lib_build(struct cbt_lib lib, const char *compiler) {
|
||||||
cbt_log(CBT_LOG_INFO, "library: %s in %s", lib.libname, lib.basepath);
|
cbt_log(CBT_LOG_INFO, "library: %s", lib.libname);
|
||||||
cbt_log(CBT_LOG_INFO, " cflags: %s", cbt_escape_argsd(lib.cflags));
|
cbt_log(CBT_LOG_INFO, " cflags: %s", cbt_escape_argsd(lib.cflags));
|
||||||
cbt_log(CBT_LOG_INFO, " ldflags: %s", cbt_escape_argsd(lib.ldflags));
|
cbt_log(CBT_LOG_INFO, " ldflags: %s", cbt_escape_argsd(lib.ldflags));
|
||||||
cbt_log(CBT_LOG_INFO, " sources: %s", cbt_escape_argsd(lib.sources));
|
cbt_log(CBT_LOG_INFO, " sources: %s", cbt_escape_argsd(lib.sources));
|
||||||
cbt_log(CBT_LOG_INFO, " cc: %s", compiler ? compiler : cbt_cc);
|
cbt_log(CBT_LOG_INFO, " cc: %s", compiler ? compiler : cbt_cc);
|
||||||
|
|
||||||
struct cbt_chararray args = {0};
|
if (lib.sources.size == 0) {
|
||||||
|
cbt_log(CBT_LOG_WARNING, "cbt_lib_build(): no sources for %s", lib.libname);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cbt_strarr args = {0};
|
||||||
cbt_da_add(args, (char *)(compiler ? compiler : cbt_cc));
|
cbt_da_add(args, (char *)(compiler ? compiler : cbt_cc));
|
||||||
|
|
||||||
cbt_da_merge(args, lib.cflags);
|
cbt_da_merge(args, lib.cflags);
|
||||||
|
@ -624,7 +639,28 @@ bool cbt_lib_build(struct cbt_lib lib, const char *compiler) {
|
||||||
cbt_log(CBT_LOG_INFO, "args.size: %d", args.size);
|
cbt_log(CBT_LOG_INFO, "args.size: %d", args.size);
|
||||||
cbt_log(CBT_LOG_INFO, "CMD: %s", cbt_escape_argsd(args));
|
cbt_log(CBT_LOG_INFO, "CMD: %s", cbt_escape_argsd(args));
|
||||||
|
|
||||||
CBT_TODO("cbt_lib_build()");
|
cbt_da_add(args, NULL);
|
||||||
|
cbt_da_add(args, "-o");
|
||||||
|
cbt_da_add(args, NULL);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < lib.sources.size; i++) {
|
||||||
|
args.items[args.size - 3] = lib.sources.items[i];
|
||||||
|
args.items[args.size - 1] = ".o"; // TODO
|
||||||
|
struct cbt_proc proc = cbt_proc_newd(CBT_PROC_AUTO, args);
|
||||||
|
if (cbt_proc_wait(proc) != 0) {
|
||||||
|
cbt_log(CBT_LOG_ERROR, "build failed: %s", cbt_escape_argsd(args));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char **argp = &args.items[args.size - 1];
|
||||||
|
cbt_da_merge(args, lib.ldflags);
|
||||||
|
|
||||||
|
*argp = (char *)cbt_fmt("lib%s.so", lib.libname);
|
||||||
|
|
||||||
|
// todo: link
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cbt_lib_free(struct cbt_lib lib) {
|
void cbt_lib_free(struct cbt_lib lib) {
|
||||||
|
|
Loading…
Reference in New Issue