kore

a fork of the worlds most advanced web framework
Log | Files | Refs | README | LICENSE

commit c172d49567c16a42c67299d0d78115551fe9664c
parent 300daeadef0ff0862cdc807fa38a7ed8ce183939
Author: Joris Vink <joris@coders.se>
Date:   Wed, 17 Oct 2018 11:30:14 +0200

kodev improvements.

- Take CFLAGS, CXXFLAGS and LDFLAGS from environment
  if present and append them to the build.conf cflags

- Allow overriding of the OBJDIR via KORE_OBJDIR.

- Allow overriding of build flavor via KORE_BUILD_FLAVOR.

Diffstat:
Msrc/cli.c | 76++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
1 file changed, 48 insertions(+), 28 deletions(-)

diff --git a/src/cli.c b/src/cli.c @@ -61,8 +61,8 @@ #define PRI_TIME_T "ld" #endif -#define LD_FLAGS_MAX 30 -#define CFLAGS_MAX 30 +#define LD_FLAGS_MAX 300 +#define CFLAGS_MAX 300 #define CXXFLAGS_MAX CFLAGS_MAX #define BUILD_NOBUILD 0 @@ -387,6 +387,7 @@ static int cflags_count = 0; static int cxxflags_count = 0; static int ldflags_count = 0; static char *flavor = NULL; +static char *object_dir = ".objs"; static char *cflags[CFLAGS_MAX]; static char *cxxflags[CXXFLAGS_MAX]; static char *ldflags[LD_FLAGS_MAX]; @@ -410,7 +411,7 @@ int main(int argc, char **argv) { int i; - const char *env; + char *env; if (argc < 2) usage(); @@ -421,6 +422,9 @@ main(int argc, char **argv) if ((env = getenv("KORE_PREFIX")) != NULL) prefix = env; + if ((env = getenv("KORE_OBJDIR")) != NULL) + object_dir = env; + (void)umask(S_IWGRP | S_IWOTH); for (i = 0; cmds[i].name != NULL; i++) { @@ -571,8 +575,8 @@ cli_build(int argc, char **argv) char *build_path; int requires_relink, l; char *sofile, *config, *data; - char *assets_path, *p, *obj_path; - char pwd[PATH_MAX], *src_path, *assets_header; + char *assets_path, *p, *src_path; + char pwd[PATH_MAX], *assets_header; if (getcwd(pwd, sizeof(pwd)) == NULL) fatal("could not get cwd: %s", errno_s); @@ -618,10 +622,8 @@ cli_build(int argc, char **argv) cli_buildopt_parse(build_path); free(build_path); - (void)cli_vasprintf(&obj_path, ".objs"); - if (!cli_dir_exists(obj_path)) - cli_mkdir(obj_path, 0755); - free(obj_path); + if (!cli_dir_exists(object_dir)) + cli_mkdir(object_dir, 0755); if (bopt->single_binary) { if (bopt->kore_source == NULL) @@ -725,8 +727,8 @@ cli_clean(int argc, char **argv) { char pwd[PATH_MAX], *sofile; - if (cli_dir_exists(".objs")) - cli_cleanup_files(".objs"); + if (cli_dir_exists(object_dir)) + cli_cleanup_files(object_dir); if (getcwd(pwd, sizeof(pwd)) == NULL) fatal("could not get cwd: %s", errno_s); @@ -1085,8 +1087,8 @@ cli_build_asset(char *fpath, struct dirent *dp) return; } - (void)cli_vasprintf(&opath, ".objs/%s.o", name); - (void)cli_vasprintf(&cpath, ".objs/%s.c", name); + (void)cli_vasprintf(&opath, "%s/%s.o", object_dir, name); + (void)cli_vasprintf(&cpath, "%s/%s.c", object_dir, name); /* Check if the file needs to be built. */ if (!cli_file_requires_build(&st, opath)) { @@ -1226,7 +1228,7 @@ cli_register_source_file(char *fpath, struct dirent *dp) if (!strcmp(ext, ".cpp")) cxx_files_count++; - (void)cli_vasprintf(&opath, ".objs/%s.o", dp->d_name); + (void)cli_vasprintf(&opath, "%s/%s.o", object_dir, dp->d_name); if (!cli_file_requires_build(&st, opath)) { build = BUILD_NOBUILD; } else if (!strcmp(ext, ".cpp")) { @@ -1254,7 +1256,7 @@ cli_register_kore_file(char *fpath, struct dirent *dp) if ((fname = basename(fpath)) == NULL) fatal("basename failed"); - (void)cli_vasprintf(&opath, ".objs/%s.o", fname); + (void)cli_vasprintf(&opath, "%s/%s.o", object_dir, fname); /* Silently ignore non existing object files for kore source files. */ if (stat(opath, &ost) == -1) { @@ -1486,12 +1488,15 @@ cli_compile_kore(void *arg) { struct buildopt *bopt = arg; int idx, i, fcnt; - char *obj, *args[20], pwd[MAXPATHLEN], *flavors[7]; - - if (getcwd(pwd, sizeof(pwd)) == NULL) - fatal("could not get cwd: %s", errno_s); + char pwd[MAXPATHLEN], *obj, *args[20], *flavors[7]; - (void)cli_vasprintf(&obj, "OBJDIR=%s/.objs", pwd); + if (object_dir[0] != '/') { + if (getcwd(pwd, sizeof(pwd)) == NULL) + fatal("could not get cwd: %s", errno_s); + (void)cli_vasprintf(&obj, "OBJDIR=%s/%s", pwd, object_dir); + } else { + (void)cli_vasprintf(&obj, "OBJDIR=%s", object_dir); + } if (putenv(obj) != 0) fatal("cannot set OBJDIR for building kore"); @@ -1856,7 +1861,7 @@ cli_build_cflags(struct buildopt *bopt) { size_t len; struct buildopt *obopt; - char *string, *buf; + char *string, *buf, *env; if ((obopt = cli_buildopt_find(flavor)) == NULL) fatal("no such build flavor: %s", flavor); @@ -1878,6 +1883,9 @@ cli_build_cflags(struct buildopt *bopt) free(buf); } + if ((env = getenv("CFLAGS")) != NULL) + cli_buf_appendf(bopt->cflags, "%s", env); + string = cli_buf_stringify(bopt->cflags, NULL); printf("CFLAGS=%s\n", string); cflags_count = cli_split_string(string, " ", cflags, CFLAGS_MAX); @@ -1887,7 +1895,7 @@ static void cli_build_cxxflags(struct buildopt *bopt) { struct buildopt *obopt; - char *string; + char *string, *env; if ((obopt = cli_buildopt_find(flavor)) == NULL) fatal("no such build flavor: %s", flavor); @@ -1902,6 +1910,9 @@ cli_build_cxxflags(struct buildopt *bopt) obopt->cxxflags->offset); } + if ((env = getenv("CXXFLAGS")) != NULL) + cli_buf_appendf(bopt->cxxflags, "%s", env); + string = cli_buf_stringify(bopt->cxxflags, NULL); if (cxx_files_count > 0) printf("CXXFLAGS=%s\n", string); @@ -1914,7 +1925,7 @@ cli_build_ldflags(struct buildopt *bopt) int fd; size_t len; struct buildopt *obopt; - char *string, *buf; + char *string, *buf, *env, *path; if ((obopt = cli_buildopt_find(flavor)) == NULL) fatal("no such build flavor: %s", flavor); @@ -1930,11 +1941,12 @@ cli_build_ldflags(struct buildopt *bopt) cli_buf_appendf(bopt->ldflags, "-shared "); #endif } else { - cli_file_open(".objs/ldflags", O_RDONLY, &fd); + (void)cli_vasprintf(&path, "%s/ldflags", object_dir); + cli_file_open(path, O_RDONLY, &fd); cli_file_read(fd, &buf, &len); cli_file_close(fd); if (len == 0) - fatal(".objs/ldflags is empty"); + fatal("ldflags is empty"); len--; cli_buf_append(bopt->ldflags, buf, len); @@ -1947,6 +1959,9 @@ cli_build_ldflags(struct buildopt *bopt) obopt->ldflags->offset); } + if ((env = getenv("LDFLAGS")) != NULL) + cli_buf_appendf(bopt->ldflags, "%s", env); + string = cli_buf_stringify(bopt->ldflags, NULL); printf("LDFLAGS=%s\n", string); ldflags_count = cli_split_string(string, " ", ldflags, LD_FLAGS_MAX); @@ -1956,7 +1971,12 @@ static void cli_flavor_load(void) { FILE *fp; - char buf[BUFSIZ], pwd[MAXPATHLEN], *p, *conf; + char buf[BUFSIZ], pwd[MAXPATHLEN], *p, *conf, *env; + + if ((env = getenv("KORE_BUILD_FLAVOR")) != NULL) { + flavor = cli_strdup(env); + return; + } if (getcwd(pwd, sizeof(pwd)) == NULL) fatal("could not get cwd: %s", errno_s); @@ -1994,7 +2014,7 @@ cli_kore_features(struct buildopt *bopt, char **out, size_t *outlen) char *path, *data; if (bopt->single_binary) { - (void)cli_vasprintf(&path, ".objs/features"); + (void)cli_vasprintf(&path, "%s/features", object_dir); } else { (void)cli_vasprintf(&path, "%s/share/kore/features", prefix); } @@ -2005,7 +2025,7 @@ cli_kore_features(struct buildopt *bopt, char **out, size_t *outlen) free(path); if (len == 0) - fatal(".objs/features is empty"); + fatal("features is empty"); len--;