diff options
Diffstat (limited to 'Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.cpp')
-rw-r--r-- | Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.cpp | 112 |
1 files changed, 68 insertions, 44 deletions
diff --git a/Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.cpp b/Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.cpp index b2cd0ab5eb9..1f318ac0f3a 100644 --- a/Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.cpp +++ b/Build/source/libs/icu/icu-src/source/tools/pkgdata/pkgdata.cpp @@ -122,8 +122,9 @@ enum { QUIET, WITHOUT_ASSEMBLY, PDS_BUILD, - UWP_BUILD, - UWP_ARM_BUILD + WIN_UWP_BUILD, + WIN_DLL_ARCH, + WIN_DYNAMICBASE }; /* This sets the modes that are available */ @@ -167,7 +168,8 @@ static UOption options[]={ /*20*/ UOPTION_DEF( "without-assembly", 'w', UOPT_NO_ARG), /*21*/ UOPTION_DEF("zos-pds-build", 'z', UOPT_NO_ARG), /*22*/ UOPTION_DEF("windows-uwp-build", 'u', UOPT_NO_ARG), - /*23*/ UOPTION_DEF("windows-uwp-arm-build", 'a', UOPT_NO_ARG) + /*23*/ UOPTION_DEF("windows-DLL-arch", 'a', UOPT_REQUIRES_ARG), + /*24*/ UOPTION_DEF("windows-dynamicbase", 'b', UOPT_NO_ARG), }; /* This enum and the following char array should be kept in sync. */ @@ -258,7 +260,8 @@ const char options_help[][320]={ "Build the data without assembly code", "Build PDS dataset (zOS build only)", "Build for Universal Windows Platform (Windows build only)", - "Set DLL machine type for UWP to target windows ARM (Windows UWP build only)" + "Specify the DLL machine architecture for LINK.exe (Windows build only)", + "Ignored. Enable DYNAMICBASE on the DLL. This is now the default. (Windows build only)", }; const char *progname = "PKGDATA"; @@ -468,6 +471,10 @@ main(int argc, char* argv[]) { #endif } + if (options[WIN_DYNAMICBASE].doesOccur) { + fprintf(stdout, "Note: Ignoring option -b (windows-dynamicbase).\n"); + } + /* OK options are set up. Now the file lists. */ tail = NULL; for( n=1; n<argc; n++) { @@ -504,7 +511,6 @@ main(int argc, char* argv[]) { if (o.files != NULL) { pkg_deleteList(o.files); } - return result; } @@ -544,6 +550,7 @@ normal_command_mode: int result = system(cmd); if (result != 0) { fprintf(stderr, "-- return status = %d\n", result); + result = 1; // system() result code is platform specific. } if (cmd != cmdBuffer && cmd != command) { @@ -718,7 +725,13 @@ static int32_t pkg_executeOptions(UPKGOptions *o) { if (genccodeAssembly && (uprv_strlen(genccodeAssembly)>3) && checkAssemblyHeaderName(genccodeAssembly+3)) { - writeAssemblyCode(datFileNamePath, o->tmpDir, o->entryName, NULL, gencFilePath); + writeAssemblyCode( + datFileNamePath, + o->tmpDir, + o->entryName, + NULL, + gencFilePath, + sizeof(gencFilePath)); result = pkg_createWithAssemblyCode(targetDir, mode, gencFilePath); if (result != 0) { @@ -753,7 +766,14 @@ static int32_t pkg_executeOptions(UPKGOptions *o) { /* Try to detect the arch type, use NULL if unsuccessful */ char optMatchArch[10] = { 0 }; pkg_createOptMatchArch(optMatchArch); - writeObjectCode(datFileNamePath, o->tmpDir, o->entryName, (optMatchArch[0] == 0 ? NULL : optMatchArch), NULL, gencFilePath); + writeObjectCode( + datFileNamePath, + o->tmpDir, + o->entryName, + (optMatchArch[0] == 0 ? NULL : optMatchArch), + NULL, + gencFilePath, + sizeof(gencFilePath)); pkg_destroyOptMatchArch(optMatchArch); #if U_PLATFORM_IS_LINUX_BASED result = pkg_generateLibraryFile(targetDir, mode, gencFilePath); @@ -1350,8 +1370,8 @@ static int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, c if (IN_STATIC_MODE(mode)) { if (cmd == NULL) { - length = uprv_strlen(pkgDataFlags[AR]) + uprv_strlen(pkgDataFlags[ARFLAGS]) + uprv_strlen(targetDir) + - uprv_strlen(libFileNames[LIB_FILE_VERSION]) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[RANLIB]) + BUFFER_PADDING_SIZE; + length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[AR]) + uprv_strlen(pkgDataFlags[ARFLAGS]) + uprv_strlen(targetDir) + + uprv_strlen(libFileNames[LIB_FILE_VERSION]) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[RANLIB]) + BUFFER_PADDING_SIZE); if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == NULL) { fprintf(stderr, "Unable to allocate memory for command.\n"); return -1; @@ -1376,15 +1396,15 @@ static int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, c } } else /* if (IN_DLL_MODE(mode)) */ { if (cmd == NULL) { - length = uprv_strlen(pkgDataFlags[GENLIB]) + uprv_strlen(pkgDataFlags[LDICUDTFLAGS]) + + length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[GENLIB]) + uprv_strlen(pkgDataFlags[LDICUDTFLAGS]) + ((uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_VERSION_TMP])) * 2) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[LD_SONAME]) + uprv_strlen(pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR]) + - uprv_strlen(pkgDataFlags[RPATH_FLAGS]) + uprv_strlen(pkgDataFlags[BIR_FLAGS]) + BUFFER_PADDING_SIZE; + uprv_strlen(pkgDataFlags[RPATH_FLAGS]) + uprv_strlen(pkgDataFlags[BIR_FLAGS]) + BUFFER_PADDING_SIZE); #if U_PLATFORM == U_PF_CYGWIN - length += uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_CYGWIN_VERSION]); + length += static_cast<int32_t>(uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_CYGWIN_VERSION])); #elif U_PLATFORM == U_PF_MINGW - length += uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_MINGW]); + length += static_cast<int32_t>(uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_MINGW])); #endif if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == NULL) { fprintf(stderr, "Unable to allocate memory for command.\n"); @@ -1516,8 +1536,8 @@ static int32_t pkg_createWithAssemblyCode(const char *targetDir, const char mode uprv_strcpy(tempObjectFile, gencFilePath); tempObjectFile[uprv_strlen(tempObjectFile)-1] = 'o'; - length = uprv_strlen(pkgDataFlags[COMPILER]) + uprv_strlen(pkgDataFlags[LIBFLAGS]) - + uprv_strlen(tempObjectFile) + uprv_strlen(gencFilePath) + BUFFER_PADDING_SIZE; + length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[COMPILER]) + uprv_strlen(pkgDataFlags[LIBFLAGS]) + + uprv_strlen(tempObjectFile) + uprv_strlen(gencFilePath) + BUFFER_PADDING_SIZE); cmd = (char *)uprv_malloc(sizeof(char) * length); if (cmd == NULL) { @@ -1685,7 +1705,13 @@ static int32_t pkg_createWithoutAssemblyCode(UPKGOptions *o, const char *targetD printf("# Generating %s \n", gencmnFile); } - writeCCode(file, o->tmpDir, dataName[0] != 0 ? dataName : o->shortName, newName[0] != 0 ? newName : NULL, gencmnFile); + writeCCode( + file, + o->tmpDir, + dataName[0] != 0 ? dataName : o->shortName, + newName[0] != 0 ? newName : NULL, + gencmnFile, + sizeof(gencmnFile)); #ifdef USE_SINGLE_CCODE_FILE sprintf(cmd, "#include \"%s\"\n", gencmnFile); @@ -1758,14 +1784,12 @@ static int32_t pkg_createWithoutAssemblyCode(UPKGOptions *o, const char *targetD #ifdef WINDOWS_WITH_MSVC #define LINK_CMD "link.exe /nologo /release /out:" -#define LINK_FLAGS "/DLL /NOENTRY /MANIFEST:NO /implib:" -#ifdef _WIN64 -#define LINK_EXTRA_UWP_FLAGS "/NXCOMPAT /DYNAMICBASE /APPCONTAINER " -#else -#define LINK_EXTRA_UWP_FLAGS "/NXCOMPAT /SAFESEH /DYNAMICBASE /APPCONTAINER /MACHINE:X86" -#endif -#define LINK_EXTRA_UWP_FLAGS_ARM "/NXCOMPAT /DYNAMICBASE /APPCONTAINER /MACHINE:ARM" -#define LINK_EXTRA_NO_UWP_FLAGS "/base:0x4ad00000 " +#define LINK_FLAGS "/NXCOMPAT /DYNAMICBASE /DLL /NOENTRY /MANIFEST:NO /implib:" + +#define LINK_EXTRA_UWP_FLAGS "/APPCONTAINER " +#define LINK_EXTRA_UWP_FLAGS_X86_ONLY "/SAFESEH " + +#define LINK_EXTRA_FLAGS_MACHINE "/MACHINE:" #define LIB_CMD "LIB.exe /nologo /out:" #define LIB_FILE "icudt.lib" #define LIB_EXT UDATA_LIB_SUFFIX @@ -1845,23 +1869,23 @@ static int32_t pkg_createWindowsDLL(const char mode, const char *gencFilePath, U return 0; } - char *extraFlags = ""; + char extraFlags[SMALL_BUFFER_MAX_SIZE] = ""; #ifdef WINDOWS_WITH_MSVC - if (options[UWP_BUILD].doesOccur) - { - if (options[UWP_ARM_BUILD].doesOccur) - { - extraFlags = LINK_EXTRA_UWP_FLAGS_ARM; - } - else - { - extraFlags = LINK_EXTRA_UWP_FLAGS; + if (options[WIN_UWP_BUILD].doesOccur) { + uprv_strcat(extraFlags, LINK_EXTRA_UWP_FLAGS); + + if (options[WIN_DLL_ARCH].doesOccur) { + if (uprv_strcmp(options[WIN_DLL_ARCH].value, "X86") == 0) { + uprv_strcat(extraFlags, LINK_EXTRA_UWP_FLAGS_X86_ONLY); + } } } - else - { - extraFlags = LINK_EXTRA_NO_UWP_FLAGS; + + if (options[WIN_DLL_ARCH].doesOccur) { + uprv_strcat(extraFlags, LINK_EXTRA_FLAGS_MACHINE); + uprv_strcat(extraFlags, options[WIN_DLL_ARCH].value); } + #endif sprintf(cmd, "%s\"%s\" %s %s\"%s\" \"%s\" %s", LINK_CMD, @@ -1905,7 +1929,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { char *tmpGenlibFlagBuffer = NULL; int32_t i, offset; - length = uprv_strlen(flag) + 1; + length = static_cast<int32_t>(uprv_strlen(flag) + 1); tmpGenlibFlagBuffer = (char *)uprv_malloc(length); if (tmpGenlibFlagBuffer == NULL) { /* Memory allocation error */ @@ -1915,7 +1939,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { uprv_strcpy(tmpGenlibFlagBuffer, flag); - offset = uprv_strlen(rm_cmd); + offset = static_cast<int32_t>(uprv_strlen(rm_cmd)); for (i = 0; i < (length - offset); i++) { flag[i] = tmpGenlibFlagBuffer[offset + i]; @@ -1928,7 +1952,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { } flag = pkgDataFlags[BIR_FLAGS]; - length = uprv_strlen(pkgDataFlags[BIR_FLAGS]); + length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[BIR_FLAGS])); for (int32_t i = 0; i < length; i++) { if (flag[i] == MAP_FILE_EXT[count]) { @@ -1988,7 +2012,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { int32_t length = 0; flag = pkgDataFlags[GENLIB]; - length = uprv_strlen(pkgDataFlags[GENLIB]); + length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[GENLIB])); int32_t position = length - 1; @@ -2006,7 +2030,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { int32_t length = 0; flag = pkgDataFlags[GENLIB]; - length = uprv_strlen(pkgDataFlags[GENLIB]); + length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[GENLIB])); int32_t position = length - 1; @@ -2117,8 +2141,8 @@ static void loadLists(UPKGOptions *o, UErrorCode *status) fprintf(stderr, "pkgdata: Error: absolute path encountered. Old style paths are not supported. Use relative paths such as 'fur.res' or 'translit%cfur.res'.\n\tBad path: '%s'\n", U_FILE_SEP_CHAR, s); exit(U_ILLEGAL_ARGUMENT_ERROR); } - tmpLength = uprv_strlen(o->srcDir) + - uprv_strlen(s) + 5; /* 5 is to add a little extra space for, among other things, PKGDATA_FILE_SEP_STRING */ + /* The +5 is to add a little extra space for, among other things, PKGDATA_FILE_SEP_STRING */ + tmpLength = static_cast<int32_t>(uprv_strlen(o->srcDir) + uprv_strlen(s) + 5); if((tmp = (char *)uprv_malloc(tmpLength)) == NULL) { fprintf(stderr, "pkgdata: Error: Unable to allocate tmp buffer size: %d\n", tmpLength); exit(U_MEMORY_ALLOCATION_ERROR); |