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