diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2020-02-13 11:36:10 -0500 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2020-02-13 11:36:10 -0500 |
commit | 74ed8c549a360330643ef32ac6070a834820b611 (patch) | |
tree | 460a43a3046a7a9990157b3fb787faa6a22b0d57 /src | |
parent | 094375a5c0ee18e9144c73c543d5218f261cc561 (diff) | |
download | spmc-74ed8c549a360330643ef32ac6070a834820b611.tar.gz |
Begin refactoring to support multiple manifests:
* Add more commands useful for building packages
* Fix mkmanifest_interface not looking for the correct number of arguments
Diffstat (limited to 'src')
-rw-r--r-- | src/find.c | 5 | ||||
-rw-r--r-- | src/internal_cmd.c | 37 | ||||
-rw-r--r-- | src/manifest.c | 10 | ||||
-rw-r--r-- | src/spm.c | 23 |
4 files changed, 58 insertions, 17 deletions
@@ -74,7 +74,10 @@ char *find_file(const char *root, const char *filename) { * @return success=path to file, failure=NULL */ char *find_package(const char *filename) { - return find_file(PKG_DIR, filename); + char *repo = join((char *[]) {SPM_GLOBAL.package_dir, SPM_GLOBAL.repo_target, NULL}, DIRSEPS); + char *match = find_file(repo, filename); + free(repo); + return match; } /** diff --git a/src/internal_cmd.c b/src/internal_cmd.c index 0393669..3583073 100644 --- a/src/internal_cmd.c +++ b/src/internal_cmd.c @@ -15,6 +15,7 @@ static char *internal_commands[] = { "rpath_set", "modify binary RPATH", "rpath_autoset", "determine nearest lib directory and set RPATH", "get_package_ext", "show the default archive extension", + "get_sys_target", "show this system's arch/platform", "check_rt_env", "check the integrity of the calling runtime environment", NULL, NULL, }; @@ -76,7 +77,7 @@ int mkprefix_interface(int argc, char **argv) { printf("Generating prefix manifest: %s\n", outfile); } - int result; + int result = 0; if (strcmp(command, "mkprefixbin") == 0) { result = prefixes_write(outfile, PREFIX_WRITE_BIN, prefix, tree); } else if (strcmp(command, "mkprefixtext") == 0) { @@ -99,7 +100,7 @@ void mkmanifest_interface_usage(void) { * @return value of `manifest_write` */ int mkmanifest_interface(int argc, char **argv) { - if (argc < 1) { + if (argc < 1 || argc > 3) { mkmanifest_interface_usage(); return -1; } @@ -109,18 +110,13 @@ int mkmanifest_interface(int argc, char **argv) { char path[PATH_MAX]; memset(path, '\0', PATH_MAX); - if (argc == 2) { - pkgdir = argv[1]; - } - else { + if (argc < 3) { pkgdir = SPM_GLOBAL.package_dir; - } - - if (argc > 2) { - strcpy(path, argv[2]); + strcpy(path, SPM_MANIFEST_FILENAME); } else { - strcpy(path, SPM_MANIFEST_FILENAME); + pkgdir = argv[1]; + strcpy(path, argv[2]); } if (exists(pkgdir) != 0) { @@ -178,6 +174,12 @@ int mkruntime_interface(int argc, char **argv) { runtime_set(rt, "SPM_LIB", spm_libpath); runtime_set(rt, "SPM_DATA", spm_datapath); runtime_set(rt, "SPM_MAN", spm_manpath); + runtime_set(rt, "SPM_META_DEPENDS", SPM_META_DEPENDS); + runtime_set(rt, "SPM_META_PREFIX_BIN", SPM_META_PREFIX_BIN); + runtime_set(rt, "SPM_META_PREFIX_TEXT", SPM_META_PREFIX_TEXT); + runtime_set(rt, "SPM_META_MANIFEST", SPM_META_MANIFEST); + runtime_set(rt, "SPM_META_PREFIX_PLACEHOLDER", SPM_META_PREFIX_PLACEHOLDER); + runtime_set(rt, "PATH", "$SPM_BIN:$PATH"); runtime_set(rt, "MANPATH", "$SPM_MAN:$MANPATH"); @@ -187,7 +189,7 @@ int mkruntime_interface(int argc, char **argv) { } runtime_set(rt, "CFLAGS", "-I$SPM_INCLUDE $CFLAGS"); - runtime_set(rt, "LDFLAGS", "-Wl,-rpath=$SPM_LIB:$${ORIGIN}/../lib -L$SPM_LIB $LDFLAGS"); + runtime_set(rt, "LDFLAGS", "-Wl,-rpath=$SPM_LIB:$SPM_BIN/../lib -L$SPM_LIB $LDFLAGS"); runtime_export(rt, NULL); runtime_free(rt); @@ -293,6 +295,14 @@ int get_package_ext_interface(void) { } /** + * Dump the system arch/platform (i.e. Linux/x86_64) + * @return + */ +int get_sys_target_interface(void) { + puts(SPM_GLOBAL.repo_target); + return 0; +} +/** * Execute builtin runtime check. * * On failure this function will EXIT the program with a non-zero value @@ -367,6 +377,9 @@ int internal_cmd(int argc, char **argv) { else if (strcmp(command, "get_package_ext") == 0) { return get_package_ext_interface(); } + else if (strcmp(command, "get_sys_target") == 0) { + return get_sys_target_interface(); + } else if (strcmp(command, "check_rt_env") == 0) { return check_runtime_environment_interface(); } diff --git a/src/manifest.c b/src/manifest.c index 5a1eeb8..4f3fa8c 100644 --- a/src/manifest.c +++ b/src/manifest.c @@ -59,7 +59,9 @@ Manifest *manifest_from(const char *package_dir) { dep_init(&deps); if (dep_all(&deps, basename(fsdata->files[i])) < 0) { dep_free(&deps); - // TODO: Why is this freed *and* the program continues? I don't know why this is here. + fprintf(stderr, "%s: dependency not found\n", fsdata->files[i]); + fprintf(SYSERROR); + return NULL; } // Initialize package record @@ -194,7 +196,7 @@ int manifest_write(Manifest *info, const char *outfile) { printf("[%3.0f%%] %s\n", percent, info->packages[i]->archive); } reqs = join(info->packages[i]->requirements, ","); - char *archive = join((char *[]) {SPM_GLOBAL.package_dir, info->packages[i]->archive, NULL}, DIRSEPS); + char *archive = join((char *[]) {SPM_GLOBAL.package_dir, SPM_GLOBAL.repo_target, info->packages[i]->archive, NULL}, DIRSEPS); char *checksum_sha256 = sha256sum(archive); sprintf(dptr, "%s|" // archive @@ -492,4 +494,8 @@ ManifestPackage *manifest_package_copy(ManifestPackage *manifest) { } return result; +} + +int manifest_merge(Manifest *a, Manifest *b) { + }
\ No newline at end of file @@ -9,7 +9,8 @@ int RUNTIME_INSTALL = 0; int RUNTIME_ROOTDIR = 0; int RUNTIME_LIST = 0; int RUNTIME_SEARCH = 0; -const int PACKAGE_MAX = 0xff; +const int MANIFESTS_MAX = 25; +int manifests_count = 0; void usage(const char *program_name) { printf("usage: %s [-hVvBIrLS]\n" @@ -30,6 +31,9 @@ int main(int argc, char *argv[], char *arge[]) { memset(program_name, '\0', sizeof(program_name) + 1); strcpy(program_name, basename(argv[0])); + Manifest *manifests[MANIFESTS_MAX]; + memset(manifests, '\0', MANIFESTS_MAX * sizeof(Manifest *)); + // not much to see here yet // at the moment this will all be random tests, for better or worse // everything here is subject to change without notice @@ -52,6 +56,9 @@ int main(int argc, char *argv[], char *arge[]) { exit(1); } + // Populate at least one manifest record + manifests[manifests_count] = manifest_read(SPM_GLOBAL.package_dir); + for (int i = 1; i < argc; i++) { char *arg = argv[i]; char *arg_next = argv[i + 1] ? argv[i + 1] : NULL; @@ -69,6 +76,18 @@ int main(int argc, char *argv[], char *arge[]) { else if (strcmp(arg, "-v") == 0 || strcmp(arg, "--verbose") == 0) { SPM_GLOBAL.verbose = 1; } + else if (strcmp(arg, "-m") == 0 || strcmp(arg, "--manifest") == 0) { + if (arg_next == NULL) { + fprintf(stderr, "-m|--manifest requires a directory path\n"); + usage(program_name); + exit(1); + } + char *repo = join((char *[]) {arg_next, SPM_GLOBAL.repo_target, NULL}, DIRSEPS); + manifests[manifests_count] = manifest_from(repo); + manifests_count++; + i++; + free(repo); + } else if (strcmp(arg, "--reindex") == 0) { Manifest *info = manifest_from(SPM_GLOBAL.package_dir); manifest_write(info, SPM_GLOBAL.package_manifest); @@ -178,7 +197,7 @@ int main(int argc, char *argv[], char *arge[]) { dep_init(&deps); printf("Reading package manifest... "); - Manifest *manifest = manifest_read(NULL); + Manifest *manifest = manifest_read(manifests[manifests_count]->origin); //manifest_read(NULL); if (!manifest) { fprintf(stderr, "Package manifest is missing or corrupt\n"); runtime_free(rt); |