]> Nishi Git Mirror - gwion.git/commitdiff
:art: add arguments, cflags, ldflags, improve
authorfennecdjay <fennecdjay@gmail.com>
Fri, 27 Jan 2023 11:34:46 +0000 (12:34 +0100)
committerfennecdjay <fennecdjay@gmail.com>
Fri, 27 Jan 2023 11:34:46 +0000 (12:34 +0100)
scripts/embed.bash
src/main.c

index 0701c385f72aa03c6e0c05626316fa4625b0dc56..bad1b1b299cf864d87a3bd30cb9318edd7a007d4 100644 (file)
@@ -80,8 +80,9 @@ ANN static void compile_script(const Gwion gwion, const m_str filename,
 
 EOF
 
+libraries=$(jq -rc '.libraries' <<< "$json")
 echo "ANN void gwion_embed(const Gwion gwion) {" >> embed/embed_foot
-jq -rc '.libraries|.[]' <<< "$json" |
+jq -rc '.[]' <<< "$libraries" |
   while read -r lib
   do
     path=$(jq -c '.path' <<< "$lib" | sed -e 's/^"//' -e 's/"$//')
@@ -105,9 +106,10 @@ handle_script() {
   echo "  compile_script(gwion, \"$name\", ${name}, ${name}_len);"
 }
 
+scripts=$(jq -r '.scripts' <<< "$json")
 handle_scripts() {
   i=0
-  jq -r '.scripts|.[]' <<< "$json"  |
+  jq -r '.[]' <<< "$scripts"  |
     while read -r name;
     do handle_script "$name" "$i"; i=$((i+1));
     done
@@ -123,10 +125,60 @@ audio=$(jq -rc '.audio' <<< "$json")
 in=$(jq -rc '.in' <<< "$audio")
 out=$(jq -rc '.out' <<< "$audio")
 samplerate=$(jq -rc '.samplerate' <<< "$audio")
-# check is truthy
+
 {
 [ "$in" != "null" ] && echo "CFLAGS += -DGWION_DEFAULT_NIN=$in"
 [ "$out" != "null" ] && echo "CFLAGS += -DGWION_DEFAULT_NOUT=$out"
 [ "$samplerate" != "null" ] && echo "CFLAGS += -DGWION_DEFAULT_SAMPLERATE=$samplerate"
 } >> embed/embed.mk
 
+args=$(jq -rc '.args' <<< "$json")
+[ "$args" != "null" ] && {
+  count=0
+  echo "CFLAGS += -DGWION_CONFIG_ARGS" >> embed/embed.mk
+  echo "static const char *config_argv[] = {"
+  jq -rc '.[]' <<< "$args" |
+  while read -r arg 
+  do
+    echo "  \"$arg\", "
+  done
+  echo "};"
+  count=$((count+1))
+  echo "static const int config_argc = $count;"
+cat << EOF
+ANN const char** config_args(int *argc, char **const argv) {
+  const int nargs = config_argc + *argc;
+  const char **  args = malloc(nargs * SZ_INT);
+  for(int i = 0; i < config_argc; i++) {
+    args[i] = config_argv[i];
+  }
+  for(int i = 0; i < *argc; i++) {
+  puts(argv[i]);
+    args[i + config_argc] = argv[i];
+  }
+  *argc = nargs;
+  return args;
+}
+EOF
+} >> embed/embed.c
+
+[ "$libraries" != "null" ] || [ "$scripts" != "null" ] && {
+  echo "CFLAGS += -DGWION_EMBED"
+} >> embed/embed.mk
+
+cflags=$(jq -rc '.cflags' <<< "$json")
+[ "$cflags" != "null" ] && {
+  jq -rc '.[]' <<< "$cflags" |
+  while read -r cflag
+  do
+    echo "CFLAGS += $cflag "
+  done
+} >> embed/embed.mk
+ldflags=$(jq -rc '.ldflags' <<< "$json")
+[ "$ldflags" != "null" ] && {
+  jq -rc '.[]' <<< "$ldflags" |
+  while read -r ldflag
+  do
+    echo "LDFLAGS += $ldflag "
+  done
+} >> embed/embed.mk
index 9959c8c083019352df6b6c3bcdc92cd54dfaff3f..b2d1be35dd1a6e5b72b6614cd366ea01b18be34e 100644 (file)
@@ -43,20 +43,31 @@ int main(int argc, char **argv) {
 
 #else
 
-#ifdef GWION_EMBED_GW
-void gwion_embed(const Gwion);
+#ifdef GWION_CONFIG_ARGS
+ANN char **config_args(int *, char **const);
+#endif
+#ifdef GWION_EMBED
+ANN void gwion_embed(const Gwion);
 #endif
 
 int main(int argc, char **argv) {
+#ifndef GWION_CONFIG_ARGS
   CliArg arg = {.arg = {.argc = argc, .argv = argv}, .loop = false};
+#else
+  char **config_argv = config_args(&argc, argv);
+  CliArg arg = {.arg = {.argc = argc, .argv = config_argv}, .loop = false};
+#endif
   signal(SIGINT, sig);
   signal(SIGTERM, sig);
   const m_bool  ini   = gwion_ini(&gwion, &arg);
-#ifdef GWION_EMBED_GW
+#ifdef GWION_EMBED
   gwion_embed(&gwion);
 #endif
   arg_compile(&gwion, &arg);
   arg_release(&arg);
+#ifdef GWION_CONFIG_ARGS
+  free(config_argv);
+#endif
   if (ini > 0) gwion_run(&gwion);
   gwion_end(&gwion);
   gwion.vm = NULL;