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 59c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#if U_HAVE_POPEN 60c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 61c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertusing icu::LocalPointerBase; 62c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 63c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertU_DEFINE_LOCAL_OPEN_POINTER(LocalPipeFilePointer, FILE, pclose); 64c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 65c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif 6685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void loadLists(UPKGOptions *o, UErrorCode *status); 6885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_executeOptions(UPKGOptions *o); 7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef WINDOWS_WITH_MSVC 7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_createWindowsDLL(const char mode, const char *gencFilePath, UPKGOptions *o); 7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 7450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int32_t pkg_createSymLinks(const char *targetDir, UBool specialHandling=FALSE); 75103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic int32_t pkg_installLibrary(const char *installDir, const char *dir, UBool noVersion); 7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_installFileMode(const char *installDir, const char *srcDir, const char *fileListName); 7727f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int32_t pkg_installCommonMode(const char *installDir, const char *fileName); 7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef BUILD_DATA_WITHOUT_ASSEMBLY 8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_createWithoutAssemblyCode(UPKGOptions *o, const char *targetDir, const char mode); 8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 8285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#ifdef CAN_WRITE_OBJ_CODE 841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertstatic void pkg_createOptMatchArch(char *optMatchArch); 851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertstatic void pkg_destroyOptMatchArch(char *optMatchArch); 861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#endif 871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 8885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_createWithAssemblyCode(const char *targetDir, const char mode, const char *gencFilePath); 89fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, const char *objectFile, char *command = NULL, UBool specialHandling=FALSE); 9085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_archiveLibrary(const char *targetDir, const char *version, UBool reverseExt); 91103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void createFileNames(UPKGOptions *o, const char mode, const char *version_major, const char *version, const char *libName, const UBool reverseExt, UBool noVersion); 9227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int32_t initializePkgDataFlags(UPKGOptions *o); 9385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 9450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int32_t pkg_getOptionsFromICUConfig(UBool verbose, UOption *option); 9550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int runCommand(const char* command, UBool specialHandling=FALSE); 9685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 97103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define IN_COMMON_MODE(mode) (mode == 'a' || mode == 'c') 98103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define IN_DLL_MODE(mode) (mode == 'd' || mode == 'l') 99103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define IN_STATIC_MODE(mode) (mode == 's') 100103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define IN_FILES_MODE(mode) (mode == 'f') 101103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 10285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoenum { 10385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho NAME, 10485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho BLDOPT, 10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho MODE, 10685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho HELP, 10785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho HELP_QUESTION_MARK, 10885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho VERBOSE, 10985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho COPYRIGHT, 11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho COMMENT, 11185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DESTDIR, 11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho REBUILD, 11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho TEMPDIR, 11485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho INSTALL, 11585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho SOURCEDIR, 11685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ENTRYPOINT, 11785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho REVISION, 11885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho FORCE_PREFIX, 11985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIBNAME, 120103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius QUIET, 121103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius WITHOUT_ASSEMBLY, 122103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius PDS_BUILD 12385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 12485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 12585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* This sets the modes that are available */ 12685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic struct { 12785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *name, *alt_name; 12885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *desc; 12985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} modes[] = { 13085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "files", 0, "Uses raw data files (no effect). Installation copies all files to the target location." }, 131103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_HAS_WIN32_API 13285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "dll", "library", "Generates one common data file and one shared library, <package>.dll"}, 13385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "common", "archive", "Generates just the common file, <package>.dat"}, 13485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "static", "static", "Generates one statically linked library, " LIB_PREFIX "<package>" UDATA_LIB_SUFFIX } 13585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else 13685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef UDATA_SO_SUFFIX 13785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "dll", "library", "Generates one shared library, <package>" UDATA_SO_SUFFIX }, 13885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 13985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "common", "archive", "Generates one common data file, <package>.dat" }, 14085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { "static", "static", "Generates one statically linked library, " LIB_PREFIX "<package>" UDATA_LIB_SUFFIX } 14185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 14285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 14385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 14485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic UOption options[]={ 14585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*00*/ UOPTION_DEF( "name", 'p', UOPT_REQUIRES_ARG), 14685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*01*/ UOPTION_DEF( "bldopt", 'O', UOPT_REQUIRES_ARG), /* on Win32 it is release or debug */ 14785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*02*/ UOPTION_DEF( "mode", 'm', UOPT_REQUIRES_ARG), 14885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*03*/ UOPTION_HELP_H, /* -h */ 14985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*04*/ UOPTION_HELP_QUESTION_MARK, /* -? */ 15085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*05*/ UOPTION_VERBOSE, /* -v */ 15185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*06*/ UOPTION_COPYRIGHT, /* -c */ 15285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*07*/ UOPTION_DEF( "comment", 'C', UOPT_REQUIRES_ARG), 15385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*08*/ UOPTION_DESTDIR, /* -d */ 15485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*11*/ UOPTION_DEF( "rebuild", 'F', UOPT_NO_ARG), 15585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*12*/ UOPTION_DEF( "tempdir", 'T', UOPT_REQUIRES_ARG), 15685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*13*/ UOPTION_DEF( "install", 'I', UOPT_REQUIRES_ARG), 15785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*14*/ UOPTION_SOURCEDIR , 15885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*15*/ UOPTION_DEF( "entrypoint", 'e', UOPT_REQUIRES_ARG), 15985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*16*/ UOPTION_DEF( "revision", 'r', UOPT_REQUIRES_ARG), 16085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*17*/ UOPTION_DEF( "force-prefix", 'f', UOPT_NO_ARG), 16185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*18*/ UOPTION_DEF( "libname", 'L', UOPT_REQUIRES_ARG), 162103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /*19*/ UOPTION_DEF( "quiet", 'q', UOPT_NO_ARG), 163103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /*20*/ UOPTION_DEF( "without-assembly", 'w', UOPT_NO_ARG), 164103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /*21*/ UOPTION_DEF( "zos-pds-build", 'z', UOPT_NO_ARG) 16585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 16685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 167103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/* This enum and the following char array should be kept in sync. */ 16885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoenum { 16985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho GENCCODE_ASSEMBLY_TYPE, 17085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho SO_EXT, 17185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho SOBJ_EXT, 17285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho A_EXT, 17385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIBPREFIX, 17485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_EXT_ORDER, 17585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho COMPILER, 17685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIBFLAGS, 17785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho GENLIB, 17885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LDICUDTFLAGS, 17985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LD_SONAME, 18085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho RPATH_FLAGS, 18185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho BIR_FLAGS, 18285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho AR, 18385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ARFLAGS, 18485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho RANLIB, 18585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho INSTALL_CMD, 18685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho PKGDATA_FLAGS_SIZE 18785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 188103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic const char* FLAG_NAMES[PKGDATA_FLAGS_SIZE] = { 189103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "GENCCODE_ASSEMBLY_TYPE", 190103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "SO", 191103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "SOBJ", 192103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "A", 193103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "LIBPREFIX", 194103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "LIB_EXT_ORDER", 195103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "COMPILE", 196103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "LIBFLAGS", 197103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "GENLIB", 198103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "LDICUDTFLAGS", 199103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "LD_SONAME", 200103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "RPATH_FLAGS", 201103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "BIR_LDFLAGS", 202103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "AR", 203103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "ARFLAGS", 204103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "RANLIB", 205103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "INSTALL_CMD" 206103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}; 20785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic char **pkgDataFlags = NULL; 20885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 20985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoenum { 21085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_FILE, 21185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_FILE_VERSION_MAJOR, 21285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_FILE_VERSION, 21385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_FILE_VERSION_TMP, 214103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_CYGWIN 21585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_FILE_CYGWIN, 216103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius LIB_FILE_CYGWIN_VERSION, 217103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_MINGW 218103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius LIB_FILE_MINGW, 219fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#elif U_PLATFORM == U_PF_OS390 220fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius LIB_FILE_OS390BATCH_MAJOR, 221fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius LIB_FILE_OS390BATCH_VERSION, 22285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 22385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_FILENAMES_SIZE 22485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 22585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic char libFileNames[LIB_FILENAMES_SIZE][256]; 22685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 22750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UPKGOptions *pkg_checkFlag(UPKGOptions *o); 22885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 22985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoconst char options_help[][320]={ 23085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Set the data name", 23185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef U_MAKE_IS_NMAKE 23285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "The directory where the ICU is located (e.g. <ICUROOT> which contains the bin directory)", 23385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else 23485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Specify options for the builder.", 23585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 23685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Specify the mode of building (see below; default: common)", 23785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "This usage text", 23885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "This usage text", 23985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Make the output verbose", 24085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Use the standard ICU copyright", 24185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Use a custom comment (instead of the copyright)", 24285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Specify the destination directory for files", 24385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Force rebuilding of all data", 24485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Specify temporary dir (default: output dir)", 24585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Install the data (specify target)", 24685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Specify a custom source directory", 24785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Specify a custom entrypoint name (default: short name)", 24850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "Specify a version when packaging in dll or static mode", 24985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Add package to all file names if not present", 25085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Library name to build (if different than package name)", 251103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "Quite mode. (e.g. Do not output a readme file for static libraries)", 252fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "Build the data without assembly code", 253fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "Build PDS dataset (zOS build only)" 25485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 25585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 25685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoconst char *progname = "PKGDATA"; 25785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 25885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint 25985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Homain(int argc, char* argv[]) { 26085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int result = 0; 26185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* FileStream *out; */ 26285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UPKGOptions o; 26385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho CharList *tail; 26485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool needsHelp = FALSE; 26585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 26685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* char tmp[1024]; */ 26785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t i; 26885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t n; 26985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 27085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho U_MAIN_INIT_ARGS(argc, argv); 27185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 27285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho progname = argv[0]; 27385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 27485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho options[MODE].value = "common"; 27585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 27685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* read command line options */ 27785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); 27885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 27985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* error handling, printing usage message */ 28085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* I've decided to simply print an error and quit. This tool has too 28185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho many options to just display them all of the time. */ 28285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 28385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(options[HELP].doesOccur || options[HELP_QUESTION_MARK].doesOccur) { 28485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho needsHelp = TRUE; 28585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 28685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho else { 28785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!needsHelp && argc<0) { 28885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, 28985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "%s: error in command line argument \"%s\"\n", 29085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho progname, 29185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho argv[-argc]); 29285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Run '%s --help' for help.\n", progname); 29385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 1; 29485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 29585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 29685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) 29850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(!options[BLDOPT].doesOccur && uprv_strcmp(options[MODE].value, "common") != 0) { 29950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (pkg_getOptionsFromICUConfig(options[VERBOSE].doesOccur, &options[BLDOPT]) != 0) { 30050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, " required parameter is missing: -O is required for static and shared builds.\n"); 30185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Run '%s --help' for help.\n", progname); 30285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 1; 30385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 30485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 30585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else 30685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(options[BLDOPT].doesOccur) { 30785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stdout, "Warning: You are using the -O option which is not needed for MSVC build on Windows.\n"); 30885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 30985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 31085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 31185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!options[NAME].doesOccur) /* -O we already have - don't report it. */ 31285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 31385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, " required parameter -p is missing \n"); 31485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Run '%s --help' for help.\n", progname); 31585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 1; 31685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 31785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 31885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(argc == 1) { 31985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, 32085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "No input files specified.\n" 32185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "Run '%s --help' for help.\n", progname); 32285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 1; 32385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 32485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } /* end !needsHelp */ 32585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 32685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(argc<0 || needsHelp ) { 32785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, 32885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "usage: %s [-options] [-] [packageFile] \n" 32985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "\tProduce packaged ICU data from the given list(s) of files.\n" 33085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "\t'-' by itself means to read from stdin.\n" 33185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "\tpackageFile is a text file containing the list of files to package.\n", 33285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho progname); 33385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 33485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "\n options:\n"); 33585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i=0;i<(sizeof(options)/sizeof(options[0]));i++) { 33685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "%-5s -%c %s%-10s %s\n", 33785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho (i<1?"[REQ]":""), 33885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho options[i].shortName, 33985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho options[i].longName ? "or --" : " ", 34085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho options[i].longName ? options[i].longName : "", 34185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho options_help[i]); 34285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 34385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 34485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "modes: (-m option)\n"); 34585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i=0;i<(sizeof(modes)/sizeof(modes[0]));i++) { 34685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, " %-9s ", modes[i].name); 34785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (modes[i].alt_name) { 34885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "/ %-9s", modes[i].alt_name); 34985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 35085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, " "); 35185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 35285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, " %s\n", modes[i].desc); 35385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 35485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 1; 35585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 35685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 35785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* OK, fill in the options struct */ 35885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memset(&o, 0, sizeof(o)); 35985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 36085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.mode = options[MODE].value; 36185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.version = options[REVISION].doesOccur ? options[REVISION].value : 0; 36285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 36385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.shortName = options[NAME].value; 36485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 36585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t len = (int32_t)uprv_strlen(o.shortName); 36685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *csname, *cp; 36785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *sp; 36885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 36985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho cp = csname = (char *) uprv_malloc((len + 1 + 1) * sizeof(*o.cShortName)); 37085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (*(sp = o.shortName)) { 37185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *cp++ = isalpha(*sp) ? * sp : '_'; 37285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (++sp; *sp; ++sp) { 37385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *cp++ = isalnum(*sp) ? *sp : '_'; 37485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 37585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 37685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *cp = 0; 37785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 37885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.cShortName = csname; 37985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 38085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 38185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(options[LIBNAME].doesOccur) { /* get libname from shortname, or explicit -L parameter */ 38285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.libName = options[LIBNAME].value; 38385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 38485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.libName = o.shortName; 38585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 38685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 38785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(options[QUIET].doesOccur) { 38885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.quiet = TRUE; 38985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 39085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.quiet = FALSE; 39185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 39285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 393103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(options[PDS_BUILD].doesOccur) { 394fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if U_PLATFORM == U_PF_OS390 395103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o.pdsbuild = TRUE; 396fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#else 397fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius o.pdsbuild = FALSE; 398fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fprintf(stdout, "Warning: You are using the -z option which only works on z/OS.\n"); 399fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 400fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif 401103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 402103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o.pdsbuild = FALSE; 403103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 404103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 40585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.verbose = options[VERBOSE].doesOccur; 40685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 40750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 40850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) /* on UNIX, we'll just include the file... */ 40950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (options[BLDOPT].doesOccur) { 41050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho o.options = options[BLDOPT].value; 41150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 41250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho o.options = NULL; 41350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 41485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 41585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(options[COPYRIGHT].doesOccur) { 41685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.comment = U_COPYRIGHT_STRING; 41785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else if (options[COMMENT].doesOccur) { 41885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.comment = options[COMMENT].value; 41985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 42085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 42185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if( options[DESTDIR].doesOccur ) { 42285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.targetDir = options[DESTDIR].value; 42385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 42485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.targetDir = "."; /* cwd */ 42585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 42685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 42785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.rebuild = options[REBUILD].doesOccur; 42885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 42985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if( options[TEMPDIR].doesOccur ) { 43085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.tmpDir = options[TEMPDIR].value; 43185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 43285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.tmpDir = o.targetDir; 43385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 43485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 43585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if( options[INSTALL].doesOccur ) { 43685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.install = options[INSTALL].value; 43785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 43885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.install = NULL; 43985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 44085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 44185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if( options[SOURCEDIR].doesOccur ) { 44285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.srcDir = options[SOURCEDIR].value; 44385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 44485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.srcDir = "."; 44585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 44685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 44785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if( options[ENTRYPOINT].doesOccur ) { 44885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.entryName = options[ENTRYPOINT].value; 44985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 45085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.entryName = o.cShortName; 45185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 45285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 453103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o.withoutAssembly = FALSE; 454103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (options[WITHOUT_ASSEMBLY].doesOccur) { 455103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifndef BUILD_DATA_WITHOUT_ASSEMBLY 456103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, "Warning: You are using the option to build without assembly code which is not supported on this platform.\n"); 457103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, "Warning: This option will be ignored.\n"); 458103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 459103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o.withoutAssembly = TRUE; 460103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 461103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 462103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 46385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* OK options are set up. Now the file lists. */ 46485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tail = NULL; 46585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for( n=1; n<argc; n++) { 46685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o.fileListFiles = pkg_appendToList(o.fileListFiles, &tail, uprv_strdup(argv[n])); 46785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 46885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 46985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* load the files */ 47085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho loadLists(&o, &status); 47185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if( U_FAILURE(status) ) { 47285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "error loading input file lists: %s\n", u_errorName(status)); 47385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 2; 47485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 47585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 47685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = pkg_executeOptions(&o); 47785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 47885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (pkgDataFlags != NULL) { 47985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (n = 0; n < PKGDATA_FLAGS_SIZE; n++) { 48085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (pkgDataFlags[n] != NULL) { 48185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(pkgDataFlags[n]); 48285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 48385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 48485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(pkgDataFlags); 48585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 48685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 48785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o.cShortName != NULL) { 48885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free((char *)o.cShortName); 48985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 49085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o.fileListFiles != NULL) { 49185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkg_deleteList(o.fileListFiles); 49285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 49385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o.filePaths != NULL) { 49485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkg_deleteList(o.filePaths); 49585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 49685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o.files != NULL) { 49785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkg_deleteList(o.files); 49885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 49985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 50085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 50185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 50285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 50350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int runCommand(const char* command, UBool specialHandling) { 50427f654740f2a26ad62a5c155af9199af9e69b889claireho char *cmd = NULL; 50527f654740f2a26ad62a5c155af9199af9e69b889claireho char cmdBuffer[SMALL_BUFFER_MAX_SIZE]; 50627f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t len = strlen(command); 50727f654740f2a26ad62a5c155af9199af9e69b889claireho 50827f654740f2a26ad62a5c155af9199af9e69b889claireho if (len == 0) { 50927f654740f2a26ad62a5c155af9199af9e69b889claireho return 0; 51027f654740f2a26ad62a5c155af9199af9e69b889claireho } 51150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 51250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!specialHandling) { 513103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if defined(USING_CYGWIN) || U_PLATFORM == U_PF_MINGW || U_PLATFORM == U_PF_OS400 514b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ((len + BUFFER_PADDING_SIZE) >= SMALL_BUFFER_MAX_SIZE) { 515b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho cmd = (char *)uprv_malloc(len + BUFFER_PADDING_SIZE); 51627f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 51727f654740f2a26ad62a5c155af9199af9e69b889claireho cmd = cmdBuffer; 51827f654740f2a26ad62a5c155af9199af9e69b889claireho } 519103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if defined(USING_CYGWIN) || U_PLATFORM == U_PF_MINGW 52050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "bash -c \"%s\"", command); 52150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 522103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS400 52350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "QSH CMD('%s')", command); 52427f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 52550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else 52650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho goto normal_command_mode; 52750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 52850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 529103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !(defined(USING_CYGWIN) || U_PLATFORM == U_PF_MINGW || U_PLATFORM == U_PF_OS400) 53050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehonormal_command_mode: 531103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 53227f654740f2a26ad62a5c155af9199af9e69b889claireho cmd = (char *)command; 53350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 53427f654740f2a26ad62a5c155af9199af9e69b889claireho 53550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho printf("pkgdata: %s\n", cmd); 53650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int result = system(cmd); 53727f654740f2a26ad62a5c155af9199af9e69b889claireho if (result != 0) { 538103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "-- return status = %d\n", result); 53950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 54027f654740f2a26ad62a5c155af9199af9e69b889claireho 54127f654740f2a26ad62a5c155af9199af9e69b889claireho if (cmd != cmdBuffer && cmd != command) { 54227f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_free(cmd); 54327f654740f2a26ad62a5c155af9199af9e69b889claireho } 54427f654740f2a26ad62a5c155af9199af9e69b889claireho 54527f654740f2a26ad62a5c155af9199af9e69b889claireho return result; 54627f654740f2a26ad62a5c155af9199af9e69b889claireho} 54750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 54885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LN_CMD "ln -s" 54985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define RM_CMD "rm -f" 55085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 55185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_executeOptions(UPKGOptions *o) { 55285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 55327f654740f2a26ad62a5c155af9199af9e69b889claireho 55485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char mode = o->mode[0]; 55585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char targetDir[SMALL_BUFFER_MAX_SIZE] = ""; 55685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char tmpDir[SMALL_BUFFER_MAX_SIZE] = ""; 55785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char datFileName[SMALL_BUFFER_MAX_SIZE] = ""; 55885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char datFileNamePath[LARGE_BUFFER_MAX_SIZE] = ""; 55985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char checkLibFile[LARGE_BUFFER_MAX_SIZE] = ""; 56085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 56127f654740f2a26ad62a5c155af9199af9e69b889claireho initializePkgDataFlags(o); 56227f654740f2a26ad62a5c155af9199af9e69b889claireho 563103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (IN_FILES_MODE(mode)) { 56485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Copy the raw data to the installation directory. */ 56585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->install != NULL) { 56685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(targetDir, o->install); 56785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->shortName != NULL) { 56885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(targetDir, PKGDATA_FILE_SEP_STRING); 56985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(targetDir, o->shortName); 57085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 57150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 57250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 57350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Install: Files mode, copying files to %s..\n", targetDir); 57450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 57585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = pkg_installFileMode(targetDir, o->srcDir, o->fileListFiles->str); 57685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 57785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 578103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else /* if (IN_COMMON_MODE(mode) || IN_DLL_MODE(mode) || IN_STATIC_MODE(mode)) */ { 579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UBool noVersion = FALSE; 580103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 58185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(targetDir, o->targetDir); 58285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(targetDir, PKGDATA_FILE_SEP_STRING); 58385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 58485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(tmpDir, o->tmpDir); 58585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(tmpDir, PKGDATA_FILE_SEP_STRING); 58685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 58785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(datFileNamePath, tmpDir); 58885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 58985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(datFileName, o->shortName); 59085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(datFileName, UDATA_CMN_SUFFIX); 59185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 59285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(datFileNamePath, datFileName); 59385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 59450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 59550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Writing package file %s ..\n", datFileNamePath); 59650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 59750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = writePackageDatFile(datFileNamePath, o->comment, o->srcDir, o->fileListFiles->str, NULL, U_CHARSET_FAMILY ? 'e' : U_IS_BIG_ENDIAN ? 'b' : 'l'); 59885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 59985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr,"Error writing package dat file.\n"); 60085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 60185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 60285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 603103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (IN_COMMON_MODE(mode)) { 60485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char targetFileNamePath[LARGE_BUFFER_MAX_SIZE] = ""; 60585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 60685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(targetFileNamePath, targetDir); 60785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(targetFileNamePath, datFileName); 60885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 609103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Move the dat file created to the target directory. */ 610103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (uprv_strcmp(datFileNamePath, targetFileNamePath) != 0) { 611103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (T_FileStream_file_exists(targetFileNamePath)) { 612103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if ((result = remove(targetFileNamePath)) != 0) { 613103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Unable to remove old dat file: %s\n", 614103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetFileNamePath); 615103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 616103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 61785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 61885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 619103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = rename(datFileNamePath, targetFileNamePath); 62050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 621103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (o->verbose) { 622103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, "# Moving package file to %s ..\n", 623103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetFileNamePath); 624103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 625103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (result != 0) { 626103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf( 627103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius stderr, 628103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "Unable to move dat file (%s) to target location (%s).\n", 629103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius datFileNamePath, targetFileNamePath); 630103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 631103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 63285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 63385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 63427f654740f2a26ad62a5c155af9199af9e69b889claireho if (o->install != NULL) { 63527f654740f2a26ad62a5c155af9199af9e69b889claireho result = pkg_installCommonMode(o->install, targetFileNamePath); 63627f654740f2a26ad62a5c155af9199af9e69b889claireho } 63727f654740f2a26ad62a5c155af9199af9e69b889claireho 63885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 639103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else /* if (IN_STATIC_MODE(mode) || IN_DLL_MODE(mode)) */ { 64085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char gencFilePath[SMALL_BUFFER_MAX_SIZE] = ""; 64185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char version_major[10] = ""; 64285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool reverseExt = FALSE; 64385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 64450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) 64585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Get the version major number. */ 64685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->version != NULL) { 64785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (uint32_t i = 0;i < sizeof(version_major);i++) { 64885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->version[i] == '.') { 64985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho version_major[i] = 0; 65085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 65185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 65285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho version_major[i] = o->version[i]; 65385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 654103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 655103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius noVersion = TRUE; 656103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (IN_DLL_MODE(mode)) { 657103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, "Warning: Providing a revision number with the -r option is recommended when packaging data in the current mode.\n"); 658103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 65985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 66085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 661103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM != U_PF_OS400 66285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Certain platforms have different library extension ordering. (e.g. libicudata.##.so vs libicudata.so.##) 66385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * reverseExt is FALSE if the suffix should be the version number. 66485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 66585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (pkgDataFlags[LIB_EXT_ORDER][uprv_strlen(pkgDataFlags[LIB_EXT_ORDER])-1] == pkgDataFlags[SO_EXT][uprv_strlen(pkgDataFlags[SO_EXT])-1]) { 66685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt = TRUE; 66785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 66885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 66985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Using the base libName and version number, generate the library file names. */ 670103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius createFileNames(o, mode, version_major, o->version == NULL ? "" : o->version, o->libName, reverseExt, noVersion); 67185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 672fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if ((o->version!=NULL || IN_STATIC_MODE(mode)) && o->rebuild == FALSE && o->pdsbuild == FALSE) { 67385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Check to see if a previous built data library file exists and check if it is the latest. */ 67450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(checkLibFile, "%s%s", targetDir, libFileNames[LIB_FILE_VERSION]); 67585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (T_FileStream_file_exists(checkLibFile)) { 67685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (isFileModTimeLater(checkLibFile, o->srcDir, TRUE) && isFileModTimeLater(checkLibFile, o->options)) { 67785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->install != NULL) { 67850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 67950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Installing already-built library into %s\n", o->install); 68050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 681103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_installLibrary(o->install, targetDir, noVersion); 68250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 68350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 68450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho printf("# Not rebuilding %s - up to date.\n", checkLibFile); 68550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 68685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 68785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 68850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if (o->verbose && (o->install!=NULL)) { 68950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Not installing up-to-date library %s into %s\n", checkLibFile, o->install); 69085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 69150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if(o->verbose && (o->install!=NULL)) { 69250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Not installing missing %s into %s\n", checkLibFile, o->install); 69385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 69485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 69585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 696103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (pkg_checkFlag(o) == NULL) { 697103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Error occurred. */ 698103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 699103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 70085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 70185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 702103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (!o->withoutAssembly && pkgDataFlags[GENCCODE_ASSEMBLY_TYPE][0] != 0) { 70385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char* genccodeAssembly = pkgDataFlags[GENCCODE_ASSEMBLY_TYPE]; 70485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 70550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 70650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Generating assembly code %s of type %s ..\n", gencFilePath, genccodeAssembly); 70750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 70850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 70985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Offset genccodeAssembly by 3 because "-a " */ 71050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (genccodeAssembly && 71150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (uprv_strlen(genccodeAssembly)>3) && 71250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho checkAssemblyHeaderName(genccodeAssembly+3)) { 71385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho writeAssemblyCode(datFileNamePath, o->tmpDir, o->entryName, NULL, gencFilePath); 71485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 71585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = pkg_createWithAssemblyCode(targetDir, mode, gencFilePath); 71685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 71785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Error generating assembly code for data.\n"); 71885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 719103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if (IN_STATIC_MODE(mode)) { 72050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->install != NULL) { 72150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 72250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Installing static library into %s\n", o->install); 72350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 724103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_installLibrary(o->install, targetDir, noVersion); 72550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 72650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return result; 72785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 72885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 72985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr,"Assembly type \"%s\" is unknown.\n", genccodeAssembly); 73085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 73185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 73285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 73350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 73450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Writing object code to %s ..\n", gencFilePath); 73550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 736103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (o->withoutAssembly) { 737103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef BUILD_DATA_WITHOUT_ASSEMBLY 738103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_createWithoutAssemblyCode(o, targetDir, mode); 739103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 740103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* This error should not occur. */ 741103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error- BUILD_DATA_WITHOUT_ASSEMBLY is not defined. Internal error.\n"); 742103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 743103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 74485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef CAN_WRITE_OBJ_CODE 7451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert /* Try to detect the arch type, use NULL if unsuccessful */ 7461b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert char optMatchArch[10] = { 0 }; 7471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert pkg_createOptMatchArch(optMatchArch); 7481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert writeObjectCode(datFileNamePath, o->tmpDir, o->entryName, (optMatchArch[0] == 0 ? NULL : optMatchArch), NULL, gencFilePath); 7491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert pkg_destroyOptMatchArch(optMatchArch); 750103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_IS_LINUX_BASED 751103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_generateLibraryFile(targetDir, mode, gencFilePath); 75285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#elif defined(WINDOWS_WITH_MSVC) 753103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_createWindowsDLL(mode, gencFilePath, o); 75485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 75585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#elif defined(BUILD_DATA_WITHOUT_ASSEMBLY) 756103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_createWithoutAssemblyCode(o, targetDir, mode); 757103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 758103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error- neither CAN_WRITE_OBJ_CODE nor BUILD_DATA_WITHOUT_ASSEMBLY are defined. Internal error.\n"); 759103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return 1; 76085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 761103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 762103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 76385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 76485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Error generating package data.\n"); 76585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 76685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 76785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 768103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !U_PLATFORM_USES_ONLY_WIN32_API 769103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(!IN_STATIC_MODE(mode)) { 77050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Certain platforms uses archive library. (e.g. AIX) */ 77150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 77250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Creating data archive library file ..\n"); 77350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 77450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = pkg_archiveLibrary(targetDir, o->version, reverseExt); 77550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (result != 0) { 77650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "Error creating data archive library file.\n"); 77750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return result; 77850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 779103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM != U_PF_OS400 780103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (!noVersion) { 781103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Create symbolic links for the final library file. */ 782103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_OS390 783fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = pkg_createSymLinks(targetDir, o->pdsbuild); 784103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 785103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_createSymLinks(targetDir, noVersion); 786103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 787103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (result != 0) { 788103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating symbolic links of the data library file.\n"); 789103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 790103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 79150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 7926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#endif 793103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } /* !IN_STATIC_MODE */ 79485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 79550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 796103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !U_PLATFORM_USES_ONLY_WIN32_API 79785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Install the libraries if option was set. */ 79885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->install != NULL) { 79950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 80050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# Installing library file to %s ..\n", o->install); 80150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 802103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_installLibrary(o->install, targetDir, noVersion); 80385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 80485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Error installing the data library.\n"); 80585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 80685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 80785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 80885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 80985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 81085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 81185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 81285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 81327f654740f2a26ad62a5c155af9199af9e69b889claireho 81427f654740f2a26ad62a5c155af9199af9e69b889claireho/* Initialize the pkgDataFlags with the option file given. */ 81527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int32_t initializePkgDataFlags(UPKGOptions *o) { 81627f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 81727f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t result = 0; 81827f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t currentBufferSize = SMALL_BUFFER_MAX_SIZE; 81927f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t tmpResult = 0; 82027f654740f2a26ad62a5c155af9199af9e69b889claireho 82127f654740f2a26ad62a5c155af9199af9e69b889claireho /* Initialize pkgdataFlags */ 82227f654740f2a26ad62a5c155af9199af9e69b889claireho pkgDataFlags = (char**)uprv_malloc(sizeof(char*) * PKGDATA_FLAGS_SIZE); 82327f654740f2a26ad62a5c155af9199af9e69b889claireho 82427f654740f2a26ad62a5c155af9199af9e69b889claireho /* If we run out of space, allocate more */ 82527f654740f2a26ad62a5c155af9199af9e69b889claireho#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) 82627f654740f2a26ad62a5c155af9199af9e69b889claireho do { 82727f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 82827f654740f2a26ad62a5c155af9199af9e69b889claireho if (pkgDataFlags != NULL) { 82927f654740f2a26ad62a5c155af9199af9e69b889claireho for (int32_t i = 0; i < PKGDATA_FLAGS_SIZE; i++) { 83027f654740f2a26ad62a5c155af9199af9e69b889claireho pkgDataFlags[i] = (char*)uprv_malloc(sizeof(char) * currentBufferSize); 83127f654740f2a26ad62a5c155af9199af9e69b889claireho if (pkgDataFlags[i] != NULL) { 83227f654740f2a26ad62a5c155af9199af9e69b889claireho pkgDataFlags[i][0] = 0; 83327f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 83427f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stderr,"Error allocating memory for pkgDataFlags.\n"); 835c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert /* If an error occurs, ensure that the rest of the array is NULL */ 836c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert for (int32_t n = i + 1; n < PKGDATA_FLAGS_SIZE; n++) { 837c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert pkgDataFlags[n] = NULL; 838c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 83927f654740f2a26ad62a5c155af9199af9e69b889claireho return -1; 84027f654740f2a26ad62a5c155af9199af9e69b889claireho } 84127f654740f2a26ad62a5c155af9199af9e69b889claireho } 84227f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 84327f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stderr,"Error allocating memory for pkgDataFlags.\n"); 84427f654740f2a26ad62a5c155af9199af9e69b889claireho return -1; 84527f654740f2a26ad62a5c155af9199af9e69b889claireho } 84627f654740f2a26ad62a5c155af9199af9e69b889claireho 84727f654740f2a26ad62a5c155af9199af9e69b889claireho if (o->options == NULL) { 84827f654740f2a26ad62a5c155af9199af9e69b889claireho return result; 84927f654740f2a26ad62a5c155af9199af9e69b889claireho } 85027f654740f2a26ad62a5c155af9199af9e69b889claireho 85127f654740f2a26ad62a5c155af9199af9e69b889claireho#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) 85227f654740f2a26ad62a5c155af9199af9e69b889claireho /* Read in options file. */ 85327f654740f2a26ad62a5c155af9199af9e69b889claireho if(o->verbose) { 85427f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stdout, "# Reading options file %s\n", o->options); 85527f654740f2a26ad62a5c155af9199af9e69b889claireho } 85627f654740f2a26ad62a5c155af9199af9e69b889claireho status = U_ZERO_ERROR; 857103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius tmpResult = parseFlagsFile(o->options, pkgDataFlags, currentBufferSize, FLAG_NAMES, (int32_t)PKGDATA_FLAGS_SIZE, &status); 85827f654740f2a26ad62a5c155af9199af9e69b889claireho if (status == U_BUFFER_OVERFLOW_ERROR) { 85927f654740f2a26ad62a5c155af9199af9e69b889claireho for (int32_t i = 0; i < PKGDATA_FLAGS_SIZE; i++) { 860c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (pkgDataFlags[i]) { 861c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert uprv_free(pkgDataFlags[i]); 862c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert pkgDataFlags[i] = NULL; 863c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 86427f654740f2a26ad62a5c155af9199af9e69b889claireho } 86527f654740f2a26ad62a5c155af9199af9e69b889claireho currentBufferSize = tmpResult; 86627f654740f2a26ad62a5c155af9199af9e69b889claireho } else if (U_FAILURE(status)) { 86727f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stderr,"Unable to open or read \"%s\" option file. status = %s\n", o->options, u_errorName(status)); 86827f654740f2a26ad62a5c155af9199af9e69b889claireho return -1; 86927f654740f2a26ad62a5c155af9199af9e69b889claireho } 87027f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 87127f654740f2a26ad62a5c155af9199af9e69b889claireho if(o->verbose) { 872103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, "# pkgDataFlags=\n"); 873103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius for(int32_t i=0;i<PKGDATA_FLAGS_SIZE;i++) { 874103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, " [%d] %s: %s\n", i, FLAG_NAMES[i], pkgDataFlags[i]); 87527f654740f2a26ad62a5c155af9199af9e69b889claireho } 87627f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stdout, "\n"); 87727f654740f2a26ad62a5c155af9199af9e69b889claireho } 87827f654740f2a26ad62a5c155af9199af9e69b889claireho#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) 87927f654740f2a26ad62a5c155af9199af9e69b889claireho } while (status == U_BUFFER_OVERFLOW_ERROR); 88027f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 88127f654740f2a26ad62a5c155af9199af9e69b889claireho 88227f654740f2a26ad62a5c155af9199af9e69b889claireho return result; 88327f654740f2a26ad62a5c155af9199af9e69b889claireho} 88427f654740f2a26ad62a5c155af9199af9e69b889claireho 88527f654740f2a26ad62a5c155af9199af9e69b889claireho 88685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 88785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Given the base libName and version numbers, generate the libary file names and store it in libFileNames. 88885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Depending on the configuration, the library name may either end with version number or shared object suffix. 88985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 890103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void createFileNames(UPKGOptions *o, const char mode, const char *version_major, const char *version, const char *libName, UBool reverseExt, UBool noVersion) { 891f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius const char* FILE_EXTENSION_SEP = uprv_strlen(pkgDataFlags[SO_EXT]) == 0 ? "" : "."; 892f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius const char* FILE_SUFFIX = pkgDataFlags[LIB_EXT_ORDER][0] == '.' ? "." : ""; 893f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 894103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_MINGW 895103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* MinGW does not need the library prefix when building in dll mode. */ 896103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (IN_DLL_MODE(mode)) { 897103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(libFileNames[LIB_FILE], "%s", libName); 898103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 899103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(libFileNames[LIB_FILE], "%s%s", 900103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[LIBPREFIX], 901103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libName); 902103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 903103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 90485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(libFileNames[LIB_FILE], "%s%s", 90585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LIBPREFIX], 90685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libName); 907103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 90850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 90950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 91050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# libFileName[LIB_FILE] = %s\n", libFileNames[LIB_FILE]); 91150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 91250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 913103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_MINGW 9141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // Name the import library lib*.dll.a 9151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert sprintf(libFileNames[LIB_FILE_MINGW], "lib%s.dll.a", libName); 916103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_CYGWIN 917f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_CYGWIN], "cyg%s%s%s", 918103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libName, 919f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 920103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[SO_EXT]); 921f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_CYGWIN_VERSION], "cyg%s%s%s%s", 922103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libName, 923103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius version_major, 924f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 925103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[SO_EXT]); 926103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 927103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uprv_strcat(pkgDataFlags[SO_EXT], "."); 928103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uprv_strcat(pkgDataFlags[SO_EXT], pkgDataFlags[A_EXT]); 929103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS400 || defined(_AIX) 930f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_VERSION_TMP], "%s%s%s", 931103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE], 932f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 933103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[SOBJ_EXT]); 934fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#elif U_PLATFORM == U_PF_OS390 935f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_VERSION_TMP], "%s%s%s%s%s", 936fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE], 937fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius pkgDataFlags[LIB_EXT_ORDER][0] == '.' ? "." : "", 938fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius reverseExt ? version : pkgDataFlags[SOBJ_EXT], 939f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 940fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius reverseExt ? pkgDataFlags[SOBJ_EXT] : version); 941fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 942fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(libFileNames[LIB_FILE_OS390BATCH_VERSION], "%s%s.x", 943fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE], 944fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius version); 945fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(libFileNames[LIB_FILE_OS390BATCH_MAJOR], "%s%s.x", 946fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE], 947fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius version_major); 948103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 949103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (noVersion && !reverseExt) { 950103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(libFileNames[LIB_FILE_VERSION_TMP], "%s%s%s", 95185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE], 952f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_SUFFIX, 95385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[SOBJ_EXT]); 954103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 955f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_VERSION_TMP], "%s%s%s%s%s", 95685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE], 957f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_SUFFIX, 95885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt ? version : pkgDataFlags[SOBJ_EXT], 959f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 96085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt ? pkgDataFlags[SOBJ_EXT] : version); 961103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 96285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 963103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (noVersion && !reverseExt) { 964103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(libFileNames[LIB_FILE_VERSION_MAJOR], "%s%s%s", 965103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE], 966f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_SUFFIX, 967103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[SO_EXT]); 968103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 969103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(libFileNames[LIB_FILE_VERSION], "%s%s%s", 970103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE], 971f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_SUFFIX, 972103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[SO_EXT]); 973103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 974f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_VERSION_MAJOR], "%s%s%s%s%s", 97585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE], 976f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_SUFFIX, 97785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt ? version_major : pkgDataFlags[SO_EXT], 978f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 97985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt ? pkgDataFlags[SO_EXT] : version_major); 98085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 981f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(libFileNames[LIB_FILE_VERSION], "%s%s%s%s%s", 98250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE], 983f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_SUFFIX, 98450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho reverseExt ? version : pkgDataFlags[SO_EXT], 985f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE_EXTENSION_SEP, 98650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho reverseExt ? pkgDataFlags[SO_EXT] : version); 987103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 98850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 989103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(o->verbose) { 990103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stdout, "# libFileName[LIB_FILE_VERSION] = %s\n", libFileNames[LIB_FILE_VERSION]); 991103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 99285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 993103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PF_MINGW <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 994103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Cygwin and MinGW only deals with the version major number. */ 995103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uprv_strcpy(libFileNames[LIB_FILE_VERSION_TMP], libFileNames[LIB_FILE_VERSION_MAJOR]); 99685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 997103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 998103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(IN_STATIC_MODE(mode)) { 99950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(libFileNames[LIB_FILE_VERSION], "%s.%s", libFileNames[LIB_FILE], pkgDataFlags[A_EXT]); 100050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE_VERSION_MAJOR][0]=0; 100150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 100250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# libFileName[LIB_FILE_VERSION] = %s (static)\n", libFileNames[LIB_FILE_VERSION]); 100350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 100450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 100585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 100685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 100785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* Create the symbolic links for the final library file. */ 100850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int32_t pkg_createSymLinks(const char *targetDir, UBool specialHandling) { 100985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 101085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char cmd[LARGE_BUFFER_MAX_SIZE]; 101127f654740f2a26ad62a5c155af9199af9e69b889claireho char name1[SMALL_BUFFER_MAX_SIZE]; /* symlink file name */ 101227f654740f2a26ad62a5c155af9199af9e69b889claireho char name2[SMALL_BUFFER_MAX_SIZE]; /* file name to symlink */ 1013f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius const char* FILE_EXTENSION_SEP = uprv_strlen(pkgDataFlags[SO_EXT]) == 0 ? "" : "."; 101485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1015103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !defined(USING_CYGWIN) && U_PLATFORM != U_PF_MINGW 101685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* No symbolic link to make. */ 101727f654740f2a26ad62a5c155af9199af9e69b889claireho if (uprv_strlen(libFileNames[LIB_FILE_VERSION]) == 0 || uprv_strlen(libFileNames[LIB_FILE_VERSION_MAJOR]) == 0 || 101827f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcmp(libFileNames[LIB_FILE_VERSION], libFileNames[LIB_FILE_VERSION_MAJOR]) == 0) { 101985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 102085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 102185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 102285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "cd %s && %s %s && %s %s %s", 102385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 102485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho RM_CMD, 102585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION_MAJOR], 102685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LN_CMD, 102785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION], 102885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION_MAJOR]); 102950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 103085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 1031103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating symbolic links. Failed command: %s\n", cmd); 103285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 103385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 103485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 103550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 103650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (specialHandling) { 1037103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_CYGWIN 103850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(name1, "%s", libFileNames[LIB_FILE_CYGWIN]); 103950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(name2, "%s", libFileNames[LIB_FILE_CYGWIN_VERSION]); 1040fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#elif U_PLATFORM == U_PF_OS390 1041fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius /* Create the symbolic links for the import data */ 1042fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius /* Use the cmd buffer to store path to import data file to check its existence */ 1043fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(cmd, "%s/%s", targetDir, libFileNames[LIB_FILE_OS390BATCH_VERSION]); 1044fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (T_FileStream_file_exists(cmd)) { 1045fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(cmd, "cd %s && %s %s && %s %s %s", 1046fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius targetDir, 1047fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius RM_CMD, 1048fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE_OS390BATCH_MAJOR], 1049fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius LN_CMD, 1050fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE_OS390BATCH_VERSION], 1051fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE_OS390BATCH_MAJOR]); 1052fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = runCommand(cmd); 1053fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (result != 0) { 1054fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fprintf(stderr, "Error creating symbolic links. Failed command: %s\n", cmd); 1055fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return result; 1056fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1057fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1058fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(cmd, "cd %s && %s %s.x && %s %s %s.x", 1059fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius targetDir, 1060fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius RM_CMD, 1061fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE], 1062fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius LN_CMD, 1063fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE_OS390BATCH_VERSION], 1064fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE]); 1065fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = runCommand(cmd); 1066fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (result != 0) { 1067fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fprintf(stderr, "Error creating symbolic links. Failed command: %s\n", cmd); 1068fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return result; 1069fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1070fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1071fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1072fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius /* Needs to be set here because special handling skips it */ 1073f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(name1, "%s%s%s", libFileNames[LIB_FILE], FILE_EXTENSION_SEP, pkgDataFlags[SO_EXT]); 1074fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(name2, "%s", libFileNames[LIB_FILE_VERSION]); 107550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else 107650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho goto normal_symlink_mode; 107750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 107850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 1079103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM != U_PF_CYGWIN 108050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehonormal_symlink_mode: 1081103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1082f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius sprintf(name1, "%s%s%s", libFileNames[LIB_FILE], FILE_EXTENSION_SEP, pkgDataFlags[SO_EXT]); 108350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(name2, "%s", libFileNames[LIB_FILE_VERSION]); 108450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 108550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 108650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "cd %s && %s %s && %s %s %s", 108785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 108885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho RM_CMD, 108950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho name1, 109085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LN_CMD, 109150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho name2, 109250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho name1); 109385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 109450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 109585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 109685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 109785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 109885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1099103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic int32_t pkg_installLibrary(const char *installDir, const char *targetDir, UBool noVersion) { 110085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 110185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char cmd[SMALL_BUFFER_MAX_SIZE]; 110285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 110385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "cd %s && %s %s %s%s%s", 110485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 110585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[INSTALL_CMD], 110685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION], 110785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho installDir, PKGDATA_FILE_SEP_STRING, libFileNames[LIB_FILE_VERSION] 110885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ); 110985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 111050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 111150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 111250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (result != 0) { 1113103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error installing library. Failed command: %s\n", cmd); 111450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return result; 111550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 111650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 111750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#ifdef CYGWINMSVC 111850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "cd %s && %s %s.lib %s", 111950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho targetDir, 112050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pkgDataFlags[INSTALL_CMD], 112150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE], 112250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho installDir 112350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ); 112450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 112585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 112685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 1127103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error installing library. Failed command: %s\n", cmd); 112885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 112985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1130103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_CYGWIN 113150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "cd %s && %s %s %s", 113250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho targetDir, 113350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pkgDataFlags[INSTALL_CMD], 113450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE_CYGWIN_VERSION], 113550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho installDir 113650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ); 113750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 113885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1139b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (result != 0) { 1140103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error installing library. Failed command: %s\n", cmd); 1141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return result; 1142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1143fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1144fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#elif U_PLATFORM == U_PF_OS390 1145fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (T_FileStream_file_exists(libFileNames[LIB_FILE_OS390BATCH_VERSION])) { 1146fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(cmd, "%s %s %s", 1147fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius pkgDataFlags[INSTALL_CMD], 1148fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius libFileNames[LIB_FILE_OS390BATCH_VERSION], 1149fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius installDir 1150fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ); 1151fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = runCommand(cmd); 1152fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1153fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (result != 0) { 1154fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fprintf(stderr, "Error installing library. Failed command: %s\n", cmd); 1155fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return result; 1156fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1157fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 115850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 1159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1160103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (noVersion) { 1161103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 1162103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 1163103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return pkg_createSymLinks(installDir, TRUE); 1164103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 116585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 116685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 116727f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int32_t pkg_installCommonMode(const char *installDir, const char *fileName) { 116827f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t result = 0; 116927f654740f2a26ad62a5c155af9199af9e69b889claireho char cmd[SMALL_BUFFER_MAX_SIZE] = ""; 117027f654740f2a26ad62a5c155af9199af9e69b889claireho 117127f654740f2a26ad62a5c155af9199af9e69b889claireho if (!T_FileStream_file_exists(installDir)) { 117227f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 117327f654740f2a26ad62a5c155af9199af9e69b889claireho 117427f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_mkdir(installDir, &status); 117527f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(status)) { 117627f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stderr, "Error creating installation directory: %s\n", installDir); 117727f654740f2a26ad62a5c155af9199af9e69b889claireho return -1; 117827f654740f2a26ad62a5c155af9199af9e69b889claireho } 117927f654740f2a26ad62a5c155af9199af9e69b889claireho } 118027f654740f2a26ad62a5c155af9199af9e69b889claireho#ifndef U_WINDOWS_WITH_MSVC 118127f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(cmd, "%s %s %s", pkgDataFlags[INSTALL_CMD], fileName, installDir); 118227f654740f2a26ad62a5c155af9199af9e69b889claireho#else 118327f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(cmd, "%s %s %s %s", WIN_INSTALL_CMD, fileName, installDir, WIN_INSTALL_CMD_FLAGS); 118427f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 118527f654740f2a26ad62a5c155af9199af9e69b889claireho 118627f654740f2a26ad62a5c155af9199af9e69b889claireho result = runCommand(cmd); 118727f654740f2a26ad62a5c155af9199af9e69b889claireho if (result != 0) { 118827f654740f2a26ad62a5c155af9199af9e69b889claireho fprintf(stderr, "Failed to install data file with command: %s\n", cmd); 118927f654740f2a26ad62a5c155af9199af9e69b889claireho } 119027f654740f2a26ad62a5c155af9199af9e69b889claireho 119127f654740f2a26ad62a5c155af9199af9e69b889claireho return result; 119227f654740f2a26ad62a5c155af9199af9e69b889claireho} 119327f654740f2a26ad62a5c155af9199af9e69b889claireho 119485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef U_WINDOWS_MSVC 119585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* Copy commands for installing the raw data files on Windows. */ 119685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define WIN_INSTALL_CMD "xcopy" 119785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define WIN_INSTALL_CMD_FLAGS "/E /Y /K" 119885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 119985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_installFileMode(const char *installDir, const char *srcDir, const char *fileListName) { 120085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 120185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char cmd[SMALL_BUFFER_MAX_SIZE] = ""; 120285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 120385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (!T_FileStream_file_exists(installDir)) { 120485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 120585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 120685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_mkdir(installDir, &status); 120785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 120885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Error creating installation directory: %s\n", installDir); 120985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 121085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 121185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 121285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifndef U_WINDOWS_WITH_MSVC 121385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char buffer[SMALL_BUFFER_MAX_SIZE] = ""; 121454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t bufferLength = 0; 121585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 121685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho FileStream *f = T_FileStream_open(fileListName, "r"); 121785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (f != NULL) { 121885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(;;) { 121985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (T_FileStream_readLine(f, buffer, SMALL_BUFFER_MAX_SIZE) != NULL) { 122054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius bufferLength = uprv_strlen(buffer); 122185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Remove new line character. */ 122254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (bufferLength > 0) { 122354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius buffer[bufferLength-1] = 0; 122454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 122585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 122685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s%s%s %s%s%s", 122785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[INSTALL_CMD], 122885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho srcDir, PKGDATA_FILE_SEP_STRING, buffer, 122985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho installDir, PKGDATA_FILE_SEP_STRING, buffer); 123085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 123150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 123285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 123385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Failed to install data file with command: %s\n", cmd); 123485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 123585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 123685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 123785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (!T_FileStream_eof(f)) { 123885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Failed to read line from file: %s\n", fileListName); 123985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = -1; 124085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 124185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 124285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 124385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 124485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho T_FileStream_close(f); 124585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 124685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = -1; 124785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Unable to open list file: %s\n", fileListName); 124885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 124985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else 125085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s %s %s", WIN_INSTALL_CMD, srcDir, installDir, WIN_INSTALL_CMD_FLAGS); 125150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 125285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 125385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Failed to install data file with command: %s\n", cmd); 125485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 125585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 125685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 125785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 125885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 125985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 126085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* Archiving of the library file may be needed depending on the platform and options given. 126185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * If archiving is not needed, copy over the library file name. 126285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 126385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_archiveLibrary(const char *targetDir, const char *version, UBool reverseExt) { 126485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 126585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char cmd[LARGE_BUFFER_MAX_SIZE]; 126685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 126750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* If the shared object suffix and the final object suffix is different and the final object suffix and the 126885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * archive file suffix is the same, then the final library needs to be archived. 126985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 127085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (uprv_strcmp(pkgDataFlags[SOBJ_EXT], pkgDataFlags[SO_EXT]) != 0 && uprv_strcmp(pkgDataFlags[A_EXT], pkgDataFlags[SO_EXT]) == 0) { 127185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(libFileNames[LIB_FILE_VERSION], "%s%s%s.%s", 127285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE], 127385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LIB_EXT_ORDER][0] == '.' ? "." : "", 127485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt ? version : pkgDataFlags[SO_EXT], 127585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho reverseExt ? pkgDataFlags[SO_EXT] : version); 127685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 127785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s %s%s %s%s", 127885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[AR], 127985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[ARFLAGS], 128085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 128185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION], 128285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 128385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION_TMP]); 128485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 128550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 128650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (result != 0) { 1287103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating archive library. Failed command: %s\n", cmd); 128850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return result; 128950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 129050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 129150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "%s %s%s", 129250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pkgDataFlags[RANLIB], 129350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho targetDir, 129450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE_VERSION]); 129550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 129650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 129785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 1298103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating archive library. Failed command: %s\n", cmd); 129985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 130085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 130185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 130285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Remove unneeded library file. */ 130385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s%s", 130485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho RM_CMD, 130585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 130685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION_TMP]); 130785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 130850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 130985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 1310103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating archive library. Failed command: %s\n", cmd); 131185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 131285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 131385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 131485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 131585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(libFileNames[LIB_FILE_VERSION], libFileNames[LIB_FILE_VERSION_TMP]); 131685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 131785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 131885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 131985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 132085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 132185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 132285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Using the compiler information from the configuration file set by -O option, generate the library file. 132385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * command may be given to allow for a larger buffer for cmd. 132485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 1325fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, const char *objectFile, char *command, UBool specialHandling) { 132685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 132785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *cmd = NULL; 132885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool freeCmd = FALSE; 1329b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t length = 0; 133085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1331f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius (void)specialHandling; // Suppress unused variable compiler warnings on platforms where all usage 1332f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // of this parameter is #ifdefed out. 1333f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 133485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* This is necessary because if packaging is done without assembly code, objectFile might be extremely large 133585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * containing many object files and so the calling function should supply a command buffer that is large 133685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * enough to handle this. Otherwise, use the default size. 133785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 133885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (command != NULL) { 133985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho cmd = command; 134085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 134185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1342103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (IN_STATIC_MODE(mode)) { 1343b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (cmd == NULL) { 1344b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho length = uprv_strlen(pkgDataFlags[AR]) + uprv_strlen(pkgDataFlags[ARFLAGS]) + uprv_strlen(targetDir) + 1345b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_strlen(libFileNames[LIB_FILE_VERSION]) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[RANLIB]) + BUFFER_PADDING_SIZE; 1346b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == NULL) { 1347b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fprintf(stderr, "Unable to allocate memory for command.\n"); 1348b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return -1; 1349b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1350b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho freeCmd = TRUE; 1351b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 135250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "%s %s %s%s %s", 135385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[AR], 135485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[ARFLAGS], 135585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 135650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE_VERSION], 135785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho objectFile); 135885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 135950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 136050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (result == 0) { 136150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(cmd, "%s %s%s", 136250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pkgDataFlags[RANLIB], 136350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho targetDir, 136450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho libFileNames[LIB_FILE_VERSION]); 136550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 136650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 136750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1368103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else /* if (IN_DLL_MODE(mode)) */ { 1369b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (cmd == NULL) { 1370b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho length = uprv_strlen(pkgDataFlags[GENLIB]) + uprv_strlen(pkgDataFlags[LDICUDTFLAGS]) + 1371103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ((uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_VERSION_TMP])) * 2) + 1372b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[LD_SONAME]) + 1373b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_strlen(pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR]) + 1374b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_strlen(pkgDataFlags[RPATH_FLAGS]) + uprv_strlen(pkgDataFlags[BIR_FLAGS]) + BUFFER_PADDING_SIZE; 1375103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_CYGWIN 1376b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho length += uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_CYGWIN_VERSION]); 1377103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_MINGW 1378103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length += uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_MINGW]); 1379b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif 1380b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == NULL) { 1381b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fprintf(stderr, "Unable to allocate memory for command.\n"); 1382b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return -1; 1383b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1384b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho freeCmd = TRUE; 1385b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1386103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_MINGW 1387103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(cmd, "%s%s%s %s -o %s%s %s %s%s %s %s", 1388103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[GENLIB], 1389103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetDir, 1390103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE_MINGW], 1391103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[LDICUDTFLAGS], 1392103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetDir, 1393103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE_VERSION_TMP], 1394103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_CYGWIN 139585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s%s%s %s -o %s%s %s %s%s %s %s", 139685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[GENLIB], 139785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 139885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION_TMP], 139985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LDICUDTFLAGS], 1400103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetDir, 1401103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE_CYGWIN_VERSION], 1402103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_AIX 1403103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(cmd, "%s %s%s;%s %s -o %s%s %s %s%s %s %s", 1404103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius RM_CMD, 1405103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetDir, 1406103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE_VERSION_TMP], 1407103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[GENLIB], 1408103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[LDICUDTFLAGS], 1409103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius targetDir, 1410103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius libFileNames[LIB_FILE_VERSION_TMP], 141185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else 141285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s -o %s%s %s %s%s %s %s", 141385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[GENLIB], 141485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LDICUDTFLAGS], 141585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetDir, 141685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE_VERSION_TMP], 141785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 141885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho objectFile, 141985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LD_SONAME], 142085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR], 142185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[RPATH_FLAGS], 142285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[BIR_FLAGS]); 142385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 142485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Generate the library file. */ 142550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 142659d709d503bab6e2b61931737e662dd293b40578ccornelius 1427fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if U_PLATFORM == U_PF_OS390 1428fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius char *env_tmp; 142959d709d503bab6e2b61931737e662dd293b40578ccornelius char PDS_LibName[512]; 1430fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius char PDS_Name[512]; 1431fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1432fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius PDS_Name[0] = 0; 1433fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius PDS_LibName[0] = 0; 1434fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (specialHandling && uprv_strcmp(libFileNames[LIB_FILE],"libicudata") == 0) { 1435fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (env_tmp = getenv("ICU_PDS_NAME")) { 1436fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_Name, "%s%s", 1437fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius env_tmp, 1438fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "DA"); 1439fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius strcat(PDS_Name, getenv("ICU_PDS_NAME_SUFFIX")); 1440fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else if (env_tmp = getenv("PDS_NAME_PREFIX")) { 1441fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_Name, "%s%s", 1442fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius env_tmp, 1443fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius U_ICU_VERSION_SHORT "DA"); 1444fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else { 1445fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_Name, "%s%s", 1446fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "IXMI", 1447fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius U_ICU_VERSION_SHORT "DA"); 1448fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1449fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else if (!specialHandling && uprv_strcmp(libFileNames[LIB_FILE],"libicudata_stub") == 0) { 1450fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (env_tmp = getenv("ICU_PDS_NAME")) { 1451fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_Name, "%s%s", 1452fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius env_tmp, 1453fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "D1"); 1454fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius strcat(PDS_Name, getenv("ICU_PDS_NAME_SUFFIX")); 1455fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else if (env_tmp = getenv("PDS_NAME_PREFIX")) { 1456fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_Name, "%s%s", 1457fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius env_tmp, 1458fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius U_ICU_VERSION_SHORT "D1"); 1459fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else { 1460fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_Name, "%s%s", 1461fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "IXMI", 1462fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius U_ICU_VERSION_SHORT "D1"); 1463fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1464fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1465fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1466fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (PDS_Name[0]) { 1467fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(PDS_LibName,"%s%s%s%s%s", 146859d709d503bab6e2b61931737e662dd293b40578ccornelius "\"//'", 146959d709d503bab6e2b61931737e662dd293b40578ccornelius getenv("LOADMOD"), 1470fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius "(", 1471fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius PDS_Name, 1472fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ")'\""); 1473fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius sprintf(cmd, "%s %s -o %s %s %s%s %s %s", 147459d709d503bab6e2b61931737e662dd293b40578ccornelius pkgDataFlags[GENLIB], 147559d709d503bab6e2b61931737e662dd293b40578ccornelius pkgDataFlags[LDICUDTFLAGS], 147659d709d503bab6e2b61931737e662dd293b40578ccornelius PDS_LibName, 147759d709d503bab6e2b61931737e662dd293b40578ccornelius objectFile, 147859d709d503bab6e2b61931737e662dd293b40578ccornelius pkgDataFlags[LD_SONAME], 147959d709d503bab6e2b61931737e662dd293b40578ccornelius pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR], 148059d709d503bab6e2b61931737e662dd293b40578ccornelius pkgDataFlags[RPATH_FLAGS], 148159d709d503bab6e2b61931737e662dd293b40578ccornelius pkgDataFlags[BIR_FLAGS]); 1482fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1483fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = runCommand(cmd); 148459d709d503bab6e2b61931737e662dd293b40578ccornelius } 148559d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 148685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 148785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1488103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (result != 0) { 1489103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error generating library file. Failed command: %s\n", cmd); 1490103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1491103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 149285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (freeCmd) { 149385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(cmd); 149485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 149585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 149685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 149785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 149885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 149985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_createWithAssemblyCode(const char *targetDir, const char mode, const char *gencFilePath) { 150085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char tempObjectFile[SMALL_BUFFER_MAX_SIZE] = ""; 150127f654740f2a26ad62a5c155af9199af9e69b889claireho char *cmd; 150285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 150385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 150427f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t length = 0; 150527f654740f2a26ad62a5c155af9199af9e69b889claireho 150685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Remove the ending .s and replace it with .o for the new object file. */ 150785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(tempObjectFile, gencFilePath); 150885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile[uprv_strlen(tempObjectFile)-1] = 'o'; 150985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 151027f654740f2a26ad62a5c155af9199af9e69b889claireho length = uprv_strlen(pkgDataFlags[COMPILER]) + uprv_strlen(pkgDataFlags[LIBFLAGS]) 1511b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho + uprv_strlen(tempObjectFile) + uprv_strlen(gencFilePath) + BUFFER_PADDING_SIZE; 151227f654740f2a26ad62a5c155af9199af9e69b889claireho 151327f654740f2a26ad62a5c155af9199af9e69b889claireho cmd = (char *)uprv_malloc(sizeof(char) * length); 151427f654740f2a26ad62a5c155af9199af9e69b889claireho if (cmd == NULL) { 151527f654740f2a26ad62a5c155af9199af9e69b889claireho return -1; 151627f654740f2a26ad62a5c155af9199af9e69b889claireho } 151727f654740f2a26ad62a5c155af9199af9e69b889claireho 151885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Generate the object file. */ 151985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s -o %s %s", 152085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[COMPILER], 152185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LIBFLAGS], 152285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile, 152385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gencFilePath); 152485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 152550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 152627f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_free(cmd); 152785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 1528103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating with assembly code. Failed command: %s\n", cmd); 152985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 153085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 153185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 153285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return pkg_generateLibraryFile(targetDir, mode, tempObjectFile); 153385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 153485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 153585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef BUILD_DATA_WITHOUT_ASSEMBLY 153685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 153785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Generation of the data library without assembly code needs to compile each data file 153885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * individually and then link it all together. 153950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Note: Any update to the directory structure of the data needs to be reflected here. 154085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 154185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoenum { 154285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX_BRKITR, 154385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX_COLL, 154450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DATA_PREFIX_CURR, 154550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DATA_PREFIX_LANG, 154685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX_RBNF, 154750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DATA_PREFIX_REGION, 154885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX_TRANSLIT, 154950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DATA_PREFIX_ZONE, 1550f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius DATA_PREFIX_UNIT, 155185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX_LENGTH 155285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 155350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 155485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoconst static char DATA_PREFIX[DATA_PREFIX_LENGTH][10] = { 155585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "brkitr", 155685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "coll", 155750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "curr", 155850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "lang", 155985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "rbnf", 156050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "region", 156150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "translit", 1562f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "zone", 1563f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "unit" 156485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 156550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 156685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_createWithoutAssemblyCode(UPKGOptions *o, const char *targetDir, const char mode) { 156785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 156885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho CharList *list = o->filePaths; 156985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho CharList *listNames = o->files; 157085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t listSize = pkg_countCharList(list); 157185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *buffer; 157285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *cmd; 157385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char gencmnFile[SMALL_BUFFER_MAX_SIZE] = ""; 157485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char tempObjectFile[SMALL_BUFFER_MAX_SIZE] = ""; 157585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef USE_SINGLE_CCODE_FILE 157685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char icudtAll[SMALL_BUFFER_MAX_SIZE] = ""; 1577103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius FileStream *icudtAllFile = NULL; 157885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 157985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(icudtAll, "%s%s%sall.c", 158085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o->tmpDir, 158185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho PKGDATA_FILE_SEP_STRING, 158285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFileNames[LIB_FILE]); 158350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Remove previous icudtall.c file. */ 158450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (T_FileStream_file_exists(icudtAll) && (result = remove(icudtAll)) != 0) { 158550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "Unable to remove old icudtall file: %s\n", icudtAll); 158650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return result; 158750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1588103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1589103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if((icudtAllFile = T_FileStream_open(icudtAll, "w"))==NULL) { 1590103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Unable to write to icudtall file: %s\n", icudtAll); 1591103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 1592103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 159385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 159485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 159585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (list == NULL || listNames == NULL) { 159685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* list and listNames should never be NULL since we are looping through the CharList with 159785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * the given size. 159885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 159985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 160085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 160185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 160285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ((cmd = (char *)uprv_malloc((listSize + 2) * SMALL_BUFFER_MAX_SIZE)) == NULL) { 160385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Unable to allocate memory for cmd.\n"); 160485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 160585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else if ((buffer = (char *)uprv_malloc((listSize + 1) * SMALL_BUFFER_MAX_SIZE)) == NULL) { 160685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Unable to allocate memory for buffer.\n"); 160785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(cmd); 160885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 160985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 161085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 161185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t i = 0; i < (listSize + 1); i++) { 161285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *file ; 161385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *name; 161485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 161585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (i == 0) { 161685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* The first iteration calls the gencmn function and initailizes the buffer. */ 161785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho createCommonDataFile(o->tmpDir, o->shortName, o->entryName, NULL, o->srcDir, o->comment, o->fileListFiles->str, 0, TRUE, o->verbose, gencmnFile); 161885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho buffer[0] = 0; 161985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef USE_SINGLE_CCODE_FILE 162085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(tempObjectFile, gencmnFile); 162185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile[uprv_strlen(tempObjectFile) - 1] = 'o'; 162285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1623b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sprintf(cmd, "%s %s -o %s %s", 162485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[COMPILER], 162585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LIBFLAGS], 162685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile, 162785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gencmnFile); 162885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 162950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 163085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 163185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 163285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 163385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 163485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(buffer, "%s",tempObjectFile); 163585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 163685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 163785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char newName[SMALL_BUFFER_MAX_SIZE]; 163885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char dataName[SMALL_BUFFER_MAX_SIZE]; 163950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char dataDirName[SMALL_BUFFER_MAX_SIZE]; 164085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *pSubstring; 164185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho file = list->str; 164285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho name = listNames->str; 164385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 164485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho newName[0] = dataName[0] = 0; 164585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t n = 0; n < DATA_PREFIX_LENGTH; n++) { 164650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dataDirName[0] = 0; 164750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(dataDirName, "%s%s", DATA_PREFIX[n], PKGDATA_FILE_SEP_STRING); 164850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* If the name contains a prefix (indicating directory), alter the new name accordingly. */ 164950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pSubstring = uprv_strstr(name, dataDirName); 165085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (pSubstring != NULL) { 165185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char newNameTmp[SMALL_BUFFER_MAX_SIZE] = ""; 165250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *p = name + uprv_strlen(dataDirName); 165385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t i = 0;;i++) { 165485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (p[i] == '.') { 165585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho newNameTmp[i] = '_'; 165685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho continue; 165785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 165885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho newNameTmp[i] = p[i]; 165985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (p[i] == 0) { 166085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 166185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 166285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 166385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(newName, "%s_%s", 166485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX[n], 166585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho newNameTmp); 166685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(dataName, "%s_%s", 166785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o->shortName, 166885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATA_PREFIX[n]); 166985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 167085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (newName[0] != 0) { 167185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 167285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 167385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 167485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1675103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(o->verbose) { 1676103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("# Generating %s \n", gencmnFile); 1677103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1678103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 167985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho writeCCode(file, o->tmpDir, dataName[0] != 0 ? dataName : o->shortName, newName[0] != 0 ? newName : NULL, gencmnFile); 1680103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 168185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef USE_SINGLE_CCODE_FILE 1682103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(cmd, "#include \"%s\"\n", gencmnFile); 1683103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius T_FileStream_writeLine(icudtAllFile, cmd); 1684103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* don't delete the file */ 168585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 168685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 168785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 168885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifndef USE_SINGLE_CCODE_FILE 168985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(tempObjectFile, gencmnFile); 169085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile[uprv_strlen(tempObjectFile) - 1] = 'o'; 169185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 169285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s %s -o %s %s", 169385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[COMPILER], 169485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LIBFLAGS], 169585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile, 169685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gencmnFile); 169750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 169885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result != 0) { 1699103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating library without assembly code. Failed command: %s\n", cmd); 170085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 170185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 170285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 170350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(buffer, " "); 170450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(buffer, tempObjectFile); 170550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 170685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 170785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 170885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (i > 0) { 170985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho list = list->next; 171085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho listNames = listNames->next; 171185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 171285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 171385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 171485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef USE_SINGLE_CCODE_FILE 1715103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius T_FileStream_close(icudtAllFile); 171685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(tempObjectFile, icudtAll); 171785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile[uprv_strlen(tempObjectFile) - 1] = 'o'; 171850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1719103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(cmd, "%s %s -I. -o %s %s", 172085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[COMPILER], 172185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho pkgDataFlags[LIBFLAGS], 172285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tempObjectFile, 172385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho icudtAll); 172485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 172550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = runCommand(cmd); 172685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result == 0) { 172750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(buffer, " "); 172850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(buffer, tempObjectFile); 1729103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 1730103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating library without assembly code. Failed command: %s\n", cmd); 173185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 173285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 173385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 173485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (result == 0) { 173585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Generate the library file. */ 1736103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_OS390 1737fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = pkg_generateLibraryFile(targetDir, mode, buffer, cmd, (o->pdsbuild && IN_DLL_MODE(mode))); 1738103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 1739103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = pkg_generateLibraryFile(targetDir,mode, buffer, cmd); 1740103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 174185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 174250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 174385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(buffer); 174485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(cmd); 174585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 174685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 174785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 174885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 174985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 175085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef WINDOWS_WITH_MSVC 175185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LINK_CMD "link.exe /nologo /release /out:" 175285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LINK_FLAGS "/DLL /NOENTRY /MANIFEST:NO /base:0x4ad00000 /implib:" 175385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LIB_CMD "LIB.exe /nologo /out:" 175485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LIB_FILE "icudt.lib" 175585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LIB_EXT UDATA_LIB_SUFFIX 175685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define DLL_EXT UDATA_SO_SUFFIX 175785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 175885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t pkg_createWindowsDLL(const char mode, const char *gencFilePath, UPKGOptions *o) { 1759103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t result = 0; 176085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char cmd[LARGE_BUFFER_MAX_SIZE]; 1761103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (IN_STATIC_MODE(mode)) { 176285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char staticLibFilePath[SMALL_BUFFER_MAX_SIZE] = ""; 176385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1764103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef CYGWINMSVC 1765103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(staticLibFilePath, "%s%s%s%s%s", 1766103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o->targetDir, 1767103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius PKGDATA_FILE_SEP_STRING, 1768103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pkgDataFlags[LIBPREFIX], 1769103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o->libName, 1770103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius LIB_EXT); 1771103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 1772103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sprintf(staticLibFilePath, "%s%s%s%s%s", 1773103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o->targetDir, 1774103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius PKGDATA_FILE_SEP_STRING, 1775103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius (strstr(o->libName, "icudt") ? "s" : ""), 1776103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius o->libName, 1777103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius LIB_EXT); 1778103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 177985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 178085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sprintf(cmd, "%s\"%s\" \"%s\"", 178185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LIB_CMD, 178285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho staticLibFilePath, 178385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gencFilePath); 1784103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if (IN_DLL_MODE(mode)) { 178585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char dllFilePath[SMALL_BUFFER_MAX_SIZE] = ""; 178685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char libFilePath[SMALL_BUFFER_MAX_SIZE] = ""; 178785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char resFilePath[SMALL_BUFFER_MAX_SIZE] = ""; 178827f654740f2a26ad62a5c155af9199af9e69b889claireho char tmpResFilePath[SMALL_BUFFER_MAX_SIZE] = ""; 178985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 179085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef CYGWINMSVC 179185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(dllFilePath, o->targetDir); 179285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else 179385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(dllFilePath, o->srcDir); 179485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 179585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(dllFilePath, PKGDATA_FILE_SEP_STRING); 179685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(libFilePath, dllFilePath); 179785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 179850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#ifdef CYGWINMSVC 179950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(libFilePath, o->libName); 180050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(libFilePath, ".lib"); 180150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 180250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(dllFilePath, o->libName); 180350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(dllFilePath, o->version); 180450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else 180527f654740f2a26ad62a5c155af9199af9e69b889claireho if (strstr(o->libName, "icudt")) { 180627f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcat(libFilePath, LIB_FILE); 180727f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 180827f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcat(libFilePath, o->libName); 180927f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcat(libFilePath, ".lib"); 181027f654740f2a26ad62a5c155af9199af9e69b889claireho } 181185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(dllFilePath, o->entryName); 181250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 181350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(dllFilePath, DLL_EXT); 181450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 181527f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcpy(tmpResFilePath, o->tmpDir); 181627f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcat(tmpResFilePath, PKGDATA_FILE_SEP_STRING); 181727f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcat(tmpResFilePath, ICUDATA_RES_FILE); 181885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 181927f654740f2a26ad62a5c155af9199af9e69b889claireho if (T_FileStream_file_exists(tmpResFilePath)) { 182027f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(resFilePath, "\"%s\"", tmpResFilePath); 182185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 182285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 182385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Check if dll file and lib file exists and that it is not newer than genc file. */ 182485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (!o->rebuild && (T_FileStream_file_exists(dllFilePath) && isFileModTimeLater(dllFilePath, gencFilePath)) && 182585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho (T_FileStream_file_exists(libFilePath) && isFileModTimeLater(libFilePath, gencFilePath))) { 182650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(o->verbose) { 182750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho printf("# Not rebuilding %s - up to date.\n", gencFilePath); 182850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 182950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 183085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 183185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 183227f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(cmd, "%s\"%s\" %s\"%s\" \"%s\" %s", 183385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LINK_CMD, 183485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho dllFilePath, 183585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho LINK_FLAGS, 183685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho libFilePath, 183785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gencFilePath, 183885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho resFilePath 183985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ); 184085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 184185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1842103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = runCommand(cmd, TRUE); 1843103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (result != 0) { 1844103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error creating Windows DLL library. Failed command: %s\n", cmd); 1845103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1846103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1847103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; 184885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 184985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 185085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 185150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UPKGOptions *pkg_checkFlag(UPKGOptions *o) { 1852103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_AIX 185385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* AIX needs a map file. */ 185485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *flag = NULL; 185585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t length = 0; 185685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char tmpbuffer[SMALL_BUFFER_MAX_SIZE]; 185785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char MAP_FILE_EXT[] = ".map"; 185885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho FileStream *f = NULL; 185985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char mapFile[SMALL_BUFFER_MAX_SIZE] = ""; 186085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t start = -1; 1861103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uint32_t count = 0; 1862103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char rm_cmd[] = "rm -f all ;"; 1863103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1864103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius flag = pkgDataFlags[GENLIB]; 1865103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1866103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* This portion of the code removes 'rm -f all' in the GENLIB. 1867103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Only occurs in AIX. 1868103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 1869103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (uprv_strstr(flag, rm_cmd) != NULL) { 1870103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius char *tmpGenlibFlagBuffer = NULL; 1871103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t i, offset; 1872103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1873103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius length = uprv_strlen(flag) + 1; 1874103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius tmpGenlibFlagBuffer = (char *)uprv_malloc(length); 1875103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (tmpGenlibFlagBuffer == NULL) { 1876103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Memory allocation error */ 1877103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr,"Unable to allocate buffer of size: %d.\n", length); 1878103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return NULL; 1879103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1880103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1881103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uprv_strcpy(tmpGenlibFlagBuffer, flag); 1882103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1883103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius offset = uprv_strlen(rm_cmd); 1884103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1885103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius for (i = 0; i < (length - offset); i++) { 1886103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius flag[i] = tmpGenlibFlagBuffer[offset + i]; 1887103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1888103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1889103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Zero terminate the string */ 1890103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius flag[i] = 0; 1891103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1892103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uprv_free(tmpGenlibFlagBuffer); 1893103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 189485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 189585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho flag = pkgDataFlags[BIR_FLAGS]; 189685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho length = uprv_strlen(pkgDataFlags[BIR_FLAGS]); 189785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 189885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t i = 0; i < length; i++) { 189985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (flag[i] == MAP_FILE_EXT[count]) { 190085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (count == 0) { 190185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho start = i; 190285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 190385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho count++; 190485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 190585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho count = 0; 190685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 190785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 190885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (count == uprv_strlen(MAP_FILE_EXT)) { 190985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 191085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 191185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 191285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 191385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (start >= 0) { 191485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t index = 0; 191585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t i = 0;;i++) { 191685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (i == start) { 191785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t n = 0;;n++) { 191885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (o->shortName[n] == 0) { 191985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 192085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 192185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tmpbuffer[index++] = o->shortName[n]; 192285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 192385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 192485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 192585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tmpbuffer[index++] = flag[i]; 192685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 192785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (flag[i] == 0) { 192885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 192985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 193085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 193185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 193285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memset(flag, 0, length); 193385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(flag, tmpbuffer); 193485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 193585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(mapFile, o->shortName); 193685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(mapFile, MAP_FILE_EXT); 193785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 193885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho f = T_FileStream_open(mapFile, "w"); 193985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (f == NULL) { 194085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr,"Unable to create map file: %s.\n", mapFile); 1941103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return NULL; 194250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 194350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sprintf(tmpbuffer, "%s%s ", o->entryName, UDATA_CMN_INTERMEDIATE_SUFFIX); 194450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 194550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho T_FileStream_writeLine(f, tmpbuffer); 194650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 194750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho T_FileStream_close(f); 194885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 194985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1950103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_CYGWIN || U_PLATFORM == U_PF_MINGW 195185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Cygwin needs to change flag options. */ 195285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *flag = NULL; 195385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t length = 0; 195485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 195585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho flag = pkgDataFlags[GENLIB]; 195685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho length = uprv_strlen(pkgDataFlags[GENLIB]); 195785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 195885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t position = length - 1; 195985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 196085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(;position >= 0;position--) { 196185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (flag[position] == '=') { 196285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho position++; 196385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 196485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 196585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 196685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 196785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memset(flag + position, 0, length - position); 1968103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS400 1969103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* OS/400 needs to fix the ld options (swap single quote with double quote) */ 197085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *flag = NULL; 197185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t length = 0; 197285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 197385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho flag = pkgDataFlags[GENLIB]; 197485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho length = uprv_strlen(pkgDataFlags[GENLIB]); 197585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 197685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t position = length - 1; 197785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 197885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(int32_t i = 0; i < length; i++) { 197985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (flag[i] == '\'') { 198085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho flag[i] = '\"'; 198185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 198285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 198385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 198450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Don't really need a return value, just need to stop compiler warnings about 198550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // the unused parameter 'o' on platforms where it is not otherwise used. 198650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return o; 198785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 198885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 198985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void loadLists(UPKGOptions *o, UErrorCode *status) 199085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 199185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho CharList *l, *tail = NULL, *tail2 = NULL; 199285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho FileStream *in; 199385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char line[16384]; 199485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *linePtr, *lineNext; 199585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const uint32_t lineMax = 16300; 1996b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho char *tmp; 1997b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t tmpLength = 0; 199885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *s; 199985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t ln=0; /* line number */ 200085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 200185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(l = o->fileListFiles; l; l = l->next) { 200285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(o->verbose) { 200350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# pkgdata: Reading %s..\n", l->str); 200485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 200585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* TODO: stdin */ 200685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho in = T_FileStream_open(l->str, "r"); /* open files list */ 200785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 200885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!in) { 200985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Error opening <%s>.\n", l->str); 201085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *status = U_FILE_ACCESS_ERROR; 201185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 201285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 201385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 201485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while(T_FileStream_readLine(in, line, sizeof(line))!=NULL) { /* for each line */ 201585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ln++; 201685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(uprv_strlen(line)>lineMax) { 201785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "%s:%d - line too long (over %d chars)\n", l->str, (int)ln, (int)lineMax); 201885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho exit(1); 201985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 202085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* remove spaces at the beginning */ 202185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho linePtr = line; 20228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius /* On z/OS, disable call to isspace (#9996). Investigate using uprv_isspace instead (#9999) */ 20238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#if U_PLATFORM != U_PF_OS390 202485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while(isspace(*linePtr)) { 202585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho linePtr++; 202685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 20278393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#endif 202885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho s=linePtr; 202985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* remove trailing newline characters */ 203085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while(*s!=0) { 203185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(*s=='\r' || *s=='\n') { 203285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *s=0; 203385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 203485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 203585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ++s; 203685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 203785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if((*linePtr == 0) || (*linePtr == '#')) { 203885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho continue; /* comment or empty line */ 203985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 204085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 204185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Now, process the line */ 204285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lineNext = NULL; 204385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 204485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while(linePtr && *linePtr) { /* process space-separated items */ 204585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while(*linePtr == ' ') { 204685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho linePtr++; 204785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 204885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Find the next quote */ 204985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(linePtr[0] == '"') 205085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 205185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lineNext = uprv_strchr(linePtr+1, '"'); 205285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(lineNext == NULL) { 205385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "%s:%d - missing trailing double quote (\")\n", 205485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho l->str, (int)ln); 205585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho exit(1); 205685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 205785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lineNext++; 205885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(*lineNext) { 205985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(*lineNext != ' ') { 206085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "%s:%d - malformed quoted line at position %d, expected ' ' got '%c'\n", 206185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho l->str, (int)ln, (int)(lineNext-line), (*lineNext)?*lineNext:'0'); 206285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho exit(1); 206385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 206485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *lineNext = 0; 206585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lineNext++; 206685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 206785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 206885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 206985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lineNext = uprv_strchr(linePtr, ' '); 207085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(lineNext) { 207185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *lineNext = 0; /* terminate at space */ 207285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lineNext++; 207385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 207485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 207585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 207685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* add the file */ 207785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho s = (char*)getLongPathname(linePtr); 207885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 207985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* normal mode.. o->files is just the bare list without package names */ 208085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho o->files = pkg_appendToList(o->files, &tail, uprv_strdup(linePtr)); 2081103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(uprv_pathIsAbsolute(s) || s[0] == '.') { 208285bf2e2fbc60a9f938064abc8127d61da7d19882Claire 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); 208385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho exit(U_ILLEGAL_ARGUMENT_ERROR); 208485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 2085b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tmpLength = uprv_strlen(o->srcDir) + 2086b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_strlen(s) + 5; /* 5 is to add a little extra space for, among other things, PKGDATA_FILE_SEP_STRING */ 2087b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if((tmp = (char *)uprv_malloc(tmpLength)) == NULL) { 2088b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fprintf(stderr, "pkgdata: Error: Unable to allocate tmp buffer size: %d\n", tmpLength); 2089b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho exit(U_MEMORY_ALLOCATION_ERROR); 2090b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 209185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(tmp, o->srcDir); 2092b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_strcat(tmp, o->srcDir[uprv_strlen(o->srcDir)-1] == U_FILE_SEP_CHAR ? "" : PKGDATA_FILE_SEP_STRING); 209385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(tmp, s); 2094b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho o->filePaths = pkg_appendToList(o->filePaths, &tail2, tmp); 209585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho linePtr = lineNext; 209685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } /* for each entry on line */ 209785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } /* for each line */ 209885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho T_FileStream_close(in); 209985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } /* for each file list file */ 210085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 210185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 210285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* Try calling icu-config directly to get the option file. */ 210350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static int32_t pkg_getOptionsFromICUConfig(UBool verbose, UOption *option) { 210485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if U_HAVE_POPEN 2105c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalPipeFilePointer p; 210685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho size_t n; 210785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho static char buf[512] = ""; 2108f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius icu::CharString cmdBuf; 210950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode status = U_ZERO_ERROR; 211085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char cmd[] = "icu-config --incpkgdatafile"; 2111f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius char dirBuf[1024] = ""; 211250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* #1 try the same path where pkgdata was called from. */ 2113f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius findDirname(progname, dirBuf, UPRV_LENGTHOF(dirBuf), &status); 211450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 2115f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius cmdBuf.append(dirBuf, status); 2116103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (cmdBuf[0] != 0) { 2117f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius cmdBuf.append( U_FILE_SEP_STRING, status ); 2118103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2119f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius cmdBuf.append( cmd, status ); 212050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 212150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(verbose) { 2122f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius fprintf(stdout, "# Calling icu-config: %s\n", cmdBuf.data()); 212350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 2124c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert p.adoptInstead(popen(cmdBuf.data(), "r")); 212550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 212650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2127c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(p.isNull() || (n = fread(buf, 1, UPRV_LENGTHOF(buf)-1, p.getAlias())) <= 0) { 2128c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(verbose) { 2129c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fprintf(stdout, "# Calling icu-config: %s\n", cmd); 2130c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 213185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2132c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert p.adoptInstead(popen(cmd, "r")); 2133c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(p.isNull() || (n = fread(buf, 1, UPRV_LENGTHOF(buf)-1, p.getAlias())) <= 0) { 2134c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fprintf(stderr, "%s: icu-config: No icu-config found. (fix PATH or use -O option)\n", progname); 2135c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return -1; 2136c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 213785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 213885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 213985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t length = strlen(buf) - 1; length >= 0; length--) { 214085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (buf[length] == '\n' || buf[length] == ' ') { 214185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho buf[length] = 0; 214285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 214385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 214485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 214585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 214685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 214785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(buf[strlen(buf)-1]=='\n') 214885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 214985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho buf[strlen(buf)-1]=0; 215085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 215185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 215285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(buf[0] == 0) 215385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 215485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "%s: icu-config: invalid response from icu-config (fix PATH or use -O option)\n", progname); 215585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 215685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 215785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 215850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(verbose) { 215950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, "# icu-config said: %s\n", buf); 216050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 216150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 216285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho option->value = buf; 216385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho option->doesOccur = TRUE; 216485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 216585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 0; 216654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#else 216785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return -1; 216854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 216985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 21701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 21711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#ifdef CAN_WRITE_OBJ_CODE 21721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert /* Create optMatchArch for genccode architecture detection */ 21731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertstatic void pkg_createOptMatchArch(char *optMatchArch) { 21741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) 21751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert const char* code = "void oma(){}"; 21761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert const char* source = "oma.c"; 21771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert const char* obj = "oma.obj"; 21781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert FileStream* stream = NULL; 21791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 21801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert stream = T_FileStream_open(source,"w"); 21811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (stream != NULL) { 21821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert T_FileStream_writeLine(stream, code); 21831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert T_FileStream_close(stream); 21841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 2185c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert char cmd[LARGE_BUFFER_MAX_SIZE]; 21861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert sprintf(cmd, "%s %s -o %s", 21871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert pkgDataFlags[COMPILER], 21881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert source, 21891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert obj); 21901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 21911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (runCommand(cmd) == 0){ 21921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert sprintf(optMatchArch, "%s", obj); 21931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 21941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert else { 21951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert fprintf(stderr, "Failed to compile %s\n", source); 21961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 21971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if(!T_FileStream_remove(source)){ 21981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert fprintf(stderr, "T_FileStream_remove failed to delete %s\n", source); 21991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 22001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 22011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert else { 22021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert fprintf(stderr, "T_FileStream_open failed to open %s for writing\n", source); 22031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 22041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#endif 22051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert} 22061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertstatic void pkg_destroyOptMatchArch(char *optMatchArch) { 22071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if(T_FileStream_file_exists(optMatchArch) && !T_FileStream_remove(optMatchArch)){ 22081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert fprintf(stderr, "T_FileStream_remove failed to delete %s\n", optMatchArch); 22091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 22101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert} 22111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#endif 2212