void usage(char* path)
{
- fprintf(stderr, "Usage: %s [-c] [-d] [-t] [-a arch] [-s sysroot] [-o out] src0 [src1]\n\n", path);
+ fprintf(stderr, "Usage: %s [-c] [-d] [-t] [-a arch] [-s sysroot] [-Iinclude / -I include] [-lsofile / -l sofile] [-Lsopath / -L sopath] [-o out] src0 [src1]\n\n", path);
fprintf(stderr, "-c: only compile, not link\n");
fprintf(stderr, "-t: only 3ac code, not compile\n");
fprintf(stderr, "-a: select cpu arch (x64, arm64, naja, or eda), default is x64\n");
fprintf(stderr, "-s: sysroot dir, default is '../lib'\n");
fprintf(stderr, "-d: output dynamic library .so\n");
+ fprintf(stderr, "-I: include paths for .h file\n");
+ fprintf(stderr, "-l: file name of lib*.so / lib*.a, NOT include prefix 'lib' & post fix '.so' or '.a'\n");
+ fprintf(stderr, "-L: file paths for .so / .a file\n");
}
int add_sys_files(scf_vector_t* vec, const char* sysroot, const char* arch, char* files[], int n_files)
return -EINVAL;
}
+ int ret = 0;
+
+ scf_vector_t* inc_paths = scf_vector_alloc();
+ scf_vector_t* lib_paths = scf_vector_alloc();
+ scf_vector_t* lib_files = scf_vector_alloc();
+
scf_vector_t* afiles = scf_vector_alloc();
scf_vector_t* sofiles = scf_vector_alloc();
scf_vector_t* srcs = scf_vector_alloc();
scf_vector_t* objs = scf_vector_alloc();
+ if (!inc_paths
+ || !lib_paths
+ || !lib_files
+ || !afiles || !sofiles || !srcs || !objs) {
+ ret = -ENOMEM;
+ goto error;
+ }
+
char* sysroot = "../lib";
char* arch = "x64";
char* out = NULL;
if ('a' == argv[i][1]) {
- if (++i >= argc) {
+ if (++i >= argc || '-' == argv[i][0]) {
usage(argv[0]);
- return -EINVAL;
+
+ ret = -EINVAL;
+ goto error;
}
arch = argv[i];
if ('s' == argv[i][1]) {
- if (++i >= argc) {
+ if (++i >= argc || '-' == argv[i][0]) {
usage(argv[0]);
- return -EINVAL;
+
+ ret = -EINVAL;
+ goto error;
}
sysroot = argv[i];
if ('o' == argv[i][1]) {
- if (++i >= argc) {
+ if (++i >= argc || '-' == argv[i][0]) {
usage(argv[0]);
- return -EINVAL;
+
+ ret = -EINVAL;
+ goto error;
}
out = argv[i];
continue;
}
- usage(argv[0]);
- return -EINVAL;
+ scf_vector_t* vec = NULL;
+
+ switch (argv[i][1]) {
+ case 'I':
+ vec = inc_paths;
+ break;
+
+ case 'l':
+ vec = lib_files;
+ break;
+ case 'L':
+ vec = lib_paths;
+ break;
+
+ default:
+ usage(argv[0]);
+
+ ret = -EINVAL;
+ goto error;
+ break;
+ };
+
+ char* fname = NULL;
+
+ if ('\0' == argv[i][2]) {
+
+ if (++i >= argc || '-' == argv[i][0]) {
+ usage(argv[0]);
+
+ ret = -EINVAL;
+ goto error;
+ }
+
+ fname = argv[i];
+ } else
+ fname = argv[i] + 2;
+
+ ret = scf_vector_add(vec, fname);
+ if (ret < 0)
+ goto error;
+
+ continue;
}
char* fname = argv[i];
if (len < 3) {
fprintf(stderr, "file '%s' invalid\n", fname);
- return -1;
- }
- scf_logi("fname: %s\n", fname);
+ ret = -EINVAL;
+ goto error;
+ }
- scf_vector_t* vec;
+ scf_vector_t* vec = NULL;
if (!strcmp(fname + len - 2, ".a"))
vec = afiles;
vec = sofiles;
else {
fprintf(stderr, "file '%s' invalid\n", fname);
- return -1;
+
+ ret = -EINVAL;
+ goto error;
}
scf_logi("fname: %s\n", fname);
- if (scf_vector_add(vec, fname) < 0)
- return -ENOMEM;
+
+ ret = scf_vector_add(vec, fname);
+ if (ret < 0)
+ goto error;
}
printf("\n");
if (srcs->size > 0) {
scf_parse_t* parse = NULL;
- if (scf_parse_open(&parse) < 0) {
+ ret = scf_parse_open(&parse, inc_paths);
+ if (ret < 0) {
scf_loge("\n");
- return -1;
+ goto error;
}
for (i = 0; i < srcs->size; i++) {
assert(file);
- if (scf_parse_file(parse, file) < 0) {
+ ret = scf_parse_file(parse, file);
+ if (ret < 0) {
scf_loge("parse file '%s' failed\n", file);
- return -1;
+ goto error;
}
}
- if (scf_parse_compile(parse, arch, _3ac) < 0) {
+ ret = scf_parse_compile(parse, arch, _3ac);
+ if (ret < 0) {
scf_loge("\n");
- return -1;
+ goto error;
}
- if (scf_parse_to_obj(parse, obj, arch) < 0) {
+ ret = scf_parse_to_obj(parse, obj, arch);
+ if (ret < 0) {
scf_loge("\n");
- return -1;
+ goto error;
}
scf_parse_close(parse);
+ parse = NULL;
}
- if (!link) {
- printf("%s(),%d, main ok\n", __func__, __LINE__);
- return 0;
- }
-
+ if (link) {
#define MAIN_ADD_FILES(_objs, _sofiles, _arch) \
- do { \
- if (!dyn) { \
- int ret = add_sys_files(objs, sysroot, _arch, _objs, sizeof(_objs) / sizeof(_objs[0])); \
+ do { \
+ if (!dyn) { \
+ ret = add_sys_files(objs, sysroot, _arch, _objs, sizeof(_objs) / sizeof(_objs[0])); \
+ if (ret < 0) \
+ goto error; \
+ } \
+ \
+ ret = add_sys_files(sofiles, sysroot, _arch, _sofiles, sizeof(_sofiles) / sizeof(_sofiles[0])); \
if (ret < 0) \
- return ret; \
- } \
- \
- int ret = add_sys_files(sofiles, sysroot, _arch, _sofiles, sizeof(_sofiles) / sizeof(_sofiles[0])); \
- if (ret < 0) \
- return ret; \
- } while (0)
+ goto error; \
+ } while (0)
- if (!strcmp(arch, "arm64") || !strcmp(arch, "naja"))
- MAIN_ADD_FILES(__arm64_objs, __arm64_sofiles, "arm64");
+ if (!strcmp(arch, "arm64") || !strcmp(arch, "naja"))
+ MAIN_ADD_FILES(__arm64_objs, __arm64_sofiles, "arm64");
- else if (!strcmp(arch, "arm32"))
- MAIN_ADD_FILES(__arm32_objs, __arm32_sofiles, "arm32");
- else
- MAIN_ADD_FILES(__objs, __sofiles, "x64");
+ else if (!strcmp(arch, "arm32"))
+ MAIN_ADD_FILES(__arm32_objs, __arm32_sofiles, "arm32");
+ else
+ MAIN_ADD_FILES(__objs, __sofiles, "x64");
- if (srcs->size > 0) {
- if (scf_vector_add(objs, obj) < 0) {
- scf_loge("\n");
- return -1;
+ if (srcs->size > 0) {
+ ret = scf_vector_add(objs, obj);
+ if (ret < 0)
+ goto error;
}
- }
- if (scf_elf_link(objs, afiles, sofiles, sysroot, arch, exec, dyn) < 0) {
- scf_loge("\n");
- return -1;
+ ret = scf_elf_link(objs, afiles, sofiles, sysroot, arch, exec, dyn);
+ if (ret < 0) {
+ scf_loge("\n");
+ goto error;
+ }
}
printf("%s(),%d, main ok\n", __func__, __LINE__);
- return 0;
+
+ ret = 0;
+
+error:
+ if (inc_paths)
+ scf_vector_free(inc_paths);
+
+ if (lib_paths)
+ scf_vector_free(lib_paths);
+
+ if (lib_files)
+ scf_vector_free(lib_files);
+
+ if (afiles)
+ scf_vector_free(afiles);
+
+ if (sofiles)
+ scf_vector_free(sofiles);
+
+ if (srcs)
+ scf_vector_free(srcs);
+
+ if (objs)
+ scf_vector_free(objs);
+
+ return ret;
}