UDI/Tools - Renamed udibuild's src dir to say udibuild
[tpg/acess2.git] / UDI / Tools / udibuild_src / build.c
diff --git a/UDI/Tools/udibuild_src/build.c b/UDI/Tools/udibuild_src/build.c
new file mode 100644 (file)
index 0000000..4d0b294
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * udibuild - UDI Compilation Utility
+ * - By John Hodge (thePowersGang)
+ *
+ * build.c
+ * - Compilation functions
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>  // mkdir
+#include <unistd.h>    // unlink
+#include "include/build.h"
+#include "include/common.h"
+
+// === PROTOTYPES ===
+char   *get_objfile(tIniFile *opts, const char *abi, const char *srcfile);
+char   *get_udipropsfile(tIniFile *opts, const char *abi);
+
+// === CODE ===
+int Build_CompileFile(tIniFile *opts, const char *abi, tUdiprops *udiprops, tUdiprops_Srcfile *srcfile)
+{
+       // Select compiler from opts [abi]
+       const char *cc_prog = IniFile_Get(opts, abi, "CC", NULL);
+       if( !cc_prog ) {
+               fprintf(stderr, "No 'CC' defined for ABI %s\n", abi);
+               return -1;
+       }
+       
+       // Build up compiler's command line
+       // - Include CFLAGS from .ini file
+       // - defines from udiprops
+       // - Object file is srcfile with .o appended
+       //  > Place in 'obj/' dir?
+       char *objfile = get_objfile(opts, abi, srcfile->Filename);
+       char *cmd = mkstr("%s -DUDI_ABI_is_%s %s %s -c %s -o %s",
+               cc_prog,
+               abi,
+               IniFile_Get(opts, abi, "CFLAGS", ""),
+               srcfile->CompileOpts ? srcfile->CompileOpts : "",
+               srcfile->Filename, objfile);
+       printf("--- Compiling: %s\n", srcfile->Filename);
+        int rv = system(cmd);
+       free(cmd);
+       free(objfile);
+       
+       return rv;
+}
+
+int Build_CreateUdiprops(tIniFile *opts, const char *abi, tUdiprops *udiprops)
+{
+       const char *cc_prog = IniFile_Get(opts, abi, "CC", NULL);
+       
+       char    *filename = get_udipropsfile(opts, abi);
+       FILE *fp = fopen(filename, "w");
+       fprintf(fp, "char udiprops[] __attribute__((section(\".udiprops\"))) = \n");
+       for( int i = 0; i < udiprops->nLines; i ++ ) {
+               // TODO: Escape " in string
+               fprintf(fp, " \"%s\"\n", udiprops->Lines[i]);
+       }
+       fprintf(fp, " ;\n");
+       fclose(fp);
+
+       char *cmd = mkstr("%s %s -c %s -o %s.o",
+               cc_prog, IniFile_Get(opts, abi, "CFLAGS", ""),
+               filename, filename);
+
+       int rv = system(cmd);
+       free(cmd);
+       unlink(filename);       
+       free(filename);
+
+       return rv;
+}
+
+int Build_LinkObjects(tIniFile *opts, const char *abi, tUdiprops *udiprops)
+{
+       const char *linker = IniFile_Get(opts, abi, "LD", NULL);
+       if( !linker ) {
+               fprintf(stderr, "No 'LD' defined for ABI %s\n", abi);
+               return -1;
+       }
+
+       char    *objfiles[udiprops->nSourceFiles];
+       size_t  objfiles_len = 0;
+       for( int i = 0; i < udiprops->nSourceFiles; i ++ ) {
+               objfiles[i] = get_objfile(opts, abi, udiprops->SourceFiles[i]->Filename);
+               objfiles_len += strlen(objfiles[i])+1;
+       }
+       
+       // Create command string
+       char *objfiles_str = malloc(objfiles_len);
+       objfiles_len = 0;
+       for( int i = 0; i < udiprops->nSourceFiles; i ++ ) {
+               strcpy(objfiles_str + objfiles_len, objfiles[i]);
+               objfiles_len += strlen(objfiles[i])+1;
+               objfiles_str[objfiles_len-1] = ' ';
+               free( objfiles[i] );
+       }
+       objfiles_str[objfiles_len-1] = '\0';
+
+       mkdir("bin", 0755);
+       char *abidir = mkstr("bin/%s", abi);
+       mkdir(abidir, 0755);
+       free(abidir);
+       
+       char *udiprops_c = get_udipropsfile(opts, abi);
+       char *cmd = mkstr("%s -r %s -o bin/%s/%s -s %s",// %s.o",
+               linker, IniFile_Get(opts, abi, "LDFLAGS", ""),
+               abi, udiprops->ModuleName, objfiles_str, udiprops_c
+               );
+       printf("--- Linking: bin/%s/%s\n", abi, udiprops->ModuleName);
+       printf("%s\n", cmd);
+       int rv = system(cmd);
+       free(cmd);
+       free(udiprops_c);
+       free(objfiles_str);
+
+       return rv;
+}
+
+char *get_objfile(tIniFile *opts, const char *abi, const char *srcfile)
+{
+       return mkstr("%s.o", srcfile);
+}
+
+char *get_udipropsfile(tIniFile *opts, const char *abi)
+{
+       return mkstr(".udiprops.c");
+}
+

UCC git Repository :: git.ucc.asn.au