diff options
Diffstat (limited to 'Build/source/libs/icu/icu-xetex/tools/pkgdata/make.c')
-rw-r--r-- | Build/source/libs/icu/icu-xetex/tools/pkgdata/make.c | 415 |
1 files changed, 415 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-xetex/tools/pkgdata/make.c b/Build/source/libs/icu/icu-xetex/tools/pkgdata/make.c new file mode 100644 index 00000000000..630e1d92b87 --- /dev/null +++ b/Build/source/libs/icu/icu-xetex/tools/pkgdata/make.c @@ -0,0 +1,415 @@ +/************************************************************************** +* +* Copyright (C) 2000-2006, International Business Machines +* Corporation and others. All Rights Reserved. +* +*************************************************************************** +* file name: make.c +* encoding: ANSI X3.4 (1968) +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2000jul18 +* created by: Vladimir Weinstein +* created on: 2000may17 +* created by: Steven \u24C7 Loomis +* merged on: 2003sep14 +* merged by: George Rhoten +* merged from nmake.c and gmake.c +* +* Emit a NMAKE or GNU makefile +*/ + +#include "unicode/utypes.h" +#include "unicode/putil.h" +#include "makefile.h" +#include "cstring.h" +#include "cmemory.h" +#include <stdio.h> + +#ifdef U_MAKE_IS_NMAKE + +char linebuf[2048]; + +/* Write any setup/initialization stuff */ +void +pkg_mak_writeHeader(FileStream *f, const UPKGOptions *o) +{ + const char *appendVersion = NULL; + char *srcDir = convertToNativePathSeparators(uprv_strdup(o->srcDir)); + + if(o->version && !uprv_strstr(o->shortName,o->version)) { /* do not append version if + already contained in the name */ + appendVersion = o->version; + } + + sprintf(linebuf, "## Makefile for %s (%s) created by pkgdata\n" + "## from ICU Version %s\n" + "\n", + o->shortName, + o->libName, + U_ICU_VERSION); + T_FileStream_writeLine(f, linebuf); + + sprintf(linebuf, "NAME=%s%s\n" + "CNAME=%s\n" + "LIBNAME=%s\n" + "SRCDIR=%s\n" + "TARGETDIR=%s\n" + "TEMP_DIR=%s\n" + "MODE=%s\n" + "MAKEFILE=%s\n" + "ENTRYPOINT=%s\n" + "TARGET_VERSION=%s\n" + "MKINSTALLDIRS=mkdir\n" + "INSTALL_DATA=copy\n" + "RMV=del /F" + "\n\n\n", + o->shortName, + (appendVersion ? appendVersion : ""), + o->cShortName, + o->libName, + srcDir, + o->targetDir, + o->tmpDir, + o->mode, + o->makeFile, + o->entryName, + o->version); + T_FileStream_writeLine(f, linebuf); + + 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", 1); + + T_FileStream_writeLine(f, "\n\n\n"); + + uprv_free(srcDir); +} + +/* 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, (int32_t)uprv_strlen(target)); + T_FileStream_write(f, " : ", 3); + pkg_writeCharList(f, parents, " ",1); + 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) +{ + char buf[256]; + sprintf(buf, "\n\n# End of makefile for %s [%s mode]\n\n", o->shortName, o->mode); + T_FileStream_write(f, buf, (int32_t)uprv_strlen(buf)); +} + +#else /* #ifdef U_MAKE_IS_NMAKE */ + +#include "cmemory.h" +#include "filestrm.h" +#include "toolutil.h" +#include "unewdata.h" +#include "uoptions.h" +#include "pkgtypes.h" +#include <string.h> + +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" + "LIBNAME=%s\n" + "CNAME=%s\n" + "TARGETDIR=%s\n" + "TEMP_DIR=%s\n" + "srcdir=$(TEMP_DIR)\n" + "SRCDIR=%s\n" + "MODE=%s\n" + "MAKEFILE=%s\n" + "ENTRYPOINT=%s\n" + "include %s\n" + "\n\n\n", + o->shortName, + o->libName, + o->cShortName, + o->targetDir, + o->tmpDir, + o->srcDir, + 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 [%u] containing data files to process (note: - means stdin)\n" + "LISTFILES= ", + (int)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 [%u]\n" + "DATAFILES= ", + (int)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 [%u]\n" + "DATAFILEPATHS= ", + (int)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, uprv_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) +{ + T_FileStream_writeLine(f, "\nrebuild: clean all\n"); +} + + +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 */ + char *parentPath; + const char *tchar; + char tree[1024]; + + infiles = o->files; /* raw files - no paths other than tree paths */ + +#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 = infiles->str; /* skip the icudt28b/ part */ + 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 == U_FILE_SEP_CHAR ) { /* map tree names with underscores */ + *tmpPtr = '_'; + } + if ( *tmpPtr == '-' ) { + *tmpPtr = '_'; + } + } + + *objects = pkg_appendToList(*objects, &oTail, uprv_strdup(tmp + genFileOffset)); /* Offset for AS/400 */ + + /* write source list */ + uprv_strcpy(cfile,tmp); + uprv_strcpy(cfile+uprv_strlen(cfile)-uprv_strlen(objSuffix), ".c" ); /* replace .o with .c */ + + /* Make up parents.. */ + parentPath = uprv_malloc(1+uprv_strlen(baseName) + uprv_strlen("$(SRCDIR)/")); + sprintf(parentPath, "$(SRCDIR)/%s", baseName); + parents = pkg_appendToList(parents, NULL, parentPath); + + /* make up commands.. */ + /* search for tree.. */ + if((tchar=uprv_strchr(baseName, '/'))) { + tree[0]='_'; + strncpy(tree+1,baseName,tchar-baseName); + tree[tchar-baseName+1]=0; + } else { + tree[0] = 0; + } +#ifdef OS400 + sprintf(stanza, "$(INVOKE) $(GENCCODE) -n $(CNAME)%s -d $(TEMP_DIR) $(SRCDIR)/%s", tree, infiles->str); +#else + sprintf(stanza, "$(INVOKE) $(GENCCODE) -n $(CNAME)%s -d $(TEMP_DIR) $<", tree); +#endif + + if(uprv_strchr(baseName, '/')) { + /* append actual file - ex: coll_en_res otherwise the tree name will be lost */ + strcat(stanza, " -f "); + strncat(stanza, tmp, (strlen(tmp)-strlen(objSuffix))); + } + + commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); + +#ifdef OS400 + /* This builds the file into one .c file */ + sprintf(stanza, "@cat $(TEMP_PATH)%s >> $(TEMP_PATH)/$(NAME)all.c", cfile); + commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); + + sprintf(stanza, "@$(RMV) $(TEMP_DIR)/%s", cfile); + commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); + + T_FileStream_write(makefile, "\t", 1); + pkg_writeCharList(makefile, commands, "\n\t",0); + T_FileStream_write(makefile, "\n\n", 2); +#else + 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) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -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); +#endif + + pkg_deleteList(parents); + pkg_deleteList(commands); + parents = NULL; + commands = NULL; + } +} + +#endif /* #ifdef U_MAKE_IS_NMAKE */ + +void +pkg_mak_writeAssemblyHeader(FileStream *f, const UPKGOptions *o) +{ + T_FileStream_writeLine(f, "\n"); + T_FileStream_writeLine(f, "ifneq ($(GENCCODE_ASSEMBLY),)\n"); + T_FileStream_writeLine(f, "\n"); + T_FileStream_writeLine(f, "BASE_OBJECTS=$(NAME)_dat.o\n"); + T_FileStream_writeLine(f, "\n"); + T_FileStream_writeLine(f, "$(TEMP_DIR)/$(NAME).dat: $(CMNLIST) $(DATAFILEPATHS)\n"); + T_FileStream_writeLine(f, "\t$(INVOKE) $(ICUPKG) -t$(ICUDATA_CHAR) -c -s $(SRCDIR) -a $(CMNLIST) new $(TEMP_DIR)/$(CNAME).dat\n"); + T_FileStream_writeLine(f, "\n"); + T_FileStream_writeLine(f, "$(TEMP_DIR)/$(NAME)_dat.o : $(TEMP_DIR)/$(NAME).dat\n"); + T_FileStream_writeLine(f, "\t$(INVOKE) $(GENCCODE) $(GENCCODE_ASSEMBLY) -n $(NAME) -e $(ENTRYPOINT) -d $(TEMP_DIR) $<\n"); + T_FileStream_writeLine(f, "\t$(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $(TEMP_DIR)/$(NAME)_dat"ASM_SUFFIX"\n"); + T_FileStream_writeLine(f, "\t$(RMV) $(TEMP_DIR)/$(NAME)_dat"ASM_SUFFIX"\n"); + T_FileStream_writeLine(f, "\n"); + T_FileStream_writeLine(f, "else\n"); + T_FileStream_writeLine(f, "\n"); +} + +void +pkg_mak_writeAssemblyFooter(FileStream *f, const UPKGOptions *o) +{ + T_FileStream_writeLine(f, "\nendif\n"); +} + |