185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/****************************************************************************** 21b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * Copyright (C) 2000-2015, International Business Machines 385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Corporation and others. All Rights Reserved. 485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ******************************************************************************* 5103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * file name: pkgdata.cpp 685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * encoding: ANSI X3.4 (1968) 785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * tab size: 8 (not used) 885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * indentation:4 985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * 1085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * created on: 2000may15 1185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * created by: Steven \u24C7 Loomis 1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * 1385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * This program packages the ICU data into different forms 1485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * (DLL, common data, etc.) 1585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 1685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 17103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius// Defines _XOPEN_SOURCE for access to POSIX functions. 18103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius// Must be before any other #includes. 19103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "uposixdefs.h" 2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/utypes.h" 2285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 23103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/putil.h" 24103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "putilimp.h" 25103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if U_HAVE_POPEN 27103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if (U_PF_MINGW <= U_PLATFORM || U_PLATFORM <= U_PF_CYGWIN) && defined(__STRICT_ANSI__) 28b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* popen/pclose aren't defined in strict ANSI on Cygwin and MinGW */ 2985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#undef __STRICT_ANSI__ 3085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 3285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "cmemory.h" 3485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "cstring.h" 3585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "filestrm.h" 3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "toolutil.h" 3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/uclean.h" 3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unewdata.h" 3985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "uoptions.h" 4085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "package.h" 4185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "pkg_icu.h" 4285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "pkg_genc.h" 4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "pkg_gencmn.h" 4485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "flagparser.h" 4585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "filetools.h" 46f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#include "charstr.h" 4785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 4885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if U_HAVE_POPEN 4985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho# include <unistd.h> 5085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 51103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <stdio.h> 5385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <stdlib.h> 5485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 5585bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_CDECL_BEGIN 5685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "pkgtypes.h" 5785bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_CDECL_END 5885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void loadLists(UPKGOptions *o, UErrorCode *status); 6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_executeOptions(UPKGOptions *o); 6385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef WINDOWS_WITH_MSVC 6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_createWindowsDLL(const char mode, const char *gencFilePath, UPKGOptions *o); 6685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 6750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int32_t pkg_createSymLinks(const char *targetDir, UBool specialHandling=FALSE); 68103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic int32_t pkg_installLibrary(const char *installDir, const char *dir, UBool noVersion); 6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_installFileMode(const char *installDir, const char *srcDir, const char *fileListName); 7027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int32_t pkg_installCommonMode(const char *installDir, const char *fileName); 7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef BUILD_DATA_WITHOUT_ASSEMBLY 7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_createWithoutAssemblyCode(UPKGOptions *o, const char *targetDir, const char mode); 7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#ifdef CAN_WRITE_OBJ_CODE 771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertstatic void pkg_createOptMatchArch(char *optMatchArch); 781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertstatic void pkg_destroyOptMatchArch(char *optMatchArch); 791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#endif 801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_createWithAssemblyCode(const char *targetDir, const char mode, const char *gencFilePath); 82fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, const char *objectFile, char *command = NULL, UBool specialHandling=FALSE); 8385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_archiveLibrary(const char *targetDir, const char *version, UBool reverseExt); 84103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void createFileNames(UPKGOptions *o, const char mode, const char *version_major, const char *version, const char *libName, const UBool reverseExt, UBool noVersion); 8527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int32_t initializePkgDataFlags(UPKGOptions *o); 8685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 8750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int32_t pkg_getOptionsFromICUConfig(UBool verbose, UOption *option); 8850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int runCommand(const char* command, UBool specialHandling=FALSE); 8985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 90103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define IN_COMMON_MODE(mode) (mode == 'a' || mode == 'c') 91103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define IN_DLL_MODE(mode) (mode == 'd' || mode == 'l') 92103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define IN_STATIC_MODE(mode) (mode == 's') 93103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define IN_FILES_MODE(mode) (mode == 'f') 94103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 9585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoenum { 9685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho NAME, 9785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho BLDOPT, 9885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho MODE, 9985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho HELP, 10085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho HELP_QUESTION_MARK, 10185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho VERBOSE, 10285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho COPYRIGHT, 10385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho COMMENT, 10485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DESTDIR, 10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho REBUILD, 10685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho TEMPDIR, 10785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho INSTALL, 10885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho SOURCEDIR, 10985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ENTRYPOINT, 11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho REVISION, 11185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho FORCE_PREFIX, 11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIBNAME, 113103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius QUIET, 114103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius WITHOUT_ASSEMBLY, 115103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius PDS_BUILD 11685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 11785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 11885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* This sets the modes that are available */ 11985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic struct { 12085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *name, *alt_name; 12185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *desc; 12285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} modes[] = { 12385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "files", 0, "Uses raw data files (no effect). Installation copies all files to the target location." }, 124103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_HAS_WIN32_API 12585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "dll", "library", "Generates one common data file and one shared library, <package>.dll"}, 12685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "common", "archive", "Generates just the common file, <package>.dat"}, 12785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "static", "static", "Generates one statically linked library, " LIB_PREFIX "<package>" UDATA_LIB_SUFFIX } 12885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else 12985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef UDATA_SO_SUFFIX 13085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "dll", "library", "Generates one shared library, <package>" UDATA_SO_SUFFIX }, 13185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 13285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "common", "archive", "Generates one common data file, <package>.dat" }, 13385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "static", "static", "Generates one statically linked library, " LIB_PREFIX "<package>" UDATA_LIB_SUFFIX } 13485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 13585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 13685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 13785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic UOption options[]={ 13885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*00*/ UOPTION_DEF( "name", 'p', UOPT_REQUIRES_ARG), 13985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*01*/ UOPTION_DEF( "bldopt", 'O', UOPT_REQUIRES_ARG), /* on Win32 it is release or debug */ 14085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*02*/ UOPTION_DEF( "mode", 'm', UOPT_REQUIRES_ARG), 14185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*03*/ UOPTION_HELP_H, /* -h */ 14285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*04*/ UOPTION_HELP_QUESTION_MARK, /* -? */ 14385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*05*/ UOPTION_VERBOSE, /* -v */ 14485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*06*/ UOPTION_COPYRIGHT, /* -c */ 14585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*07*/ UOPTION_DEF( "comment", 'C', UOPT_REQUIRES_ARG), 14685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*08*/ UOPTION_DESTDIR, /* -d */ 14785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*11*/ UOPTION_DEF( "rebuild", 'F', UOPT_NO_ARG), 14885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*12*/ UOPTION_DEF( "tempdir", 'T', UOPT_REQUIRES_ARG), 14985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*13*/ UOPTION_DEF( "install", 'I', UOPT_REQUIRES_ARG), 15085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*14*/ UOPTION_SOURCEDIR , 15185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*15*/ UOPTION_DEF( "entrypoint", 'e', UOPT_REQUIRES_ARG), 15285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*16*/ UOPTION_DEF( "revision", 'r', UOPT_REQUIRES_ARG), 15385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*17*/ UOPTION_DEF( "force-prefix", 'f', UOPT_NO_ARG), 15485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*18*/ UOPTION_DEF( "libname", 'L', UOPT_REQUIRES_ARG), 155103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /*19*/ UOPTION_DEF( "quiet", 'q', UOPT_NO_ARG), 156103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /*20*/ UOPTION_DEF( "without-assembly", 'w', UOPT_NO_ARG), 157103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /*21*/ UOPTION_DEF( "zos-pds-build", 'z', UOPT_NO_ARG) 15885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 15985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 160103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/* This enum and the following char array should be kept in sync. */ 16185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoenum { 16285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho GENCCODE_ASSEMBLY_TYPE, 16385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho SO_EXT, 16485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho SOBJ_EXT, 16585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho A_EXT, 16685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIBPREFIX, 16785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_EXT_ORDER, 16885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho COMPILER, 16985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIBFLAGS, 17085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho GENLIB, 17185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LDICUDTFLAGS, 17285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LD_SONAME, 17385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho RPATH_FLAGS, 17485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho BIR_FLAGS, 17585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho AR, 17685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ARFLAGS, 17785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho RANLIB, 17885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho INSTALL_CMD, 17985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho PKGDATA_FLAGS_SIZE 18085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 181103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic const char* FLAG_NAMES[PKGDATA_FLAGS_SIZE] = { 182103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "GENCCODE_ASSEMBLY_TYPE", 183103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "SO", 184103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "SOBJ", 185103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "A", 186103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "LIBPREFIX", 187103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "LIB_EXT_ORDER", 188103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "COMPILE", 189103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "LIBFLAGS", 190103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "GENLIB", 191103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "LDICUDTFLAGS", 192103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "LD_SONAME", 193103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "RPATH_FLAGS", 194103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "BIR_LDFLAGS", 195103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "AR", 196103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "ARFLAGS", 197103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "RANLIB", 198103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "INSTALL_CMD" 199103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}; 20085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic char **pkgDataFlags = NULL; 20185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 20285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoenum { 20385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_FILE, 20485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_FILE_VERSION_MAJOR, 20585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_FILE_VERSION, 20685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_FILE_VERSION_TMP, 207103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_CYGWIN 20885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_FILE_CYGWIN, 209103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius LIB_FILE_CYGWIN_VERSION, 210103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_MINGW 211103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius LIB_FILE_MINGW, 212fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#elif U_PLATFORM == U_PF_OS390 213fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius LIB_FILE_OS390BATCH_MAJOR, 214fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius LIB_FILE_OS390BATCH_VERSION, 21585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 21685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_FILENAMES_SIZE 21785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 21885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic char libFileNames[LIB_FILENAMES_SIZE][256]; 21985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 22050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UPKGOptions *pkg_checkFlag(UPKGOptions *o); 22185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 22285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoconst char options_help[][320]={ 22385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Set the data name", 22485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef U_MAKE_IS_NMAKE 22585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "The directory where the ICU is located (e.g. <ICUROOT> which contains the bin directory)", 22685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else 22785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Specify options for the builder.", 22885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 22985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Specify the mode of building (see below; default: common)", 23085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "This usage text", 23185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "This usage text", 23285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Make the output verbose", 23385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Use the standard ICU copyright", 23485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Use a custom comment (instead of the copyright)", 23585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Specify the destination directory for files", 23685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Force rebuilding of all data", 23785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Specify temporary dir (default: output dir)", 23885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Install the data (specify target)", 23985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Specify a custom source directory", 24085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Specify a custom entrypoint name (default: short name)", 24150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "Specify a version when packaging in dll or static mode", 24285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Add package to all file names if not present", 24385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Library name to build (if different than package name)", 244103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "Quite mode. (e.g. Do not output a readme file for static libraries)", 245fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "Build the data without assembly code", 246fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "Build PDS dataset (zOS build only)" 24785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 24885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 24985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoconst char *progname = "PKGDATA"; 25085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 25185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint 25285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Homain(int argc, char* argv[]) { 25385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int result = 0; 25485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* FileStream *out; */ 25585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UPKGOptions o; 25685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho CharList *tail; 25785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool needsHelp = FALSE; 25885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 25985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* char tmp[1024]; */ 26085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t i; 26185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t n; 26285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 26385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho U_MAIN_INIT_ARGS(argc, argv); 26485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 26585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho progname = argv[0]; 26685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 26785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho options[MODE].value = "common"; 26885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 26985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* read command line options */ 27085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); 27185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 27285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* error handling, printing usage message */ 27385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* I've decided to simply print an error and quit. This tool has too 27485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho many options to just display them all of the time. */ 27585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 27685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(options[HELP].doesOccur || options[HELP_QUESTION_MARK].doesOccur) { 27785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho needsHelp = TRUE; 27885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 27985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho else { 28085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!needsHelp && argc<0) { 28185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, 28285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "%s: error in command line argument \"%s\"\n", 28385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho progname, 28485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho argv[-argc]); 28585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Run '%s --help' for help.\n", progname); 28685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 1; 28785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 28885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 28985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 29050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) 29150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(!options[BLDOPT].doesOccur && uprv_strcmp(options[MODE].value, "common") != 0) { 29250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (pkg_getOptionsFromICUConfig(options[VERBOSE].doesOccur, &options[BLDOPT]) != 0) { 29350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, " required parameter is missing: -O is required for static and shared builds.\n"); 29485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Run '%s --help' for help.\n", progname); 29585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 1; 29685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 29785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 29885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else 29985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(options[BLDOPT].doesOccur) { 30085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stdout, "Warning: You are using the -O option which is not needed for MSVC build on Windows.\n"); 30185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 30285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 30385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 30485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!options[NAME].doesOccur) /* -O we already have - don't report it. */ 30585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 30685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, " required parameter -p is missing \n"); 30785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Run '%s --help' for help.\n", progname); 30885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 1; 30985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 31085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 31185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(argc == 1) { 31285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, 31385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "No input files specified.\n" 31485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Run '%s --help' for help.\n", progname); 31585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 1; 31685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 31785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } /* end !needsHelp */ 31885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 31985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(argc<0 || needsHelp ) { 32085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, 32185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "usage: %s [-options] [-] [packageFile] \n" 32285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "\tProduce packaged ICU data from the given list(s) of files.\n" 32385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "\t'-' by itself means to read from stdin.\n" 32485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "\tpackageFile is a text file containing the list of files to package.\n", 32585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho progname); 32685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 32785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "\n options:\n"); 32885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i=0;i<(sizeof(options)/sizeof(options[0]));i++) { 32985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "%-5s -%c %s%-10s %s\n", 33085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho (i<1?"[REQ]":""), 33185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho options[i].shortName, 33285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho options[i].longName ? "or --" : " ", 33385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho options[i].longName ? options[i].longName : "", 33485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho options_help[i]); 33585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 33685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 33785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "modes: (-m option)\n"); 33885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i=0;i<(sizeof(modes)/sizeof(modes[0]));i++) { 33985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, " %-9s ", modes[i].name); 34085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (modes[i].alt_name) { 34185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "/ %-9s", modes[i].alt_name); 34285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 34385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, " "); 34485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 34585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, " %s\n", modes[i].desc); 34685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 34785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 1; 34885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 34985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 35085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* OK, fill in the options struct */ 35185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memset(&o, 0, sizeof(o)); 35285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 35385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.mode = options[MODE].value; 35485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.version = options[REVISION].doesOccur ? options[REVISION].value : 0; 35585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 35685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.shortName = options[NAME].value; 35785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 35885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t len = (int32_t)uprv_strlen(o.shortName); 35985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *csname, *cp; 36085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *sp; 36185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 36285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho cp = csname = (char *) uprv_malloc((len + 1 + 1) * sizeof(*o.cShortName)); 36385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (*(sp = o.shortName)) { 36485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *cp++ = isalpha(*sp) ? * sp : '_'; 36585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (++sp; *sp; ++sp) { 36685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *cp++ = isalnum(*sp) ? *sp : '_'; 36785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 36885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 36985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *cp = 0; 37085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 37185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.cShortName = csname; 37285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 37385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 37485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(options[LIBNAME].doesOccur) { /* get libname from shortname, or explicit -L parameter */ 37585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.libName = options[LIBNAME].value; 37685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 37785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.libName = o.shortName; 37885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 37985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 38085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(options[QUIET].doesOccur) { 38185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.quiet = TRUE; 38285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 38385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.quiet = FALSE; 38485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 38585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 386103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(options[PDS_BUILD].doesOccur) { 387fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if U_PLATFORM == U_PF_OS390 388103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o.pdsbuild = TRUE; 389fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#else 390fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius o.pdsbuild = FALSE; 391fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fprintf(stdout, "Warning: You are using the -z option which only works on z/OS.\n"); 392fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 393fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif 394103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 395103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o.pdsbuild = FALSE; 396103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 397103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 39885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.verbose = options[VERBOSE].doesOccur; 39985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 40050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 40150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) /* on UNIX, we'll just include the file... */ 40250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (options[BLDOPT].doesOccur) { 40350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho o.options = options[BLDOPT].value; 40450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 40550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho o.options = NULL; 40650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 40785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 40885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(options[COPYRIGHT].doesOccur) { 40985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.comment = U_COPYRIGHT_STRING; 41085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else if (options[COMMENT].doesOccur) { 41185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.comment = options[COMMENT].value; 41285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 41385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 41485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if( options[DESTDIR].doesOccur ) { 41585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.targetDir = options[DESTDIR].value; 41685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 41785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.targetDir = "."; /* cwd */ 41885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 41985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 42085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.rebuild = options[REBUILD].doesOccur; 42185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 42285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if( options[TEMPDIR].doesOccur ) { 42385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.tmpDir = options[TEMPDIR].value; 42485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 42585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.tmpDir = o.targetDir; 42685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 42785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 42885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if( options[INSTALL].doesOccur ) { 42985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.install = options[INSTALL].value; 43085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 43185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.install = NULL; 43285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 43385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 43485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if( options[SOURCEDIR].doesOccur ) { 43585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.srcDir = options[SOURCEDIR].value; 43685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 43785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.srcDir = "."; 43885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 43985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 44085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if( options[ENTRYPOINT].doesOccur ) { 44185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.entryName = options[ENTRYPOINT].value; 44285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 44385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.entryName = o.cShortName; 44485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 44585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 446103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o.withoutAssembly = FALSE; 447103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (options[WITHOUT_ASSEMBLY].doesOccur) { 448103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifndef BUILD_DATA_WITHOUT_ASSEMBLY 449103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, "Warning: You are using the option to build without assembly code which is not supported on this platform.\n"); 450103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, "Warning: This option will be ignored.\n"); 451103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 452103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o.withoutAssembly = TRUE; 453103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 454103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 455103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 45685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* OK options are set up. Now the file lists. */ 45785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tail = NULL; 45885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for( n=1; n<argc; n++) { 45985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.fileListFiles = pkg_appendToList(o.fileListFiles, &tail, uprv_strdup(argv[n])); 46085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 46185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 46285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* load the files */ 46385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho loadLists(&o, &status); 46485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if( U_FAILURE(status) ) { 46585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "error loading input file lists: %s\n", u_errorName(status)); 46685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 2; 46785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 46885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 46985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = pkg_executeOptions(&o); 47085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 47185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (pkgDataFlags != NULL) { 47285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (n = 0; n < PKGDATA_FLAGS_SIZE; n++) { 47385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (pkgDataFlags[n] != NULL) { 47485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(pkgDataFlags[n]); 47585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 47685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 47785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(pkgDataFlags); 47885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 47985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 48085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o.cShortName != NULL) { 48185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free((char *)o.cShortName); 48285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 48385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o.fileListFiles != NULL) { 48485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkg_deleteList(o.fileListFiles); 48585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 48685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o.filePaths != NULL) { 48785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkg_deleteList(o.filePaths); 48885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 48985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o.files != NULL) { 49085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkg_deleteList(o.files); 49185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 49285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 49385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 49485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 49585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 49650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int runCommand(const char* command, UBool specialHandling) { 49727f654740f2a26ad62a5c155af9199af9e69b889claireho char *cmd = NULL; 49827f654740f2a26ad62a5c155af9199af9e69b889claireho char cmdBuffer[SMALL_BUFFER_MAX_SIZE]; 49927f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t len = strlen(command); 50027f654740f2a26ad62a5c155af9199af9e69b889claireho 50127f654740f2a26ad62a5c155af9199af9e69b889claireho if (len == 0) { 50227f654740f2a26ad62a5c155af9199af9e69b889claireho return 0; 50327f654740f2a26ad62a5c155af9199af9e69b889claireho } 50450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 50550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!specialHandling) { 506103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if defined(USING_CYGWIN) || U_PLATFORM == U_PF_MINGW || U_PLATFORM == U_PF_OS400 507b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ((len + BUFFER_PADDING_SIZE) >= SMALL_BUFFER_MAX_SIZE) { 508b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho cmd = (char *)uprv_malloc(len + BUFFER_PADDING_SIZE); 50927f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 51027f654740f2a26ad62a5c155af9199af9e69b889claireho cmd = cmdBuffer; 51127f654740f2a26ad62a5c155af9199af9e69b889claireho } 512103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if defined(USING_CYGWIN) || U_PLATFORM == U_PF_MINGW 51350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "bash -c \"%s\"", command); 51450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 515103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS400 51650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "QSH CMD('%s')", command); 51727f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 51850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else 51950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho goto normal_command_mode; 52050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 52150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 522103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !(defined(USING_CYGWIN) || U_PLATFORM == U_PF_MINGW || U_PLATFORM == U_PF_OS400) 52350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehonormal_command_mode: 524103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 52527f654740f2a26ad62a5c155af9199af9e69b889claireho cmd = (char *)command; 52650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 52727f654740f2a26ad62a5c155af9199af9e69b889claireho 52850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho printf("pkgdata: %s\n", cmd); 52950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int result = system(cmd); 53027f654740f2a26ad62a5c155af9199af9e69b889claireho if (result != 0) { 531103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "-- return status = %d\n", result); 53250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 53327f654740f2a26ad62a5c155af9199af9e69b889claireho 53427f654740f2a26ad62a5c155af9199af9e69b889claireho if (cmd != cmdBuffer && cmd != command) { 53527f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_free(cmd); 53627f654740f2a26ad62a5c155af9199af9e69b889claireho } 53727f654740f2a26ad62a5c155af9199af9e69b889claireho 53827f654740f2a26ad62a5c155af9199af9e69b889claireho return result; 53927f654740f2a26ad62a5c155af9199af9e69b889claireho} 54050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 54185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LN_CMD "ln -s" 54285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define RM_CMD "rm -f" 54385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 54485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_executeOptions(UPKGOptions *o) { 54585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 54627f654740f2a26ad62a5c155af9199af9e69b889claireho 54785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char mode = o->mode[0]; 54885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char targetDir[SMALL_BUFFER_MAX_SIZE] = ""; 54985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char tmpDir[SMALL_BUFFER_MAX_SIZE] = ""; 55085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char datFileName[SMALL_BUFFER_MAX_SIZE] = ""; 55185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char datFileNamePath[LARGE_BUFFER_MAX_SIZE] = ""; 55285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char checkLibFile[LARGE_BUFFER_MAX_SIZE] = ""; 55385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 55427f654740f2a26ad62a5c155af9199af9e69b889claireho initializePkgDataFlags(o); 55527f654740f2a26ad62a5c155af9199af9e69b889claireho 556103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (IN_FILES_MODE(mode)) { 55785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Copy the raw data to the installation directory. */ 55885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->install != NULL) { 55985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(targetDir, o->install); 56085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->shortName != NULL) { 56185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(targetDir, PKGDATA_FILE_SEP_STRING); 56285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(targetDir, o->shortName); 56385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 56450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 56550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 56650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Install: Files mode, copying files to %s..\n", targetDir); 56750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 56885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = pkg_installFileMode(targetDir, o->srcDir, o->fileListFiles->str); 56985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 57085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 571103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else /* if (IN_COMMON_MODE(mode) || IN_DLL_MODE(mode) || IN_STATIC_MODE(mode)) */ { 572103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UBool noVersion = FALSE; 573103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 57485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(targetDir, o->targetDir); 57585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(targetDir, PKGDATA_FILE_SEP_STRING); 57685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 57785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(tmpDir, o->tmpDir); 57885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(tmpDir, PKGDATA_FILE_SEP_STRING); 57985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 58085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(datFileNamePath, tmpDir); 58185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 58285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(datFileName, o->shortName); 58385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(datFileName, UDATA_CMN_SUFFIX); 58485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 58585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(datFileNamePath, datFileName); 58685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 58750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 58850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Writing package file %s ..\n", datFileNamePath); 58950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 59050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = writePackageDatFile(datFileNamePath, o->comment, o->srcDir, o->fileListFiles->str, NULL, U_CHARSET_FAMILY ? 'e' : U_IS_BIG_ENDIAN ? 'b' : 'l'); 59185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 59285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr,"Error writing package dat file.\n"); 59385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 59485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 59585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 596103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (IN_COMMON_MODE(mode)) { 59785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char targetFileNamePath[LARGE_BUFFER_MAX_SIZE] = ""; 59885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 59985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(targetFileNamePath, targetDir); 60085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(targetFileNamePath, datFileName); 60185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 602103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Move the dat file created to the target directory. */ 603103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (uprv_strcmp(datFileNamePath, targetFileNamePath) != 0) { 604103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (T_FileStream_file_exists(targetFileNamePath)) { 605103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if ((result = remove(targetFileNamePath)) != 0) { 606103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Unable to remove old dat file: %s\n", 607103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetFileNamePath); 608103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 609103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 61085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 61185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 612103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = rename(datFileNamePath, targetFileNamePath); 61350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 614103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (o->verbose) { 615103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, "# Moving package file to %s ..\n", 616103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetFileNamePath); 617103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 618103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (result != 0) { 619103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf( 620103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius stderr, 621103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "Unable to move dat file (%s) to target location (%s).\n", 622103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius datFileNamePath, targetFileNamePath); 623103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 624103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 62585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 62685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 62727f654740f2a26ad62a5c155af9199af9e69b889claireho if (o->install != NULL) { 62827f654740f2a26ad62a5c155af9199af9e69b889claireho result = pkg_installCommonMode(o->install, targetFileNamePath); 62927f654740f2a26ad62a5c155af9199af9e69b889claireho } 63027f654740f2a26ad62a5c155af9199af9e69b889claireho 63185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 632103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else /* if (IN_STATIC_MODE(mode) || IN_DLL_MODE(mode)) */ { 63385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char gencFilePath[SMALL_BUFFER_MAX_SIZE] = ""; 63485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char version_major[10] = ""; 63585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool reverseExt = FALSE; 63685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 63750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) 63885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Get the version major number. */ 63985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->version != NULL) { 64085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (uint32_t i = 0;i < sizeof(version_major);i++) { 64185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->version[i] == '.') { 64285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho version_major[i] = 0; 64385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 64485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 64585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho version_major[i] = o->version[i]; 64685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 647103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 648103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius noVersion = TRUE; 649103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (IN_DLL_MODE(mode)) { 650103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, "Warning: Providing a revision number with the -r option is recommended when packaging data in the current mode.\n"); 651103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 65285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 65385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 654103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM != U_PF_OS400 65585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Certain platforms have different library extension ordering. (e.g. libicudata.##.so vs libicudata.so.##) 65685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * reverseExt is FALSE if the suffix should be the version number. 65785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 65885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (pkgDataFlags[LIB_EXT_ORDER][uprv_strlen(pkgDataFlags[LIB_EXT_ORDER])-1] == pkgDataFlags[SO_EXT][uprv_strlen(pkgDataFlags[SO_EXT])-1]) { 65985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt = TRUE; 66085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 66185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 66285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Using the base libName and version number, generate the library file names. */ 663103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius createFileNames(o, mode, version_major, o->version == NULL ? "" : o->version, o->libName, reverseExt, noVersion); 66485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 665fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if ((o->version!=NULL || IN_STATIC_MODE(mode)) && o->rebuild == FALSE && o->pdsbuild == FALSE) { 66685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Check to see if a previous built data library file exists and check if it is the latest. */ 66750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(checkLibFile, "%s%s", targetDir, libFileNames[LIB_FILE_VERSION]); 66885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (T_FileStream_file_exists(checkLibFile)) { 66985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (isFileModTimeLater(checkLibFile, o->srcDir, TRUE) && isFileModTimeLater(checkLibFile, o->options)) { 67085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->install != NULL) { 67150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 67250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Installing already-built library into %s\n", o->install); 67350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 674103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_installLibrary(o->install, targetDir, noVersion); 67550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 67650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 67750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho printf("# Not rebuilding %s - up to date.\n", checkLibFile); 67850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 67985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 68085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 68150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if (o->verbose && (o->install!=NULL)) { 68250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Not installing up-to-date library %s into %s\n", checkLibFile, o->install); 68385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 68450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if(o->verbose && (o->install!=NULL)) { 68550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Not installing missing %s into %s\n", checkLibFile, o->install); 68685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 68785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 68885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 689103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (pkg_checkFlag(o) == NULL) { 690103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Error occurred. */ 691103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 692103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 69385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 69485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 695103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (!o->withoutAssembly && pkgDataFlags[GENCCODE_ASSEMBLY_TYPE][0] != 0) { 69685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char* genccodeAssembly = pkgDataFlags[GENCCODE_ASSEMBLY_TYPE]; 69785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 69850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 69950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Generating assembly code %s of type %s ..\n", gencFilePath, genccodeAssembly); 70050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 70150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 70285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Offset genccodeAssembly by 3 because "-a " */ 70350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (genccodeAssembly && 70450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (uprv_strlen(genccodeAssembly)>3) && 70550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho checkAssemblyHeaderName(genccodeAssembly+3)) { 70685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho writeAssemblyCode(datFileNamePath, o->tmpDir, o->entryName, NULL, gencFilePath); 70785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 70885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = pkg_createWithAssemblyCode(targetDir, mode, gencFilePath); 70985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 71085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Error generating assembly code for data.\n"); 71185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 712103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if (IN_STATIC_MODE(mode)) { 71350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->install != NULL) { 71450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 71550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Installing static library into %s\n", o->install); 71650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 717103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_installLibrary(o->install, targetDir, noVersion); 71850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 71950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return result; 72085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 72185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 72285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr,"Assembly type \"%s\" is unknown.\n", genccodeAssembly); 72385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 72485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 72585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 72650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 72750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Writing object code to %s ..\n", gencFilePath); 72850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 729103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (o->withoutAssembly) { 730103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef BUILD_DATA_WITHOUT_ASSEMBLY 731103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_createWithoutAssemblyCode(o, targetDir, mode); 732103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 733103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* This error should not occur. */ 734103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error- BUILD_DATA_WITHOUT_ASSEMBLY is not defined. Internal error.\n"); 735103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 736103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 73785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef CAN_WRITE_OBJ_CODE 7381b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert /* Try to detect the arch type, use NULL if unsuccessful */ 7391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert char optMatchArch[10] = { 0 }; 7401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert pkg_createOptMatchArch(optMatchArch); 7411b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert writeObjectCode(datFileNamePath, o->tmpDir, o->entryName, (optMatchArch[0] == 0 ? NULL : optMatchArch), NULL, gencFilePath); 7421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert pkg_destroyOptMatchArch(optMatchArch); 743103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_IS_LINUX_BASED 744103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_generateLibraryFile(targetDir, mode, gencFilePath); 74585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#elif defined(WINDOWS_WITH_MSVC) 746103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_createWindowsDLL(mode, gencFilePath, o); 74785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 74885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#elif defined(BUILD_DATA_WITHOUT_ASSEMBLY) 749103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_createWithoutAssemblyCode(o, targetDir, mode); 750103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 751103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error- neither CAN_WRITE_OBJ_CODE nor BUILD_DATA_WITHOUT_ASSEMBLY are defined. Internal error.\n"); 752103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return 1; 75385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 754103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 755103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 75685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 75785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Error generating package data.\n"); 75885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 75985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 76085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 761103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !U_PLATFORM_USES_ONLY_WIN32_API 762103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(!IN_STATIC_MODE(mode)) { 76350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Certain platforms uses archive library. (e.g. AIX) */ 76450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 76550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Creating data archive library file ..\n"); 76650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 76750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = pkg_archiveLibrary(targetDir, o->version, reverseExt); 76850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (result != 0) { 76950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "Error creating data archive library file.\n"); 77050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return result; 77150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 772103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM != U_PF_OS400 773103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (!noVersion) { 774103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Create symbolic links for the final library file. */ 775103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_OS390 776fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = pkg_createSymLinks(targetDir, o->pdsbuild); 777103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 778103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_createSymLinks(targetDir, noVersion); 779103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 780103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (result != 0) { 781103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating symbolic links of the data library file.\n"); 782103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 783103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 78450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 7856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#endif 786103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } /* !IN_STATIC_MODE */ 78785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 78850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 789103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !U_PLATFORM_USES_ONLY_WIN32_API 79085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Install the libraries if option was set. */ 79185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->install != NULL) { 79250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 79350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Installing library file to %s ..\n", o->install); 79450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 795103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_installLibrary(o->install, targetDir, noVersion); 79685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 79785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Error installing the data library.\n"); 79885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 79985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 80085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 80185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 80285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 80385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 80485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 80585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 80627f654740f2a26ad62a5c155af9199af9e69b889claireho 80727f654740f2a26ad62a5c155af9199af9e69b889claireho/* Initialize the pkgDataFlags with the option file given. */ 80827f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int32_t initializePkgDataFlags(UPKGOptions *o) { 80927f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 81027f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t result = 0; 81127f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t currentBufferSize = SMALL_BUFFER_MAX_SIZE; 81227f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t tmpResult = 0; 81327f654740f2a26ad62a5c155af9199af9e69b889claireho 81427f654740f2a26ad62a5c155af9199af9e69b889claireho /* Initialize pkgdataFlags */ 81527f654740f2a26ad62a5c155af9199af9e69b889claireho pkgDataFlags = (char**)uprv_malloc(sizeof(char*) * PKGDATA_FLAGS_SIZE); 81627f654740f2a26ad62a5c155af9199af9e69b889claireho 81727f654740f2a26ad62a5c155af9199af9e69b889claireho /* If we run out of space, allocate more */ 81827f654740f2a26ad62a5c155af9199af9e69b889claireho#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) 81927f654740f2a26ad62a5c155af9199af9e69b889claireho do { 82027f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 82127f654740f2a26ad62a5c155af9199af9e69b889claireho if (pkgDataFlags != NULL) { 82227f654740f2a26ad62a5c155af9199af9e69b889claireho for (int32_t i = 0; i < PKGDATA_FLAGS_SIZE; i++) { 82327f654740f2a26ad62a5c155af9199af9e69b889claireho pkgDataFlags[i] = (char*)uprv_malloc(sizeof(char) * currentBufferSize); 82427f654740f2a26ad62a5c155af9199af9e69b889claireho if (pkgDataFlags[i] != NULL) { 82527f654740f2a26ad62a5c155af9199af9e69b889claireho pkgDataFlags[i][0] = 0; 82627f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 82727f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stderr,"Error allocating memory for pkgDataFlags.\n"); 82827f654740f2a26ad62a5c155af9199af9e69b889claireho return -1; 82927f654740f2a26ad62a5c155af9199af9e69b889claireho } 83027f654740f2a26ad62a5c155af9199af9e69b889claireho } 83127f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 83227f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stderr,"Error allocating memory for pkgDataFlags.\n"); 83327f654740f2a26ad62a5c155af9199af9e69b889claireho return -1; 83427f654740f2a26ad62a5c155af9199af9e69b889claireho } 83527f654740f2a26ad62a5c155af9199af9e69b889claireho 83627f654740f2a26ad62a5c155af9199af9e69b889claireho if (o->options == NULL) { 83727f654740f2a26ad62a5c155af9199af9e69b889claireho return result; 83827f654740f2a26ad62a5c155af9199af9e69b889claireho } 83927f654740f2a26ad62a5c155af9199af9e69b889claireho 84027f654740f2a26ad62a5c155af9199af9e69b889claireho#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) 84127f654740f2a26ad62a5c155af9199af9e69b889claireho /* Read in options file. */ 84227f654740f2a26ad62a5c155af9199af9e69b889claireho if(o->verbose) { 84327f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stdout, "# Reading options file %s\n", o->options); 84427f654740f2a26ad62a5c155af9199af9e69b889claireho } 84527f654740f2a26ad62a5c155af9199af9e69b889claireho status = U_ZERO_ERROR; 846103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius tmpResult = parseFlagsFile(o->options, pkgDataFlags, currentBufferSize, FLAG_NAMES, (int32_t)PKGDATA_FLAGS_SIZE, &status); 84727f654740f2a26ad62a5c155af9199af9e69b889claireho if (status == U_BUFFER_OVERFLOW_ERROR) { 84827f654740f2a26ad62a5c155af9199af9e69b889claireho for (int32_t i = 0; i < PKGDATA_FLAGS_SIZE; i++) { 84927f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_free(pkgDataFlags[i]); 85027f654740f2a26ad62a5c155af9199af9e69b889claireho } 85127f654740f2a26ad62a5c155af9199af9e69b889claireho currentBufferSize = tmpResult; 85227f654740f2a26ad62a5c155af9199af9e69b889claireho } else if (U_FAILURE(status)) { 85327f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stderr,"Unable to open or read \"%s\" option file. status = %s\n", o->options, u_errorName(status)); 85427f654740f2a26ad62a5c155af9199af9e69b889claireho return -1; 85527f654740f2a26ad62a5c155af9199af9e69b889claireho } 85627f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 85727f654740f2a26ad62a5c155af9199af9e69b889claireho if(o->verbose) { 858103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, "# pkgDataFlags=\n"); 859103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius for(int32_t i=0;i<PKGDATA_FLAGS_SIZE;i++) { 860103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, " [%d] %s: %s\n", i, FLAG_NAMES[i], pkgDataFlags[i]); 86127f654740f2a26ad62a5c155af9199af9e69b889claireho } 86227f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stdout, "\n"); 86327f654740f2a26ad62a5c155af9199af9e69b889claireho } 86427f654740f2a26ad62a5c155af9199af9e69b889claireho#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) 86527f654740f2a26ad62a5c155af9199af9e69b889claireho } while (status == U_BUFFER_OVERFLOW_ERROR); 86627f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 86727f654740f2a26ad62a5c155af9199af9e69b889claireho 86827f654740f2a26ad62a5c155af9199af9e69b889claireho return result; 86927f654740f2a26ad62a5c155af9199af9e69b889claireho} 87027f654740f2a26ad62a5c155af9199af9e69b889claireho 87127f654740f2a26ad62a5c155af9199af9e69b889claireho 87285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 87385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Given the base libName and version numbers, generate the libary file names and store it in libFileNames. 87485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Depending on the configuration, the library name may either end with version number or shared object suffix. 87585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 876103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void createFileNames(UPKGOptions *o, const char mode, const char *version_major, const char *version, const char *libName, UBool reverseExt, UBool noVersion) { 877f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius const char* FILE_EXTENSION_SEP = uprv_strlen(pkgDataFlags[SO_EXT]) == 0 ? "" : "."; 878f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius const char* FILE_SUFFIX = pkgDataFlags[LIB_EXT_ORDER][0] == '.' ? "." : ""; 879f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 880103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_MINGW 881103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* MinGW does not need the library prefix when building in dll mode. */ 882103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (IN_DLL_MODE(mode)) { 883103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(libFileNames[LIB_FILE], "%s", libName); 884103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 885103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(libFileNames[LIB_FILE], "%s%s", 886103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[LIBPREFIX], 887103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libName); 888103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 889103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 89085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(libFileNames[LIB_FILE], "%s%s", 89185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LIBPREFIX], 89285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libName); 893103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 89450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 89550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 89650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# libFileName[LIB_FILE] = %s\n", libFileNames[LIB_FILE]); 89750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 89850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 899103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_MINGW 9001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // Name the import library lib*.dll.a 9011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert sprintf(libFileNames[LIB_FILE_MINGW], "lib%s.dll.a", libName); 902103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_CYGWIN 903f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_CYGWIN], "cyg%s%s%s", 904103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libName, 905f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 906103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[SO_EXT]); 907f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_CYGWIN_VERSION], "cyg%s%s%s%s", 908103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libName, 909103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius version_major, 910f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 911103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[SO_EXT]); 912103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 913103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uprv_strcat(pkgDataFlags[SO_EXT], "."); 914103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uprv_strcat(pkgDataFlags[SO_EXT], pkgDataFlags[A_EXT]); 915103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS400 || defined(_AIX) 916f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_VERSION_TMP], "%s%s%s", 917103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE], 918f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 919103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[SOBJ_EXT]); 920fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#elif U_PLATFORM == U_PF_OS390 921f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_VERSION_TMP], "%s%s%s%s%s", 922fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE], 923fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius pkgDataFlags[LIB_EXT_ORDER][0] == '.' ? "." : "", 924fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius reverseExt ? version : pkgDataFlags[SOBJ_EXT], 925f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 926fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius reverseExt ? pkgDataFlags[SOBJ_EXT] : version); 927fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 928fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(libFileNames[LIB_FILE_OS390BATCH_VERSION], "%s%s.x", 929fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE], 930fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius version); 931fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(libFileNames[LIB_FILE_OS390BATCH_MAJOR], "%s%s.x", 932fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE], 933fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius version_major); 934103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 935103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (noVersion && !reverseExt) { 936103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(libFileNames[LIB_FILE_VERSION_TMP], "%s%s%s", 93785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE], 938f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_SUFFIX, 93985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[SOBJ_EXT]); 940103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 941f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_VERSION_TMP], "%s%s%s%s%s", 94285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE], 943f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_SUFFIX, 94485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt ? version : pkgDataFlags[SOBJ_EXT], 945f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 94685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt ? pkgDataFlags[SOBJ_EXT] : version); 947103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 94885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 949103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (noVersion && !reverseExt) { 950103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(libFileNames[LIB_FILE_VERSION_MAJOR], "%s%s%s", 951103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE], 952f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_SUFFIX, 953103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[SO_EXT]); 954103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 955103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(libFileNames[LIB_FILE_VERSION], "%s%s%s", 956103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE], 957f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_SUFFIX, 958103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[SO_EXT]); 959103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 960f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_VERSION_MAJOR], "%s%s%s%s%s", 96185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE], 962f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_SUFFIX, 96385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt ? version_major : pkgDataFlags[SO_EXT], 964f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 96585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt ? pkgDataFlags[SO_EXT] : version_major); 96685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 967f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_VERSION], "%s%s%s%s%s", 96850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE], 969f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_SUFFIX, 97050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho reverseExt ? version : pkgDataFlags[SO_EXT], 971f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 97250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho reverseExt ? pkgDataFlags[SO_EXT] : version); 973103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 97450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 975103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(o->verbose) { 976103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, "# libFileName[LIB_FILE_VERSION] = %s\n", libFileNames[LIB_FILE_VERSION]); 977103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 97885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 979103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PF_MINGW <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 980103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Cygwin and MinGW only deals with the version major number. */ 981103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uprv_strcpy(libFileNames[LIB_FILE_VERSION_TMP], libFileNames[LIB_FILE_VERSION_MAJOR]); 98285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 983103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 984103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(IN_STATIC_MODE(mode)) { 98550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(libFileNames[LIB_FILE_VERSION], "%s.%s", libFileNames[LIB_FILE], pkgDataFlags[A_EXT]); 98650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE_VERSION_MAJOR][0]=0; 98750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 98850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# libFileName[LIB_FILE_VERSION] = %s (static)\n", libFileNames[LIB_FILE_VERSION]); 98950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 99050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 99185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 99285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 99385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* Create the symbolic links for the final library file. */ 99450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int32_t pkg_createSymLinks(const char *targetDir, UBool specialHandling) { 99585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 99685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char cmd[LARGE_BUFFER_MAX_SIZE]; 99727f654740f2a26ad62a5c155af9199af9e69b889claireho char name1[SMALL_BUFFER_MAX_SIZE]; /* symlink file name */ 99827f654740f2a26ad62a5c155af9199af9e69b889claireho char name2[SMALL_BUFFER_MAX_SIZE]; /* file name to symlink */ 999f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius const char* FILE_EXTENSION_SEP = uprv_strlen(pkgDataFlags[SO_EXT]) == 0 ? "" : "."; 100085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1001103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !defined(USING_CYGWIN) && U_PLATFORM != U_PF_MINGW 100285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* No symbolic link to make. */ 100327f654740f2a26ad62a5c155af9199af9e69b889claireho if (uprv_strlen(libFileNames[LIB_FILE_VERSION]) == 0 || uprv_strlen(libFileNames[LIB_FILE_VERSION_MAJOR]) == 0 || 100427f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcmp(libFileNames[LIB_FILE_VERSION], libFileNames[LIB_FILE_VERSION_MAJOR]) == 0) { 100585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 100685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 100785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 100885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "cd %s && %s %s && %s %s %s", 100985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 101085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho RM_CMD, 101185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION_MAJOR], 101285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LN_CMD, 101385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION], 101485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION_MAJOR]); 101550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 101685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 1017103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating symbolic links. Failed command: %s\n", cmd); 101885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 101985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 102085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 102150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 102250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (specialHandling) { 1023103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_CYGWIN 102450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(name1, "%s", libFileNames[LIB_FILE_CYGWIN]); 102550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(name2, "%s", libFileNames[LIB_FILE_CYGWIN_VERSION]); 1026fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#elif U_PLATFORM == U_PF_OS390 1027fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius /* Create the symbolic links for the import data */ 1028fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius /* Use the cmd buffer to store path to import data file to check its existence */ 1029fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(cmd, "%s/%s", targetDir, libFileNames[LIB_FILE_OS390BATCH_VERSION]); 1030fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (T_FileStream_file_exists(cmd)) { 1031fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(cmd, "cd %s && %s %s && %s %s %s", 1032fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius targetDir, 1033fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius RM_CMD, 1034fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE_OS390BATCH_MAJOR], 1035fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius LN_CMD, 1036fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE_OS390BATCH_VERSION], 1037fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE_OS390BATCH_MAJOR]); 1038fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = runCommand(cmd); 1039fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (result != 0) { 1040fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fprintf(stderr, "Error creating symbolic links. Failed command: %s\n", cmd); 1041fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return result; 1042fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1043fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1044fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(cmd, "cd %s && %s %s.x && %s %s %s.x", 1045fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius targetDir, 1046fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius RM_CMD, 1047fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE], 1048fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius LN_CMD, 1049fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE_OS390BATCH_VERSION], 1050fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE]); 1051fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = runCommand(cmd); 1052fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (result != 0) { 1053fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fprintf(stderr, "Error creating symbolic links. Failed command: %s\n", cmd); 1054fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return result; 1055fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1056fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1057fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1058fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius /* Needs to be set here because special handling skips it */ 1059f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(name1, "%s%s%s", libFileNames[LIB_FILE], FILE_EXTENSION_SEP, pkgDataFlags[SO_EXT]); 1060fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(name2, "%s", libFileNames[LIB_FILE_VERSION]); 106150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else 106250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho goto normal_symlink_mode; 106350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 106450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 1065103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM != U_PF_CYGWIN 106650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehonormal_symlink_mode: 1067103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1068f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(name1, "%s%s%s", libFileNames[LIB_FILE], FILE_EXTENSION_SEP, pkgDataFlags[SO_EXT]); 106950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(name2, "%s", libFileNames[LIB_FILE_VERSION]); 107050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 107150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 107250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "cd %s && %s %s && %s %s %s", 107385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 107485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho RM_CMD, 107550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho name1, 107685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LN_CMD, 107750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho name2, 107850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho name1); 107985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 108050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 108185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 108285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 108385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 108485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1085103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic int32_t pkg_installLibrary(const char *installDir, const char *targetDir, UBool noVersion) { 108685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 108785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char cmd[SMALL_BUFFER_MAX_SIZE]; 108885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 108985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "cd %s && %s %s %s%s%s", 109085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 109185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[INSTALL_CMD], 109285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION], 109385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho installDir, PKGDATA_FILE_SEP_STRING, libFileNames[LIB_FILE_VERSION] 109485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ); 109585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 109650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 109750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 109850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (result != 0) { 1099103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error installing library. Failed command: %s\n", cmd); 110050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return result; 110150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 110250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 110350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#ifdef CYGWINMSVC 110450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "cd %s && %s %s.lib %s", 110550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho targetDir, 110650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pkgDataFlags[INSTALL_CMD], 110750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE], 110850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho installDir 110950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ); 111050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 111185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 111285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 1113103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error installing library. Failed command: %s\n", cmd); 111485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 111585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1116103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_CYGWIN 111750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "cd %s && %s %s %s", 111850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho targetDir, 111950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pkgDataFlags[INSTALL_CMD], 112050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE_CYGWIN_VERSION], 112150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho installDir 112250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ); 112350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 112485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (result != 0) { 1126103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error installing library. Failed command: %s\n", cmd); 1127b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return result; 1128b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1129fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1130fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#elif U_PLATFORM == U_PF_OS390 1131fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (T_FileStream_file_exists(libFileNames[LIB_FILE_OS390BATCH_VERSION])) { 1132fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(cmd, "%s %s %s", 1133fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius pkgDataFlags[INSTALL_CMD], 1134fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE_OS390BATCH_VERSION], 1135fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius installDir 1136fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ); 1137fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = runCommand(cmd); 1138fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1139fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (result != 0) { 1140fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fprintf(stderr, "Error installing library. Failed command: %s\n", cmd); 1141fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return result; 1142fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1143fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 114450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 1145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1146103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (noVersion) { 1147103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 1148103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 1149103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return pkg_createSymLinks(installDir, TRUE); 1150103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 115185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 115285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 115327f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int32_t pkg_installCommonMode(const char *installDir, const char *fileName) { 115427f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t result = 0; 115527f654740f2a26ad62a5c155af9199af9e69b889claireho char cmd[SMALL_BUFFER_MAX_SIZE] = ""; 115627f654740f2a26ad62a5c155af9199af9e69b889claireho 115727f654740f2a26ad62a5c155af9199af9e69b889claireho if (!T_FileStream_file_exists(installDir)) { 115827f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 115927f654740f2a26ad62a5c155af9199af9e69b889claireho 116027f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_mkdir(installDir, &status); 116127f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(status)) { 116227f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stderr, "Error creating installation directory: %s\n", installDir); 116327f654740f2a26ad62a5c155af9199af9e69b889claireho return -1; 116427f654740f2a26ad62a5c155af9199af9e69b889claireho } 116527f654740f2a26ad62a5c155af9199af9e69b889claireho } 116627f654740f2a26ad62a5c155af9199af9e69b889claireho#ifndef U_WINDOWS_WITH_MSVC 116727f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(cmd, "%s %s %s", pkgDataFlags[INSTALL_CMD], fileName, installDir); 116827f654740f2a26ad62a5c155af9199af9e69b889claireho#else 116927f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(cmd, "%s %s %s %s", WIN_INSTALL_CMD, fileName, installDir, WIN_INSTALL_CMD_FLAGS); 117027f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 117127f654740f2a26ad62a5c155af9199af9e69b889claireho 117227f654740f2a26ad62a5c155af9199af9e69b889claireho result = runCommand(cmd); 117327f654740f2a26ad62a5c155af9199af9e69b889claireho if (result != 0) { 117427f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stderr, "Failed to install data file with command: %s\n", cmd); 117527f654740f2a26ad62a5c155af9199af9e69b889claireho } 117627f654740f2a26ad62a5c155af9199af9e69b889claireho 117727f654740f2a26ad62a5c155af9199af9e69b889claireho return result; 117827f654740f2a26ad62a5c155af9199af9e69b889claireho} 117927f654740f2a26ad62a5c155af9199af9e69b889claireho 118085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef U_WINDOWS_MSVC 118185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* Copy commands for installing the raw data files on Windows. */ 118285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define WIN_INSTALL_CMD "xcopy" 118385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define WIN_INSTALL_CMD_FLAGS "/E /Y /K" 118485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 118585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_installFileMode(const char *installDir, const char *srcDir, const char *fileListName) { 118685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 118785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char cmd[SMALL_BUFFER_MAX_SIZE] = ""; 118885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 118985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (!T_FileStream_file_exists(installDir)) { 119085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 119185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 119285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_mkdir(installDir, &status); 119385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 119485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Error creating installation directory: %s\n", installDir); 119585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 119685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 119785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 119885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifndef U_WINDOWS_WITH_MSVC 119985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char buffer[SMALL_BUFFER_MAX_SIZE] = ""; 120054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t bufferLength = 0; 120185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 120285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho FileStream *f = T_FileStream_open(fileListName, "r"); 120385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (f != NULL) { 120485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(;;) { 120585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (T_FileStream_readLine(f, buffer, SMALL_BUFFER_MAX_SIZE) != NULL) { 120654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius bufferLength = uprv_strlen(buffer); 120785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Remove new line character. */ 120854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (bufferLength > 0) { 120954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius buffer[bufferLength-1] = 0; 121054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 121185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 121285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s%s%s %s%s%s", 121385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[INSTALL_CMD], 121485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho srcDir, PKGDATA_FILE_SEP_STRING, buffer, 121585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho installDir, PKGDATA_FILE_SEP_STRING, buffer); 121685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 121750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 121885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 121985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Failed to install data file with command: %s\n", cmd); 122085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 122185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 122285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 122385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (!T_FileStream_eof(f)) { 122485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Failed to read line from file: %s\n", fileListName); 122585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = -1; 122685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 122785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 122885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 122985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 123085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho T_FileStream_close(f); 123185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 123285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = -1; 123385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Unable to open list file: %s\n", fileListName); 123485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 123585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else 123685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s %s %s", WIN_INSTALL_CMD, srcDir, installDir, WIN_INSTALL_CMD_FLAGS); 123750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 123885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 123985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Failed to install data file with command: %s\n", cmd); 124085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 124185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 124285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 124385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 124485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 124585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 124685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* Archiving of the library file may be needed depending on the platform and options given. 124785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * If archiving is not needed, copy over the library file name. 124885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 124985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_archiveLibrary(const char *targetDir, const char *version, UBool reverseExt) { 125085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 125185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char cmd[LARGE_BUFFER_MAX_SIZE]; 125285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 125350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* If the shared object suffix and the final object suffix is different and the final object suffix and the 125485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * archive file suffix is the same, then the final library needs to be archived. 125585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 125685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (uprv_strcmp(pkgDataFlags[SOBJ_EXT], pkgDataFlags[SO_EXT]) != 0 && uprv_strcmp(pkgDataFlags[A_EXT], pkgDataFlags[SO_EXT]) == 0) { 125785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(libFileNames[LIB_FILE_VERSION], "%s%s%s.%s", 125885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE], 125985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LIB_EXT_ORDER][0] == '.' ? "." : "", 126085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt ? version : pkgDataFlags[SO_EXT], 126185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt ? pkgDataFlags[SO_EXT] : version); 126285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 126385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s %s%s %s%s", 126485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[AR], 126585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[ARFLAGS], 126685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 126785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION], 126885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 126985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION_TMP]); 127085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 127150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 127250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (result != 0) { 1273103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating archive library. Failed command: %s\n", cmd); 127450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return result; 127550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 127650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 127750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "%s %s%s", 127850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pkgDataFlags[RANLIB], 127950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho targetDir, 128050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE_VERSION]); 128150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 128250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 128385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 1284103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating archive library. Failed command: %s\n", cmd); 128585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 128685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 128785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 128885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Remove unneeded library file. */ 128985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s%s", 129085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho RM_CMD, 129185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 129285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION_TMP]); 129385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 129450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 129585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 1296103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating archive library. Failed command: %s\n", cmd); 129785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 129885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 129985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 130085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 130185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(libFileNames[LIB_FILE_VERSION], libFileNames[LIB_FILE_VERSION_TMP]); 130285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 130385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 130485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 130585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 130685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 130785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 130885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Using the compiler information from the configuration file set by -O option, generate the library file. 130985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * command may be given to allow for a larger buffer for cmd. 131085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 1311fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, const char *objectFile, char *command, UBool specialHandling) { 131285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 131385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *cmd = NULL; 131485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool freeCmd = FALSE; 1315b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t length = 0; 131685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1317f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius (void)specialHandling; // Suppress unused variable compiler warnings on platforms where all usage 1318f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // of this parameter is #ifdefed out. 1319f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 132085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* This is necessary because if packaging is done without assembly code, objectFile might be extremely large 132185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * containing many object files and so the calling function should supply a command buffer that is large 132285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * enough to handle this. Otherwise, use the default size. 132385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 132485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (command != NULL) { 132585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho cmd = command; 132685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 132785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1328103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (IN_STATIC_MODE(mode)) { 1329b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (cmd == NULL) { 1330b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho length = uprv_strlen(pkgDataFlags[AR]) + uprv_strlen(pkgDataFlags[ARFLAGS]) + uprv_strlen(targetDir) + 1331b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_strlen(libFileNames[LIB_FILE_VERSION]) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[RANLIB]) + BUFFER_PADDING_SIZE; 1332b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == NULL) { 1333b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fprintf(stderr, "Unable to allocate memory for command.\n"); 1334b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return -1; 1335b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1336b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho freeCmd = TRUE; 1337b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 133850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "%s %s %s%s %s", 133985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[AR], 134085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[ARFLAGS], 134185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 134250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE_VERSION], 134385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho objectFile); 134485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 134550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 134650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (result == 0) { 134750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "%s %s%s", 134850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pkgDataFlags[RANLIB], 134950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho targetDir, 135050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE_VERSION]); 135150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 135250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 135350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1354103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else /* if (IN_DLL_MODE(mode)) */ { 1355b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (cmd == NULL) { 1356b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho length = uprv_strlen(pkgDataFlags[GENLIB]) + uprv_strlen(pkgDataFlags[LDICUDTFLAGS]) + 1357103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ((uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_VERSION_TMP])) * 2) + 1358b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[LD_SONAME]) + 1359b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_strlen(pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR]) + 1360b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_strlen(pkgDataFlags[RPATH_FLAGS]) + uprv_strlen(pkgDataFlags[BIR_FLAGS]) + BUFFER_PADDING_SIZE; 1361103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_CYGWIN 1362b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho length += uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_CYGWIN_VERSION]); 1363103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_MINGW 1364103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length += uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_MINGW]); 1365b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif 1366b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == NULL) { 1367b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fprintf(stderr, "Unable to allocate memory for command.\n"); 1368b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return -1; 1369b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1370b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho freeCmd = TRUE; 1371b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1372103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_MINGW 1373103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(cmd, "%s%s%s %s -o %s%s %s %s%s %s %s", 1374103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[GENLIB], 1375103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetDir, 1376103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE_MINGW], 1377103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[LDICUDTFLAGS], 1378103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetDir, 1379103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE_VERSION_TMP], 1380103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_CYGWIN 138185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s%s%s %s -o %s%s %s %s%s %s %s", 138285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[GENLIB], 138385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 138485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION_TMP], 138585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LDICUDTFLAGS], 1386103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetDir, 1387103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE_CYGWIN_VERSION], 1388103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_AIX 1389103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(cmd, "%s %s%s;%s %s -o %s%s %s %s%s %s %s", 1390103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius RM_CMD, 1391103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetDir, 1392103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE_VERSION_TMP], 1393103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[GENLIB], 1394103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[LDICUDTFLAGS], 1395103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetDir, 1396103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE_VERSION_TMP], 139785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else 139885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s -o %s%s %s %s%s %s %s", 139985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[GENLIB], 140085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LDICUDTFLAGS], 140185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 140285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION_TMP], 140385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 140485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho objectFile, 140585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LD_SONAME], 140685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR], 140785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[RPATH_FLAGS], 140885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[BIR_FLAGS]); 140985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 141085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Generate the library file. */ 141150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 141259d709d503bab6e2b61931737e662dd293b40578ccornelius 1413fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if U_PLATFORM == U_PF_OS390 1414fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius char *env_tmp; 141559d709d503bab6e2b61931737e662dd293b40578ccornelius char PDS_LibName[512]; 1416fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius char PDS_Name[512]; 1417fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1418fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius PDS_Name[0] = 0; 1419fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius PDS_LibName[0] = 0; 1420fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (specialHandling && uprv_strcmp(libFileNames[LIB_FILE],"libicudata") == 0) { 1421fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (env_tmp = getenv("ICU_PDS_NAME")) { 1422fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_Name, "%s%s", 1423fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius env_tmp, 1424fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "DA"); 1425fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius strcat(PDS_Name, getenv("ICU_PDS_NAME_SUFFIX")); 1426fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else if (env_tmp = getenv("PDS_NAME_PREFIX")) { 1427fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_Name, "%s%s", 1428fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius env_tmp, 1429fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius U_ICU_VERSION_SHORT "DA"); 1430fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else { 1431fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_Name, "%s%s", 1432fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "IXMI", 1433fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius U_ICU_VERSION_SHORT "DA"); 1434fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1435fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else if (!specialHandling && uprv_strcmp(libFileNames[LIB_FILE],"libicudata_stub") == 0) { 1436fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (env_tmp = getenv("ICU_PDS_NAME")) { 1437fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_Name, "%s%s", 1438fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius env_tmp, 1439fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "D1"); 1440fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius strcat(PDS_Name, getenv("ICU_PDS_NAME_SUFFIX")); 1441fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else if (env_tmp = getenv("PDS_NAME_PREFIX")) { 1442fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_Name, "%s%s", 1443fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius env_tmp, 1444fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius U_ICU_VERSION_SHORT "D1"); 1445fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else { 1446fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_Name, "%s%s", 1447fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "IXMI", 1448fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius U_ICU_VERSION_SHORT "D1"); 1449fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1450fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1451fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1452fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (PDS_Name[0]) { 1453fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_LibName,"%s%s%s%s%s", 145459d709d503bab6e2b61931737e662dd293b40578ccornelius "\"//'", 145559d709d503bab6e2b61931737e662dd293b40578ccornelius getenv("LOADMOD"), 1456fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "(", 1457fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius PDS_Name, 1458fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ")'\""); 1459fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(cmd, "%s %s -o %s %s %s%s %s %s", 146059d709d503bab6e2b61931737e662dd293b40578ccornelius pkgDataFlags[GENLIB], 146159d709d503bab6e2b61931737e662dd293b40578ccornelius pkgDataFlags[LDICUDTFLAGS], 146259d709d503bab6e2b61931737e662dd293b40578ccornelius PDS_LibName, 146359d709d503bab6e2b61931737e662dd293b40578ccornelius objectFile, 146459d709d503bab6e2b61931737e662dd293b40578ccornelius pkgDataFlags[LD_SONAME], 146559d709d503bab6e2b61931737e662dd293b40578ccornelius pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR], 146659d709d503bab6e2b61931737e662dd293b40578ccornelius pkgDataFlags[RPATH_FLAGS], 146759d709d503bab6e2b61931737e662dd293b40578ccornelius pkgDataFlags[BIR_FLAGS]); 1468fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1469fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = runCommand(cmd); 147059d709d503bab6e2b61931737e662dd293b40578ccornelius } 147159d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 147285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 147385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1474103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (result != 0) { 1475103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error generating library file. Failed command: %s\n", cmd); 1476103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1477103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 147885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (freeCmd) { 147985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(cmd); 148085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 148185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 148285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 148385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 148485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 148585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_createWithAssemblyCode(const char *targetDir, const char mode, const char *gencFilePath) { 148685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char tempObjectFile[SMALL_BUFFER_MAX_SIZE] = ""; 148727f654740f2a26ad62a5c155af9199af9e69b889claireho char *cmd; 148885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 148985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 149027f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t length = 0; 149127f654740f2a26ad62a5c155af9199af9e69b889claireho 149285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Remove the ending .s and replace it with .o for the new object file. */ 149385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(tempObjectFile, gencFilePath); 149485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile[uprv_strlen(tempObjectFile)-1] = 'o'; 149585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 149627f654740f2a26ad62a5c155af9199af9e69b889claireho length = uprv_strlen(pkgDataFlags[COMPILER]) + uprv_strlen(pkgDataFlags[LIBFLAGS]) 1497b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho + uprv_strlen(tempObjectFile) + uprv_strlen(gencFilePath) + BUFFER_PADDING_SIZE; 149827f654740f2a26ad62a5c155af9199af9e69b889claireho 149927f654740f2a26ad62a5c155af9199af9e69b889claireho cmd = (char *)uprv_malloc(sizeof(char) * length); 150027f654740f2a26ad62a5c155af9199af9e69b889claireho if (cmd == NULL) { 150127f654740f2a26ad62a5c155af9199af9e69b889claireho return -1; 150227f654740f2a26ad62a5c155af9199af9e69b889claireho } 150327f654740f2a26ad62a5c155af9199af9e69b889claireho 150485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Generate the object file. */ 150585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s -o %s %s", 150685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[COMPILER], 150785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LIBFLAGS], 150885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile, 150985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gencFilePath); 151085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 151150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 151227f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_free(cmd); 151385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 1514103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating with assembly code. Failed command: %s\n", cmd); 151585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 151685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 151785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 151885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return pkg_generateLibraryFile(targetDir, mode, tempObjectFile); 151985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 152085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 152185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef BUILD_DATA_WITHOUT_ASSEMBLY 152285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 152385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Generation of the data library without assembly code needs to compile each data file 152485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * individually and then link it all together. 152550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Note: Any update to the directory structure of the data needs to be reflected here. 152685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 152785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoenum { 152885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX_BRKITR, 152985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX_COLL, 153050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DATA_PREFIX_CURR, 153150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DATA_PREFIX_LANG, 153285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX_RBNF, 153350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DATA_PREFIX_REGION, 153485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX_TRANSLIT, 153550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DATA_PREFIX_ZONE, 1536f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius DATA_PREFIX_UNIT, 153785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX_LENGTH 153885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 153950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 154085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoconst static char DATA_PREFIX[DATA_PREFIX_LENGTH][10] = { 154185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "brkitr", 154285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "coll", 154350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "curr", 154450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "lang", 154585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "rbnf", 154650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "region", 154750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "translit", 1548f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "zone", 1549f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "unit" 155085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 155150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 155285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_createWithoutAssemblyCode(UPKGOptions *o, const char *targetDir, const char mode) { 155385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 155485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho CharList *list = o->filePaths; 155585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho CharList *listNames = o->files; 155685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t listSize = pkg_countCharList(list); 155785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *buffer; 155885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *cmd; 155985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char gencmnFile[SMALL_BUFFER_MAX_SIZE] = ""; 156085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char tempObjectFile[SMALL_BUFFER_MAX_SIZE] = ""; 156185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef USE_SINGLE_CCODE_FILE 156285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char icudtAll[SMALL_BUFFER_MAX_SIZE] = ""; 1563103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius FileStream *icudtAllFile = NULL; 156485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 156585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(icudtAll, "%s%s%sall.c", 156685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o->tmpDir, 156785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho PKGDATA_FILE_SEP_STRING, 156885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE]); 156950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Remove previous icudtall.c file. */ 157050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (T_FileStream_file_exists(icudtAll) && (result = remove(icudtAll)) != 0) { 157150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "Unable to remove old icudtall file: %s\n", icudtAll); 157250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return result; 157350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1574103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1575103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if((icudtAllFile = T_FileStream_open(icudtAll, "w"))==NULL) { 1576103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Unable to write to icudtall file: %s\n", icudtAll); 1577103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 1578103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 157985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 158085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 158185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (list == NULL || listNames == NULL) { 158285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* list and listNames should never be NULL since we are looping through the CharList with 158385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * the given size. 158485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 158585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 158685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 158785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 158885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ((cmd = (char *)uprv_malloc((listSize + 2) * SMALL_BUFFER_MAX_SIZE)) == NULL) { 158985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Unable to allocate memory for cmd.\n"); 159085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 159185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else if ((buffer = (char *)uprv_malloc((listSize + 1) * SMALL_BUFFER_MAX_SIZE)) == NULL) { 159285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Unable to allocate memory for buffer.\n"); 159385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(cmd); 159485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 159585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 159685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 159785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t i = 0; i < (listSize + 1); i++) { 159885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *file ; 159985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *name; 160085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 160185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (i == 0) { 160285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* The first iteration calls the gencmn function and initailizes the buffer. */ 160385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho createCommonDataFile(o->tmpDir, o->shortName, o->entryName, NULL, o->srcDir, o->comment, o->fileListFiles->str, 0, TRUE, o->verbose, gencmnFile); 160485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho buffer[0] = 0; 160585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef USE_SINGLE_CCODE_FILE 160685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(tempObjectFile, gencmnFile); 160785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile[uprv_strlen(tempObjectFile) - 1] = 'o'; 160885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1609b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sprintf(cmd, "%s %s -o %s %s", 161085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[COMPILER], 161185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LIBFLAGS], 161285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile, 161385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gencmnFile); 161485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 161550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 161685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 161785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 161885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 161985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 162085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(buffer, "%s",tempObjectFile); 162185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 162285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 162385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char newName[SMALL_BUFFER_MAX_SIZE]; 162485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char dataName[SMALL_BUFFER_MAX_SIZE]; 162550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char dataDirName[SMALL_BUFFER_MAX_SIZE]; 162685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *pSubstring; 162785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho file = list->str; 162885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho name = listNames->str; 162985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 163085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho newName[0] = dataName[0] = 0; 163185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t n = 0; n < DATA_PREFIX_LENGTH; n++) { 163250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dataDirName[0] = 0; 163350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(dataDirName, "%s%s", DATA_PREFIX[n], PKGDATA_FILE_SEP_STRING); 163450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* If the name contains a prefix (indicating directory), alter the new name accordingly. */ 163550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pSubstring = uprv_strstr(name, dataDirName); 163685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (pSubstring != NULL) { 163785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char newNameTmp[SMALL_BUFFER_MAX_SIZE] = ""; 163850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *p = name + uprv_strlen(dataDirName); 163985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t i = 0;;i++) { 164085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (p[i] == '.') { 164185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho newNameTmp[i] = '_'; 164285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho continue; 164385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 164485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho newNameTmp[i] = p[i]; 164585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (p[i] == 0) { 164685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 164785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 164885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 164985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(newName, "%s_%s", 165085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX[n], 165185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho newNameTmp); 165285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(dataName, "%s_%s", 165385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o->shortName, 165485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX[n]); 165585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 165685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (newName[0] != 0) { 165785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 165885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 165985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 166085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1661103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(o->verbose) { 1662103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("# Generating %s \n", gencmnFile); 1663103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1664103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 166585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho writeCCode(file, o->tmpDir, dataName[0] != 0 ? dataName : o->shortName, newName[0] != 0 ? newName : NULL, gencmnFile); 1666103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 166785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef USE_SINGLE_CCODE_FILE 1668103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(cmd, "#include \"%s\"\n", gencmnFile); 1669103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius T_FileStream_writeLine(icudtAllFile, cmd); 1670103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* don't delete the file */ 167185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 167285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 167385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 167485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifndef USE_SINGLE_CCODE_FILE 167585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(tempObjectFile, gencmnFile); 167685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile[uprv_strlen(tempObjectFile) - 1] = 'o'; 167785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 167885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s -o %s %s", 167985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[COMPILER], 168085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LIBFLAGS], 168185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile, 168285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gencmnFile); 168350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 168485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 1685103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating library without assembly code. Failed command: %s\n", cmd); 168685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 168785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 168885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 168950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(buffer, " "); 169050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(buffer, tempObjectFile); 169150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 169285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 169385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 169485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (i > 0) { 169585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho list = list->next; 169685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho listNames = listNames->next; 169785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 169885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 169985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 170085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef USE_SINGLE_CCODE_FILE 1701103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius T_FileStream_close(icudtAllFile); 170285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(tempObjectFile, icudtAll); 170385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile[uprv_strlen(tempObjectFile) - 1] = 'o'; 170450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1705103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(cmd, "%s %s -I. -o %s %s", 170685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[COMPILER], 170785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LIBFLAGS], 170885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile, 170985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho icudtAll); 171085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 171150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 171285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result == 0) { 171350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(buffer, " "); 171450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(buffer, tempObjectFile); 1715103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 1716103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating library without assembly code. Failed command: %s\n", cmd); 171785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 171885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 171985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 172085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result == 0) { 172185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Generate the library file. */ 1722103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_OS390 1723fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = pkg_generateLibraryFile(targetDir, mode, buffer, cmd, (o->pdsbuild && IN_DLL_MODE(mode))); 1724103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 1725103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_generateLibraryFile(targetDir,mode, buffer, cmd); 1726103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 172785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 172850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 172985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(buffer); 173085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(cmd); 173185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 173285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 173385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 173485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 173585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 173685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef WINDOWS_WITH_MSVC 173785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LINK_CMD "link.exe /nologo /release /out:" 173885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LINK_FLAGS "/DLL /NOENTRY /MANIFEST:NO /base:0x4ad00000 /implib:" 173985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LIB_CMD "LIB.exe /nologo /out:" 174085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LIB_FILE "icudt.lib" 174185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LIB_EXT UDATA_LIB_SUFFIX 174285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define DLL_EXT UDATA_SO_SUFFIX 174385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 174485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_createWindowsDLL(const char mode, const char *gencFilePath, UPKGOptions *o) { 1745103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t result = 0; 174685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char cmd[LARGE_BUFFER_MAX_SIZE]; 1747103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (IN_STATIC_MODE(mode)) { 174885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char staticLibFilePath[SMALL_BUFFER_MAX_SIZE] = ""; 174985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1750103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef CYGWINMSVC 1751103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(staticLibFilePath, "%s%s%s%s%s", 1752103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o->targetDir, 1753103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius PKGDATA_FILE_SEP_STRING, 1754103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[LIBPREFIX], 1755103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o->libName, 1756103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius LIB_EXT); 1757103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 1758103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(staticLibFilePath, "%s%s%s%s%s", 1759103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o->targetDir, 1760103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius PKGDATA_FILE_SEP_STRING, 1761103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius (strstr(o->libName, "icudt") ? "s" : ""), 1762103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o->libName, 1763103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius LIB_EXT); 1764103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 176585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 176685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s\"%s\" \"%s\"", 176785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_CMD, 176885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho staticLibFilePath, 176985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gencFilePath); 1770103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if (IN_DLL_MODE(mode)) { 177185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char dllFilePath[SMALL_BUFFER_MAX_SIZE] = ""; 177285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char libFilePath[SMALL_BUFFER_MAX_SIZE] = ""; 177385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char resFilePath[SMALL_BUFFER_MAX_SIZE] = ""; 177427f654740f2a26ad62a5c155af9199af9e69b889claireho char tmpResFilePath[SMALL_BUFFER_MAX_SIZE] = ""; 177585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 177685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef CYGWINMSVC 177785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(dllFilePath, o->targetDir); 177885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else 177985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(dllFilePath, o->srcDir); 178085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 178185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(dllFilePath, PKGDATA_FILE_SEP_STRING); 178285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(libFilePath, dllFilePath); 178385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 178450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#ifdef CYGWINMSVC 178550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(libFilePath, o->libName); 178650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(libFilePath, ".lib"); 178750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 178850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(dllFilePath, o->libName); 178950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(dllFilePath, o->version); 179050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else 179127f654740f2a26ad62a5c155af9199af9e69b889claireho if (strstr(o->libName, "icudt")) { 179227f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcat(libFilePath, LIB_FILE); 179327f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 179427f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcat(libFilePath, o->libName); 179527f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcat(libFilePath, ".lib"); 179627f654740f2a26ad62a5c155af9199af9e69b889claireho } 179785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(dllFilePath, o->entryName); 179850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 179950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(dllFilePath, DLL_EXT); 180050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 180127f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcpy(tmpResFilePath, o->tmpDir); 180227f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcat(tmpResFilePath, PKGDATA_FILE_SEP_STRING); 180327f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcat(tmpResFilePath, ICUDATA_RES_FILE); 180485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 180527f654740f2a26ad62a5c155af9199af9e69b889claireho if (T_FileStream_file_exists(tmpResFilePath)) { 180627f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(resFilePath, "\"%s\"", tmpResFilePath); 180785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 180885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 180985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Check if dll file and lib file exists and that it is not newer than genc file. */ 181085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (!o->rebuild && (T_FileStream_file_exists(dllFilePath) && isFileModTimeLater(dllFilePath, gencFilePath)) && 181185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho (T_FileStream_file_exists(libFilePath) && isFileModTimeLater(libFilePath, gencFilePath))) { 181250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 181350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho printf("# Not rebuilding %s - up to date.\n", gencFilePath); 181450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 181550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 181685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 181785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 181827f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(cmd, "%s\"%s\" %s\"%s\" \"%s\" %s", 181985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LINK_CMD, 182085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho dllFilePath, 182185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LINK_FLAGS, 182285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFilePath, 182385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gencFilePath, 182485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho resFilePath 182585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ); 182685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 182785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1828103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = runCommand(cmd, TRUE); 1829103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (result != 0) { 1830103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating Windows DLL library. Failed command: %s\n", cmd); 1831103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1832103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1833103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 183485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 183585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 183685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 183750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UPKGOptions *pkg_checkFlag(UPKGOptions *o) { 1838103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_AIX 183985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* AIX needs a map file. */ 184085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *flag = NULL; 184185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t length = 0; 184285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char tmpbuffer[SMALL_BUFFER_MAX_SIZE]; 184385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char MAP_FILE_EXT[] = ".map"; 184485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho FileStream *f = NULL; 184585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char mapFile[SMALL_BUFFER_MAX_SIZE] = ""; 184685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t start = -1; 1847103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uint32_t count = 0; 1848103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char rm_cmd[] = "rm -f all ;"; 1849103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1850103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius flag = pkgDataFlags[GENLIB]; 1851103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1852103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* This portion of the code removes 'rm -f all' in the GENLIB. 1853103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Only occurs in AIX. 1854103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 1855103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (uprv_strstr(flag, rm_cmd) != NULL) { 1856103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius char *tmpGenlibFlagBuffer = NULL; 1857103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t i, offset; 1858103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1859103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length = uprv_strlen(flag) + 1; 1860103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius tmpGenlibFlagBuffer = (char *)uprv_malloc(length); 1861103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (tmpGenlibFlagBuffer == NULL) { 1862103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Memory allocation error */ 1863103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr,"Unable to allocate buffer of size: %d.\n", length); 1864103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return NULL; 1865103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1866103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1867103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uprv_strcpy(tmpGenlibFlagBuffer, flag); 1868103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1869103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius offset = uprv_strlen(rm_cmd); 1870103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1871103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius for (i = 0; i < (length - offset); i++) { 1872103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius flag[i] = tmpGenlibFlagBuffer[offset + i]; 1873103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1874103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1875103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Zero terminate the string */ 1876103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius flag[i] = 0; 1877103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1878103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uprv_free(tmpGenlibFlagBuffer); 1879103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 188085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 188185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho flag = pkgDataFlags[BIR_FLAGS]; 188285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho length = uprv_strlen(pkgDataFlags[BIR_FLAGS]); 188385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 188485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t i = 0; i < length; i++) { 188585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (flag[i] == MAP_FILE_EXT[count]) { 188685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (count == 0) { 188785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho start = i; 188885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 188985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho count++; 189085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 189185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho count = 0; 189285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 189385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 189485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (count == uprv_strlen(MAP_FILE_EXT)) { 189585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 189685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 189785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 189885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 189985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (start >= 0) { 190085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t index = 0; 190185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t i = 0;;i++) { 190285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (i == start) { 190385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t n = 0;;n++) { 190485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->shortName[n] == 0) { 190585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 190685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 190785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tmpbuffer[index++] = o->shortName[n]; 190885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 190985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 191085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 191185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tmpbuffer[index++] = flag[i]; 191285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 191385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (flag[i] == 0) { 191485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 191585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 191685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 191785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 191885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memset(flag, 0, length); 191985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(flag, tmpbuffer); 192085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 192185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(mapFile, o->shortName); 192285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(mapFile, MAP_FILE_EXT); 192385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 192485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho f = T_FileStream_open(mapFile, "w"); 192585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (f == NULL) { 192685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr,"Unable to create map file: %s.\n", mapFile); 1927103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return NULL; 192850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 192950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(tmpbuffer, "%s%s ", o->entryName, UDATA_CMN_INTERMEDIATE_SUFFIX); 193050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 193150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho T_FileStream_writeLine(f, tmpbuffer); 193250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 193350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho T_FileStream_close(f); 193485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 193585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1936103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_CYGWIN || U_PLATFORM == U_PF_MINGW 193785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Cygwin needs to change flag options. */ 193885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *flag = NULL; 193985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t length = 0; 194085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 194185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho flag = pkgDataFlags[GENLIB]; 194285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho length = uprv_strlen(pkgDataFlags[GENLIB]); 194385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 194485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t position = length - 1; 194585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 194685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(;position >= 0;position--) { 194785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (flag[position] == '=') { 194885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho position++; 194985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 195085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 195185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 195285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 195385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memset(flag + position, 0, length - position); 1954103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS400 1955103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* OS/400 needs to fix the ld options (swap single quote with double quote) */ 195685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *flag = NULL; 195785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t length = 0; 195885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 195985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho flag = pkgDataFlags[GENLIB]; 196085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho length = uprv_strlen(pkgDataFlags[GENLIB]); 196185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 196285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t position = length - 1; 196385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 196485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(int32_t i = 0; i < length; i++) { 196585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (flag[i] == '\'') { 196685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho flag[i] = '\"'; 196785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 196885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 196985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 197050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Don't really need a return value, just need to stop compiler warnings about 197150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // the unused parameter 'o' on platforms where it is not otherwise used. 197250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return o; 197385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 197485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 197585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void loadLists(UPKGOptions *o, UErrorCode *status) 197685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 197785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho CharList *l, *tail = NULL, *tail2 = NULL; 197885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho FileStream *in; 197985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char line[16384]; 198085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *linePtr, *lineNext; 198185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const uint32_t lineMax = 16300; 1982b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho char *tmp; 1983b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t tmpLength = 0; 198485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *s; 198585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t ln=0; /* line number */ 198685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 198785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(l = o->fileListFiles; l; l = l->next) { 198885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(o->verbose) { 198950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# pkgdata: Reading %s..\n", l->str); 199085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 199185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* TODO: stdin */ 199285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho in = T_FileStream_open(l->str, "r"); /* open files list */ 199385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 199485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!in) { 199585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Error opening <%s>.\n", l->str); 199685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *status = U_FILE_ACCESS_ERROR; 199785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 199885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 199985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 200085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while(T_FileStream_readLine(in, line, sizeof(line))!=NULL) { /* for each line */ 200185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ln++; 200285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(uprv_strlen(line)>lineMax) { 200385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "%s:%d - line too long (over %d chars)\n", l->str, (int)ln, (int)lineMax); 200485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho exit(1); 200585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 200685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* remove spaces at the beginning */ 200785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho linePtr = line; 20088393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius /* On z/OS, disable call to isspace (#9996). Investigate using uprv_isspace instead (#9999) */ 20098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#if U_PLATFORM != U_PF_OS390 201085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while(isspace(*linePtr)) { 201185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho linePtr++; 201285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 20138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#endif 201485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho s=linePtr; 201585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* remove trailing newline characters */ 201685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while(*s!=0) { 201785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(*s=='\r' || *s=='\n') { 201885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *s=0; 201985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 202085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 202185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ++s; 202285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 202385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if((*linePtr == 0) || (*linePtr == '#')) { 202485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho continue; /* comment or empty line */ 202585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 202685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 202785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Now, process the line */ 202885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lineNext = NULL; 202985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 203085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while(linePtr && *linePtr) { /* process space-separated items */ 203185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while(*linePtr == ' ') { 203285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho linePtr++; 203385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 203485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Find the next quote */ 203585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(linePtr[0] == '"') 203685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 203785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lineNext = uprv_strchr(linePtr+1, '"'); 203885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(lineNext == NULL) { 203985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "%s:%d - missing trailing double quote (\")\n", 204085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho l->str, (int)ln); 204185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho exit(1); 204285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 204385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lineNext++; 204485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(*lineNext) { 204585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(*lineNext != ' ') { 204685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "%s:%d - malformed quoted line at position %d, expected ' ' got '%c'\n", 204785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho l->str, (int)ln, (int)(lineNext-line), (*lineNext)?*lineNext:'0'); 204885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho exit(1); 204985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 205085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *lineNext = 0; 205185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lineNext++; 205285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 205385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 205485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 205585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lineNext = uprv_strchr(linePtr, ' '); 205685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(lineNext) { 205785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *lineNext = 0; /* terminate at space */ 205885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lineNext++; 205985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 206085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 206185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 206285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* add the file */ 206385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho s = (char*)getLongPathname(linePtr); 206485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 206585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* normal mode.. o->files is just the bare list without package names */ 206685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o->files = pkg_appendToList(o->files, &tail, uprv_strdup(linePtr)); 2067103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(uprv_pathIsAbsolute(s) || s[0] == '.') { 206885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 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); 206985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho exit(U_ILLEGAL_ARGUMENT_ERROR); 207085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 2071b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tmpLength = uprv_strlen(o->srcDir) + 2072b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_strlen(s) + 5; /* 5 is to add a little extra space for, among other things, PKGDATA_FILE_SEP_STRING */ 2073b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if((tmp = (char *)uprv_malloc(tmpLength)) == NULL) { 2074b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fprintf(stderr, "pkgdata: Error: Unable to allocate tmp buffer size: %d\n", tmpLength); 2075b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho exit(U_MEMORY_ALLOCATION_ERROR); 2076b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 207785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(tmp, o->srcDir); 2078b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_strcat(tmp, o->srcDir[uprv_strlen(o->srcDir)-1] == U_FILE_SEP_CHAR ? "" : PKGDATA_FILE_SEP_STRING); 207985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(tmp, s); 2080b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho o->filePaths = pkg_appendToList(o->filePaths, &tail2, tmp); 208185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho linePtr = lineNext; 208285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } /* for each entry on line */ 208385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } /* for each line */ 208485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho T_FileStream_close(in); 208585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } /* for each file list file */ 208685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 208785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 208885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* Try calling icu-config directly to get the option file. */ 208950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static int32_t pkg_getOptionsFromICUConfig(UBool verbose, UOption *option) { 209085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if U_HAVE_POPEN 209150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FILE *p = NULL; 209285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho size_t n; 209385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho static char buf[512] = ""; 2094f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius icu::CharString cmdBuf; 209550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode status = U_ZERO_ERROR; 209685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char cmd[] = "icu-config --incpkgdatafile"; 2097f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius char dirBuf[1024] = ""; 209850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* #1 try the same path where pkgdata was called from. */ 2099f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius findDirname(progname, dirBuf, UPRV_LENGTHOF(dirBuf), &status); 210050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 2101f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius cmdBuf.append(dirBuf, status); 2102103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (cmdBuf[0] != 0) { 2103f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius cmdBuf.append( U_FILE_SEP_STRING, status ); 2104103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2105f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius cmdBuf.append( cmd, status ); 210650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 210750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(verbose) { 2108f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius fprintf(stdout, "# Calling icu-config: %s\n", cmdBuf.data()); 210950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 2110f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius p = popen(cmdBuf.data(), "r"); 211150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 211250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2113f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(p == NULL || (n = fread(buf, 1, UPRV_LENGTHOF(buf)-1, p)) <= 0) { 211450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(verbose) { 211550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Calling icu-config: %s\n", cmd); 211650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 211754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius pclose(p); 211885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 211954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius p = popen(cmd, "r"); 2120f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(p == NULL || (n = fread(buf, 1, UPRV_LENGTHOF(buf)-1, p)) <= 0) { 212154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius fprintf(stderr, "%s: icu-config: No icu-config found. (fix PATH or use -O option)\n", progname); 212254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return -1; 212354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 212485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 212585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 212685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pclose(p); 212785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 212885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t length = strlen(buf) - 1; length >= 0; length--) { 212985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (buf[length] == '\n' || buf[length] == ' ') { 213085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho buf[length] = 0; 213185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 213285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 213385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 213485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 213585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 213685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(buf[strlen(buf)-1]=='\n') 213785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 213885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho buf[strlen(buf)-1]=0; 213985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 214085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 214185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(buf[0] == 0) 214285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 214385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "%s: icu-config: invalid response from icu-config (fix PATH or use -O option)\n", progname); 214485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 214585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 214685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 214750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(verbose) { 214850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# icu-config said: %s\n", buf); 214950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 215050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 215185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho option->value = buf; 215285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho option->doesOccur = TRUE; 215385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 215485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 0; 215554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#else 215685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 215754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 215885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 21591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 21601b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#ifdef CAN_WRITE_OBJ_CODE 21611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert /* Create optMatchArch for genccode architecture detection */ 21621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertstatic void pkg_createOptMatchArch(char *optMatchArch) { 21631b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) 21641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert const char* code = "void oma(){}"; 21651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert const char* source = "oma.c"; 21661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert const char* obj = "oma.obj"; 21671b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert FileStream* stream = NULL; 21681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 21691b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert stream = T_FileStream_open(source,"w"); 21701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (stream != NULL) { 21711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert T_FileStream_writeLine(stream, code); 21721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert T_FileStream_close(stream); 21731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 21741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert char cmd[SMALL_BUFFER_MAX_SIZE]; 21751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert sprintf(cmd, "%s %s -o %s", 21761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert pkgDataFlags[COMPILER], 21771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert source, 21781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert obj); 21791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 21801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (runCommand(cmd) == 0){ 21811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert sprintf(optMatchArch, "%s", obj); 21821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 21831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert else { 21841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert fprintf(stderr, "Failed to compile %s\n", source); 21851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 21861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if(!T_FileStream_remove(source)){ 21871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert fprintf(stderr, "T_FileStream_remove failed to delete %s\n", source); 21881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 21891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 21901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert else { 21911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert fprintf(stderr, "T_FileStream_open failed to open %s for writing\n", source); 21921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 21931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#endif 21941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert} 21951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertstatic void pkg_destroyOptMatchArch(char *optMatchArch) { 21961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if(T_FileStream_file_exists(optMatchArch) && !T_FileStream_remove(optMatchArch)){ 21971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert fprintf(stderr, "T_FileStream_remove failed to delete %s\n", optMatchArch); 21981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 21991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert} 22001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#endif 2201