4d0b294781cc59d55c67a65ba378538caee23ba9
[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          int rv = system(cmd);
44         free(cmd);
45         free(objfile);
46         
47         return rv;
48 }
49
50 int Build_CreateUdiprops(tIniFile *opts, const char *abi, tUdiprops *udiprops)
51 {
52         const char *cc_prog = IniFile_Get(opts, abi, "CC", NULL);
53         
54         char    *filename = get_udipropsfile(opts, abi);
55         FILE *fp = fopen(filename, "w");
56         fprintf(fp, "char udiprops[] __attribute__((section(\".udiprops\"))) = \n");
57         for( int i = 0; i < udiprops->nLines; i ++ ) {
58                 // TODO: Escape " in string
59                 fprintf(fp, " \"%s\"\n", udiprops->Lines[i]);
60         }
61         fprintf(fp, " ;\n");
62         fclose(fp);
63
64         char *cmd = mkstr("%s %s -c %s -o %s.o",
65                 cc_prog, IniFile_Get(opts, abi, "CFLAGS", ""),
66                 filename, filename);
67
68         int rv = system(cmd);
69         free(cmd);
70         unlink(filename);       
71         free(filename);
72
73         return rv;
74 }
75
76 int Build_LinkObjects(tIniFile *opts, const char *abi, tUdiprops *udiprops)
77 {
78         const char *linker = IniFile_Get(opts, abi, "LD", NULL);
79         if( !linker ) {
80                 fprintf(stderr, "No 'LD' defined for ABI %s\n", abi);
81                 return -1;
82         }
83
84         char    *objfiles[udiprops->nSourceFiles];
85         size_t  objfiles_len = 0;
86         for( int i = 0; i < udiprops->nSourceFiles; i ++ ) {
87                 objfiles[i] = get_objfile(opts, abi, udiprops->SourceFiles[i]->Filename);
88                 objfiles_len += strlen(objfiles[i])+1;
89         }
90         
91         // Create command string
92         char *objfiles_str = malloc(objfiles_len);
93         objfiles_len = 0;
94         for( int i = 0; i < udiprops->nSourceFiles; i ++ ) {
95                 strcpy(objfiles_str + objfiles_len, objfiles[i]);
96                 objfiles_len += strlen(objfiles[i])+1;
97                 objfiles_str[objfiles_len-1] = ' ';
98                 free( objfiles[i] );
99         }
100         objfiles_str[objfiles_len-1] = '\0';
101
102         mkdir("bin", 0755);
103         char *abidir = mkstr("bin/%s", abi);
104         mkdir(abidir, 0755);
105         free(abidir);
106         
107         char *udiprops_c = get_udipropsfile(opts, abi);
108         char *cmd = mkstr("%s -r %s -o bin/%s/%s -s %s",// %s.o",
109                 linker, IniFile_Get(opts, abi, "LDFLAGS", ""),
110                 abi, udiprops->ModuleName, objfiles_str, udiprops_c
111                 );
112         printf("--- Linking: bin/%s/%s\n", abi, udiprops->ModuleName);
113         printf("%s\n", cmd);
114         int rv = system(cmd);
115         free(cmd);
116         free(udiprops_c);
117         free(objfiles_str);
118
119         return rv;
120 }
121
122 char *get_objfile(tIniFile *opts, const char *abi, const char *srcfile)
123 {
124         return mkstr("%s.o", srcfile);
125 }
126
127 char *get_udipropsfile(tIniFile *opts, const char *abi)
128 {
129         return mkstr(".udiprops.c");
130 }
131

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