/************************************************************************** * * Copyright (C) 2000, International Business Machines * Corporation and others. All Rights Reserved. * *************************************************************************** * file name: gmake.c * encoding: ANSI X3.4 (1968) * tab size: 8 (not used) * indentation:4 * * created on: 2000may17 * created by: Steven \u24C7 Loomis * * Emit a GNU makefile */ #include "unicode/utypes.h" #include "cmemory.h" #include "cstring.h" #include "filestrm.h" #include "toolutil.h" #include "unewdata.h" #include "uoptions.h" #include "pkgtypes.h" #include "makefile.h" #include #include char linebuf[2048]; /* Write any setup/initialization stuff */ void pkg_mak_writeHeader(FileStream *f, const UPKGOptions *o) { sprintf(linebuf, "## Makefile for %s created by pkgdata\n" "## from ICU Version %s\n" "\n", o->shortName, U_ICU_VERSION); T_FileStream_writeLine(f, linebuf); sprintf(linebuf, "NAME=%s\n" "CNAME=%s\n" "TARGETDIR=%s\n" "TEMP_DIR=%s\n" "srcdir=$(TEMP_DIR)\n" "MODE=%s\n" "MAKEFILE=%s\n" "ENTRYPOINT=%s\n" "include %s\n" "\n\n\n", o->shortName, o->cShortName, o->targetDir, o->tmpDir, o->mode, o->makeFile, o->entryName, o->options); T_FileStream_writeLine(f, linebuf); /* TEMP_PATH and TARG_PATH will be empty if the respective dir is . */ /* Avoid //'s and .'s which confuse make ! */ if(!strcmp(o->tmpDir,".")) { T_FileStream_writeLine(f, "TEMP_PATH=\n"); } else { T_FileStream_writeLine(f, "TEMP_PATH=$(TEMP_DIR)/\n"); } if(!strcmp(o->targetDir,".")) { T_FileStream_writeLine(f, "TARG_PATH=\n"); } else { T_FileStream_writeLine(f, "TARG_PATH=$(TARGETDIR)/\n"); } sprintf(linebuf, "## List files [%d] containing data files to process (note: - means stdin)\n" "LISTFILES= ", pkg_countCharList(o->fileListFiles)); T_FileStream_writeLine(f, linebuf); pkg_writeCharListWrap(f, o->fileListFiles, " ", " \\\n",0); T_FileStream_writeLine(f, "\n\n\n"); sprintf(linebuf, "## Data Files [%d]\n" "DATAFILES= ", pkg_countCharList(o->files)); T_FileStream_writeLine(f, linebuf); pkg_writeCharListWrap(f, o->files, " ", " \\\n",-1); T_FileStream_writeLine(f, "\n\n\n"); sprintf(linebuf, "## Data File Paths [%d]\n" "DATAFILEPATHS= ", pkg_countCharList(o->filePaths)); T_FileStream_writeLine(f, linebuf); pkg_writeCharListWrap(f, o->filePaths, " ", " \\\n",0); T_FileStream_writeLine(f, "\n\n\n"); } /* Write a stanza in the makefile, with specified "target: parents... \n\n\tcommands" [etc] */ void pkg_mak_writeStanza(FileStream *f, const UPKGOptions *o, const char *target, CharList* parents, CharList* commands) { T_FileStream_write(f, target, strlen(target)); T_FileStream_write(f, " : ", 3); pkg_writeCharList(f, parents, " ",0); T_FileStream_write(f, "\n", 1); if(commands) { T_FileStream_write(f, "\t", 1); pkg_writeCharList(f, commands, "\n\t",0); } T_FileStream_write(f, "\n\n", 2); } /* write any cleanup/post stuff */ void pkg_mak_writeFooter(FileStream *f, const UPKGOptions *o) { /* nothing */ } void pkg_mak_writeObjRules(UPKGOptions *o, FileStream *makefile, CharList **objects, const char* objSuffix) { const char *p, *baseName; char *tmpPtr; char tmp[1024]; char stanza[1024]; char cfile[1024]; CharList *oTail = NULL; CharList *infiles; CharList *parents = NULL, *commands = NULL; int32_t genFileOffset = 0; /* offset from beginning of .c and .o file name, use to chop off package name for AS/400 */ infiles = o->filePaths; #if defined (OS400) if(infiles != NULL) { baseName = findBasename(infiles->str); p = uprv_strchr(baseName, '_'); if(p != NULL) { genFileOffset = (p-baseName)+1; /* "package_" - name + underscore */ } } #endif for(;infiles;infiles = infiles->next) { baseName = findBasename(infiles->str); p = uprv_strrchr(baseName, '.'); if( (p == NULL) || (*p == '\0' ) ) { continue; } uprv_strncpy(tmp, baseName, p-baseName); p++; uprv_strcpy(tmp+(p-1-baseName), "_"); /* to append */ uprv_strcat(tmp, p); uprv_strcat(tmp, objSuffix ); /* iSeries cannot have '-' in the .o objects. */ for( tmpPtr = tmp; *tmpPtr; tmpPtr++ ) { if ( *tmpPtr == '-' ) { *tmpPtr = '_'; } } *objects = pkg_appendToList(*objects, &oTail, uprv_strdup(tmp + genFileOffset)); /* Offset for AS/400 */ /* write source list */ strcpy(cfile,tmp); strcpy(cfile+strlen(cfile)-strlen(objSuffix), ".c" ); /* replace .o with .c */ /* Make up parents.. */ parents = pkg_appendToList(parents, NULL, uprv_strdup(infiles->str)); /* make up commands.. */ sprintf(stanza, "@$(INVOKE) $(GENCCODE) -n $(ENTRYPOINT) -d $(TEMP_DIR) $<"); commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); if(genFileOffset > 0) { /* for AS/400 */ sprintf(stanza, "@mv $(TEMP_PATH)%s $(TEMP_PATH)%s", cfile, cfile+genFileOffset); commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); } sprintf(stanza, "@$(COMPILE.c) -o $@ $(TEMP_DIR)/%s", cfile+genFileOffset); /* for AS/400 */ commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); sprintf(stanza, "@$(RMV) $(TEMP_DIR)/%s", cfile+genFileOffset); commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); sprintf(stanza, "$(TEMP_PATH)%s", tmp+genFileOffset); /* for AS/400 */ pkg_mak_writeStanza(makefile, o, stanza, parents, commands); pkg_deleteList(parents); pkg_deleteList(commands); parents = NULL; commands = NULL; } }