aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2020-02-04 12:40:51 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2020-02-04 15:29:29 -0500
commite67fb792478c63d80bc0fcee79123b61e823760f (patch)
treea2ec0a729348276490aec1c26c1dec2353b0b195
parent2199e165558dfe1ceae02814e779d027a36e7a9c (diff)
downloadspmc-e67fb792478c63d80bc0fcee79123b61e823760f.tar.gz
Implement mkruntime interface
-rw-r--r--src/internal_cmd.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/internal_cmd.c b/src/internal_cmd.c
index 17d49af..b6bc65a 100644
--- a/src/internal_cmd.c
+++ b/src/internal_cmd.c
@@ -10,6 +10,7 @@ static char *internal_commands[] = {
"mkprefixbin", "generate prefix manifest (binary)",
"mkprefixtext", "generate prefix manifest (text)",
"mkmanifest", "generate package repository manifest",
+ "mkruntime", "emit runtime environment (stdout)",
"mirror_clone", "mirror a mirror",
"rpath_set", "modify binary RPATH",
"rpath_autoset", "determine nearest lib directory and set RPATH",
@@ -142,6 +143,64 @@ int mkmanifest_interface(int argc, char **argv) {
/**
*
*/
+void mkruntime_interface_usage(void) {
+ printf("usage: mkruntime {root_dir}");
+}
+
+/**
+ *
+ * @param argc
+ * @param argv
+ * @return
+ */
+int mkruntime_interface(int argc, char **argv) {
+ if (argc < 2) {
+ mkruntime_interface_usage();
+ return -1;
+ }
+
+ RuntimeEnv *rt = runtime_copy(__environ);
+ if (rt == NULL) {
+ return -1;
+ }
+
+ char *root = argv[1];
+ char *spm_binpath = join((char *[]) {root, "bin", NULL}, DIRSEPS);
+ char *spm_includepath = join((char *[]) {root, "include", NULL}, DIRSEPS);
+ char *spm_libpath = join((char *[]) {root, "lib", NULL}, DIRSEPS);
+ char *spm_datapath = join((char *[]) {root, "share", NULL}, DIRSEPS);
+ char *spm_manpath = join((char *[]) {spm_datapath, "man", NULL}, DIRSEPS);
+
+ runtime_set(rt, "SPM_BIN", spm_binpath);
+ runtime_set(rt, "SPM_INCLUDE", spm_includepath);
+ runtime_set(rt, "SPM_LIB", spm_libpath);
+ runtime_set(rt, "SPM_DATA", spm_datapath);
+ runtime_set(rt, "SPM_MAN", spm_manpath);
+ runtime_set(rt, "PATH", "$SPM_BIN:$PATH");
+ runtime_set(rt, "MANPATH", "$SPM_MAN:$MANPATH");
+
+ char *spm_ccpath = join((char *[]) {spm_binpath, "gcc"}, DIRSEPS);
+ if (exists(spm_ccpath) == 0) {
+ runtime_set(rt, "CC", "$SPM_BIN/gcc");
+ }
+
+ runtime_set(rt, "CFLAGS", "-I$SPM_INCLUDE $CFLAGS");
+ runtime_set(rt, "LDFLAGS", "-Wl,-rpath $SPM_LIB:$${ORIGIN}/lib -L$SPM_LIB $LDFLAGS");
+ runtime_export(rt, NULL);
+ runtime_free(rt);
+
+ free(spm_binpath);
+ free(spm_includepath);
+ free(spm_libpath);
+ free(spm_datapath);
+ free(spm_manpath);
+ free(spm_ccpath);
+ return 0;
+}
+
+/**
+ *
+ */
void mirror_clone_interface_usage(void) {
printf("usage: mirror_clone {url} {output_dir}");
}
@@ -270,6 +329,9 @@ int internal_cmd(int argc, char **argv) {
else if (strcmp(command, "mkmanifest") == 0) {
return mkmanifest_interface(arg_count, arg_array);
}
+ else if (strcmp(command, "mkruntime") == 0) {
+ return mkruntime_interface(arg_count, arg_array);
+ }
else if (strcmp(command, "mirror_clone") == 0) {
return mirror_clone_interface(arg_count, arg_array);
}