X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Tools%2Fudibuild%2Fsrc%2Fbuild.c;h=2ccd2b2aa6b088a110a1ba3719a5a181f5aff64d;hb=4c6e540b4b8a74b11e805a3e44ae7f7ebfba85e3;hp=b070c37301c63256ad7cd4c88452a0f0638f606d;hpb=699eb5715ccb595a544df82d8bb8bf2a17c38d32;p=tpg%2Facess2.git diff --git a/Tools/udibuild/src/build.c b/Tools/udibuild/src/build.c index b070c373..2ccd2b2a 100644 --- a/Tools/udibuild/src/build.c +++ b/Tools/udibuild/src/build.c @@ -7,15 +7,13 @@ */ #include #include +#include +#include // mkdir #include "include/build.h" #include "include/common.h" -#ifndef __GNUC__ -# define __attribute__(...) -#endif - // === PROTOTYPES === -char *get_objfile(tIniFile *opts, const char *srcfile); +char *get_objfile(tIniFile *opts, const char *abi, const char *srcfile); // === CODE === int Build_CompileFile(tIniFile *opts, const char *abi, tUdiprops *udiprops, tUdiprops_Srcfile *srcfile) @@ -24,7 +22,7 @@ int Build_CompileFile(tIniFile *opts, const char *abi, tUdiprops *udiprops, tUdi 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; + return -1; } // Build up compiler's command line @@ -32,7 +30,7 @@ int Build_CompileFile(tIniFile *opts, const char *abi, tUdiprops *udiprops, tUdi // - defines from udiprops // - Object file is srcfile with .o appended // > Place in 'obj/' dir? - char *objfile = get_objfile(opts, srcfile->Filename); + 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, @@ -49,10 +47,48 @@ int Build_CompileFile(tIniFile *opts, const char *abi, tUdiprops *udiprops, tUdi int Build_LinkObjects(tIniFile *opts, const char *abi, tUdiprops *udiprops) { - return 0; + 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 *cmd = mkstr("%s %s -o bin/%s/%s -r %s", + linker, IniFile_Get(opts, abi, "LDFLAGS", ""), + abi, udiprops->ModuleName, objfiles_str); + printf("--- Linking: bin/%s/%s\n", abi, udiprops->ModuleName); + int rv = system(cmd); + free(cmd); + free(objfiles_str); + + return rv; } -char *get_objfile(tIniFile *opts, const char *srcfile) +char *get_objfile(tIniFile *opts, const char *abi, const char *srcfile) { return mkstr("%s.o", srcfile); } +