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