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.
This commit is contained in:
Joris Vink 2018-10-17 11:30:14 +02:00
parent 300daeadef
commit c172d49567
1 changed files with 48 additions and 28 deletions

View File

@ -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];
char pwd[MAXPATHLEN], *obj, *args[20], *flavors[7];
if (getcwd(pwd, sizeof(pwd)) == NULL)
fatal("could not get cwd: %s", errno_s);
(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--;