1 /******************************************************************************
3 * Copyright (C) 2000-2007, International Business Machines
4 * Corporation and others. All Rights Reserved.
6 *******************************************************************************
8 * encoding: ANSI X3.4 (1968)
9 * tab size: 8 (not used)
12 * created on: 2000july14
13 * created by: Vladimir Weinstein
15 * This program packages the ICU data into different forms
16 * (DLL, common data, etc.)
19 #include "unicode/utypes.h"
21 #ifdef U_MAKE_IS_NMAKE
23 #include "unicode/putil.h"
36 MSVC 2005 has the annoying habit of creating a manifest when one isn't needed.
37 The generated library doesn't depend on anything due to the /NOENTRY usage.
39 #if defined(_MSC_VER) && _MSC_VER >= 1400
40 #define NO_MANIFEST "/MANIFEST:NO "
42 #define NO_MANIFEST ""
45 /*#define WINBUILDMODE (*(o->options)=='R'?"Release":"Debug")*/
46 #define CONTAINS_REAL_PATH(o) (*(o->options)==PKGDATA_DERIVED_PATH)
48 void writeCmnRules(UPKGOptions
*o
, const char *targetDirVar
, FileStream
*makefile
)
54 sprintf(tmp
, "\"$(%s)\\$(CMNTARGET)\" : $(DATAFILEPATHS)\n"
55 "\t%s\"$(ICUPKG)\" -t%c %s%s%s -s \"$(SRCDIR)\" -a \"$(LISTFILES)\" new \"$(%s)\\$(CMNTARGET)\"\n",
57 (o
->verbose
? "" : "@"),
58 (U_IS_BIG_ENDIAN
? 'b' : 'l'),
59 (o
->comment
? "-C \"" : ""),
60 (o
->comment
? o
->comment
: ""),
61 (o
->comment
? "\" " : ""),
63 T_FileStream_writeLine(makefile
, tmp
);
68 void pkg_mode_windows(UPKGOptions
*o
, FileStream
*makefile
, UErrorCode
*status
) {
71 const char *separator
= o
->icuroot
[uprv_strlen(o
->icuroot
)-1]=='\\'?"":"\\";
72 UBool isDll
= (UBool
)(uprv_strcmp(o
->mode
, "dll") == 0);
73 UBool isStatic
= (UBool
)(uprv_strcmp(o
->mode
, "static") == 0);
75 if(U_FAILURE(*status
)) {
79 sprintf(tmp2
, "ICUROOT=%s\n\n", o
->icuroot
);
80 T_FileStream_writeLine(makefile
, tmp2
);
82 if (CONTAINS_REAL_PATH(o
)) {
84 "ICUPKG = $(ICUROOT)%sicupkg.exe\n", separator
);
88 "ICUPKG = $(ICUROOT)%sbin\\icupkg.exe\n", separator
);
90 T_FileStream_writeLine(makefile
, tmp2
);
93 uprv_strcpy(tmp
, LIB_PREFIX
);
94 uprv_strcat(tmp
, o
->libName
);
96 uprv_strcat(tmp
, "$(TARGET_VERSION)");
98 uprv_strcat(tmp
, UDATA_SO_SUFFIX
);
100 if(o
->nooutput
|| o
->verbose
) {
101 fprintf(stdout
, "# Output %s file: %s%s%s\n", UDATA_SO_SUFFIX
, o
->targetDir
, U_FILE_SEP_STRING
, tmp
);
105 *status
= U_ZERO_ERROR
;
109 sprintf(tmp2
, "# DLL file to make:\nDLLTARGET=%s\n\n", tmp
);
110 T_FileStream_writeLine(makefile
, tmp2
);
113 "LINK32 = link.exe\n"
114 "LINK32_FLAGS = /nologo /release /out:\"$(TARGETDIR)\\$(DLLTARGET)\" /DLL /NOENTRY " NO_MANIFEST
"$(LDFLAGS) $(PKGDATA_LDFLAGS) /implib:\"$(TARGETDIR)\\$(LIBNAME).lib\"\n");
115 T_FileStream_writeLine(makefile
, tmp2
);
117 if (CONTAINS_REAL_PATH(o
)) {
119 "GENCCODE = $(ICUROOT)%sgenccode.exe\n", separator
);
123 "GENCCODE = $(ICUROOT)%sbin\\genccode.exe\n", separator
);
125 T_FileStream_writeLine(makefile
, tmp2
);
127 /* If you modify this, remember to modify makedata.mak too. */
128 T_FileStream_writeLine(makefile
, "\n"
129 "# Windows specific DLL version information.\n"
130 "!IF EXISTS(\"$(TEMP_DIR)\\icudata.res\")\n"
131 "DATA_VER_INFO=\"$(TEMP_DIR)\\icudata.res\"\n"
137 uprv_strcpy(tmp
, UDATA_CMN_PREFIX
"$(NAME)" UDATA_CMN_INTERMEDIATE_SUFFIX OBJ_SUFFIX
);
139 sprintf(tmp2
, "# intermediate obj file:\nCMNOBJTARGET=%s\n\n", tmp
);
140 T_FileStream_writeLine(makefile
, tmp2
);
144 uprv_strcpy(tmp
, LIB_PREFIX
);
145 uprv_strcat(tmp
, o
->libName
);
146 uprv_strcat(tmp
, UDATA_LIB_SUFFIX
);
149 pkg_sttc_writeReadme(o
, tmp
, status
);
151 if(U_FAILURE(*status
))
156 if(o
->nooutput
|| o
->verbose
) {
157 fprintf(stdout
, "# Output %s file: %s%s%s\n", UDATA_SO_SUFFIX
, o
->targetDir
, U_FILE_SEP_STRING
, tmp
);
161 *status
= U_ZERO_ERROR
;
165 sprintf(tmp2
, "# LIB file to make:\nDLLTARGET=%s\n\n", tmp
);
166 T_FileStream_writeLine(makefile
, tmp2
);
170 "LINK32_FLAGS = /nologo /out:\"$(TARGETDIR)\\$(DLLTARGET)\"\n"
172 T_FileStream_writeLine(makefile
, tmp2
);
175 if (CONTAINS_REAL_PATH(o
)) {
177 "GENCCODE = $(ICUROOT)%sgenccode.exe\n", separator
);
181 "GENCCODE = $(ICUROOT)%sbin\\genccode.exe\n", separator
);
183 T_FileStream_writeLine(makefile
, tmp2
);
185 uprv_strcpy(tmp
, UDATA_CMN_PREFIX
"$(NAME)" UDATA_CMN_INTERMEDIATE_SUFFIX OBJ_SUFFIX
);
187 sprintf(tmp2
, "# intermediate obj file\nCMNOBJTARGET=%s\n\n", tmp
);
188 T_FileStream_writeLine(makefile
, tmp2
);
190 uprv_strcpy(tmp
, UDATA_CMN_PREFIX
);
191 uprv_strcat(tmp
, o
->cShortName
);
192 if (o
->version
&& !uprv_strstr(o
->shortName
,o
->version
)) {
193 uprv_strcat(tmp
, "$(TARGET_VERSION)");
195 uprv_strcat(tmp
, UDATA_CMN_SUFFIX
);
197 if(o
->nooutput
|| o
->verbose
) {
198 fprintf(stdout
, "# Output file: %s%s%s\n", o
->targetDir
, U_FILE_SEP_STRING
, tmp
);
202 *status
= U_ZERO_ERROR
;
206 sprintf(tmp2
, "# common file to make:\nCMNTARGET=%s\n\n", tmp
);
207 T_FileStream_writeLine(makefile
, tmp2
);
210 if(isDll
|| isStatic
) {
211 sprintf(tmp
, "all: \"$(TARGETDIR)\\$(DLLTARGET)\"\n\n");
212 T_FileStream_writeLine(makefile
, tmp
);
214 sprintf(tmp
, "\"$(TARGETDIR)\\$(DLLTARGET)\": \"$(TEMP_DIR)\\$(CMNOBJTARGET)\"\n"
215 "\t$(LINK32) $(LINK32_FLAGS) \"$(TEMP_DIR)\\$(CMNOBJTARGET)\" $(DATA_VER_INFO)\n\n");
216 T_FileStream_writeLine(makefile
, tmp
);
217 sprintf(tmp
, "\"$(TEMP_DIR)\\$(CMNOBJTARGET)\": \"$(TEMP_DIR)\\$(CMNTARGET)\"\n"
218 "\t@\"$(GENCCODE)\" $(GENCOPTIONS) -e $(ENTRYPOINT) -o -d \"$(TEMP_DIR)\" \"$(TEMP_DIR)\\$(CMNTARGET)\"\n\n");
219 T_FileStream_writeLine(makefile
, tmp
);
223 "\t-@erase \"$(TARGETDIR)\\$(DLLTARGET)\"\n"
224 "\t-@erase \"$(TEMP_DIR)\\$(CMNOBJTARGET)\"\n"
225 "\t-@erase \"$(TEMP_DIR)\\$(CMNTARGET)\"\n\n");
226 T_FileStream_writeLine(makefile
, tmp2
);
228 T_FileStream_writeLine(makefile
, "install: \"$(TARGETDIR)\\$(DLLTARGET)\"\n"
229 "\tcopy \"$(TARGETDIR)\\$(DLLTARGET)\" \"$(INSTALLTO)\\$(DLLTARGET)\"\n\n");
230 /* Write compile rules */
231 writeCmnRules(o
, "TEMP_DIR", makefile
);
232 } else { /* common */
233 sprintf(tmp
, "all: \"$(TARGETDIR)\\$(CMNTARGET)\"\n\n");
234 T_FileStream_writeLine(makefile
, tmp
);
238 "\t-@erase \"$(TARGETDIR)\\$(CMNTARGET)\"\n\n");
239 T_FileStream_writeLine(makefile
, tmp2
);
241 T_FileStream_writeLine(makefile
, "install: \"$(TARGETDIR)\\$(CMNTARGET)\"\n"
242 "\tcopy \"$(TARGETDIR)\\$(CMNTARGET)\" \"$(INSTALLTO)\\$(CMNTARGET)\"\n\n");
244 /* Write compile rules */
245 writeCmnRules(o
, "TARGETDIR", makefile
);
248 T_FileStream_writeLine(makefile
, "rebuild: clean all\n\n");