aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2020-02-13 11:36:10 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2020-02-13 11:36:10 -0500
commit74ed8c549a360330643ef32ac6070a834820b611 (patch)
tree460a43a3046a7a9990157b3fb787faa6a22b0d57 /src
parent094375a5c0ee18e9144c73c543d5218f261cc561 (diff)
downloadspmc-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.c5
-rw-r--r--src/internal_cmd.c37
-rw-r--r--src/manifest.c10
-rw-r--r--src/spm.c23
4 files changed, 58 insertions, 17 deletions
diff --git a/src/find.c b/src/find.c
index 9f9555a..3f12aaf 100644
--- a/src/find.c
+++ b/src/find.c
@@ -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
diff --git a/src/spm.c b/src/spm.c
index 099126d..b2ffb8f 100644
--- a/src/spm.c
+++ b/src/spm.c
@@ -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);