88f047385cd623f1bf9627c111acfe1cb36fa129
[tpg/acess2.git] / UDI / Tools / udibuild_src / build.c
1 /*
2  * udibuild - UDI Compilation Utility
3  * - By John Hodge (thePowersGang)
4  *
5  * build.c
6  * - Compilation functions
7  */
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <string.h>
11 #include <sys/stat.h>   // mkdir
12 #include <unistd.h>     // unlink
13 #include "include/build.h"
14 #include "include/common.h"
15
16 // === PROTOTYPES ===
17 char    *get_objfile(tIniFile *opts, const char *abi, const char *srcfile);
18 char    *get_udipropsfile(tIniFile *opts, const char *abi);
19
20 // === CODE ===
21 int Build_CompileFile(tIniFile *opts, const char *abi, tUdiprops *udiprops, tUdiprops_Srcfile *srcfile)
22 {
23         // Select compiler from opts [abi]
24         const char *cc_prog = IniFile_Get(opts, abi, "CC", NULL);
25         if( !cc_prog ) {
26                 fprintf(stderr, "No 'CC' defined for ABI %s\n", abi);
27                 return -1;
28         }
29         
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",
37                 cc_prog,
38                 abi,
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);
45         }
46          int rv = system(cmd);
47         free(cmd);
48         free(objfile);
49         
50         return rv;
51 }
52
53 int Build_CreateUdiprops(tIniFile *opts, const char *abi, tUdiprops *udiprops)
54 {
55         const char *cc_prog = IniFile_Get(opts, abi, "CC", NULL);
56         
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]);
63         }
64         fprintf(fp, " ;\n");
65         fclose(fp);
66
67         char *cmd = mkstr("%s %s -c %s -o %s.o",
68                 cc_prog, IniFile_Get(opts, abi, "CFLAGS", ""),
69                 filename, filename);
70
71         int rv = system(cmd);
72         free(cmd);
73         unlink(filename);       
74         free(filename);
75
76         return rv;
77 }
78
79 int Build_LinkObjects(tIniFile *opts, const char *abi, tUdiprops *udiprops)
80 {
81         const char *linker = IniFile_Get(opts, abi, "LD", NULL);
82         if( !linker ) {
83                 fprintf(stderr, "No 'LD' defined for ABI %s\n", abi);
84                 return -1;
85         }
86
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;
92         }
93         
94         // Create command string
95         char *objfiles_str = malloc(objfiles_len);
96         objfiles_len = 0;
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] = ' ';
101                 free( objfiles[i] );
102         }
103         objfiles_str[objfiles_len-1] = '\0';
104
105         mkdir("bin", 0755);
106         char *abidir = mkstr("bin/%s", abi);
107         mkdir(abidir, 0755);
108         free(abidir);
109         
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
114                 );
115         printf("--- Linking: bin/%s/%s\n", abi, udiprops->ModuleName);
116         if( gbTraceEnabled ) {
117                 printf(">> %s\n", cmd);
118         }
119         int rv = system(cmd);
120         free(cmd);
121         free(udiprops_c);
122         free(objfiles_str);
123
124         return rv;
125 }
126
127 char *get_objfile(tIniFile *opts, const char *abi, const char *srcfile)
128 {
129         return mkstr("%s.o", srcfile);
130 }
131
132 char *get_udipropsfile(tIniFile *opts, const char *abi)
133 {
134         return mkstr(".udiprops.c");
135 }
136

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