2 * udibuild - UDI Compilation Utility
3 * - By John Hodge (thePowersGang)
6 * - Compilation functions
11 #include <sys/stat.h> // mkdir
12 #include <unistd.h> // unlink
13 #include "include/build.h"
14 #include "include/common.h"
17 char *get_objfile(tIniFile *opts, const char *abi, const char *srcfile);
18 char *get_udipropsfile(tIniFile *opts, const char *abi);
21 int Build_CompileFile(tIniFile *opts, const char *abi, tUdiprops *udiprops, tUdiprops_Srcfile *srcfile)
23 // Select compiler from opts [abi]
24 const char *cc_prog = IniFile_Get(opts, abi, "CC", NULL);
26 fprintf(stderr, "No 'CC' defined for ABI %s\n", abi);
30 // Build up compiler's command line
31 // - Include CFLAGS from .ini file
32 // - defines from udiprops
33 // - Object file is srcfile with .o appended
34 // > Place in 'obj/' dir?
35 char *objfile = get_objfile(opts, abi, srcfile->Filename);
36 char *cmd = mkstr("%s -DUDI_ABI_is_%s %s %s -c %s -o %s",
39 IniFile_Get(opts, abi, "CFLAGS", ""),
40 srcfile->CompileOpts ? srcfile->CompileOpts : "",
41 srcfile->Filename, objfile);
42 printf("--- Compiling: %s\n", srcfile->Filename);
43 if( gbTraceEnabled ) {
44 printf(">> %s\n", cmd);
53 int Build_CreateUdiprops(tIniFile *opts, const char *abi, tUdiprops *udiprops)
55 const char *cc_prog = IniFile_Get(opts, abi, "CC", NULL);
57 char *filename = get_udipropsfile(opts, abi);
58 FILE *fp = fopen(filename, "w");
59 fprintf(fp, "char udiprops[] __attribute__((section(\".udiprops\"))) = \n");
60 for( int i = 0; i < udiprops->nLines; i ++ ) {
61 // TODO: Escape " in string
62 fprintf(fp, " \"%s\"\n", udiprops->Lines[i]);
67 char *cmd = mkstr("%s %s -c %s -o %s.o",
68 cc_prog, IniFile_Get(opts, abi, "CFLAGS", ""),
79 int Build_LinkObjects(tIniFile *opts, const char *abi, tUdiprops *udiprops)
81 const char *linker = IniFile_Get(opts, abi, "LD", NULL);
83 fprintf(stderr, "No 'LD' defined for ABI %s\n", abi);
87 char *objfiles[udiprops->nSourceFiles];
88 size_t objfiles_len = 0;
89 for( int i = 0; i < udiprops->nSourceFiles; i ++ ) {
90 objfiles[i] = get_objfile(opts, abi, udiprops->SourceFiles[i]->Filename);
91 objfiles_len += strlen(objfiles[i])+1;
94 // Create command string
95 char *objfiles_str = malloc(objfiles_len);
97 for( int i = 0; i < udiprops->nSourceFiles; i ++ ) {
98 strcpy(objfiles_str + objfiles_len, objfiles[i]);
99 objfiles_len += strlen(objfiles[i])+1;
100 objfiles_str[objfiles_len-1] = ' ';
103 objfiles_str[objfiles_len-1] = '\0';
106 char *abidir = mkstr("bin/%s", abi);
110 char *udiprops_c = get_udipropsfile(opts, abi);
111 char *cmd = mkstr("%s -r %s -o bin/%s/%s -s %s",// %s.o",
112 linker, IniFile_Get(opts, abi, "LDFLAGS", ""),
113 abi, udiprops->ModuleName, objfiles_str, udiprops_c
115 printf("--- Linking: bin/%s/%s\n", abi, udiprops->ModuleName);
116 if( gbTraceEnabled ) {
117 printf(">> %s\n", cmd);
119 int rv = system(cmd);
127 char *get_objfile(tIniFile *opts, const char *abi, const char *srcfile)
129 return mkstr("%s.o", srcfile);
132 char *get_udipropsfile(tIniFile *opts, const char *abi)
134 return mkstr(".udiprops.c");