]> git.saurik.com Git - apple/icu.git/blob - icuSources/tools/pkgdata/winmode.c
ICU-400.37.tar.gz
[apple/icu.git] / icuSources / tools / pkgdata / winmode.c
1 /******************************************************************************
2 *
3 * Copyright (C) 2000-2007, International Business Machines
4 * Corporation and others. All Rights Reserved.
5 *
6 *******************************************************************************
7 * file name: winmode.c
8 * encoding: ANSI X3.4 (1968)
9 * tab size: 8 (not used)
10 * indentation:4
11 *
12 * created on: 2000july14
13 * created by: Vladimir Weinstein
14 *
15 * This program packages the ICU data into different forms
16 * (DLL, common data, etc.)
17 */
18
19 #include "unicode/utypes.h"
20
21 #ifdef U_MAKE_IS_NMAKE
22
23 #include "unicode/putil.h"
24 #include "cmemory.h"
25 #include "cstring.h"
26 #include "filestrm.h"
27 #include "toolutil.h"
28 #include "unewdata.h"
29 #include "uoptions.h"
30 #include "pkgtypes.h"
31 #include "makefile.h"
32 #include <stdio.h>
33 #include <stdlib.h>
34
35 /*
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.
38 */
39 #if defined(_MSC_VER) && _MSC_VER >= 1400
40 #define NO_MANIFEST "/MANIFEST:NO "
41 #else
42 #define NO_MANIFEST ""
43 #endif
44
45 /*#define WINBUILDMODE (*(o->options)=='R'?"Release":"Debug")*/
46 #define CONTAINS_REAL_PATH(o) (*(o->options)==PKGDATA_DERIVED_PATH)
47
48 void writeCmnRules(UPKGOptions *o, const char *targetDirVar, FileStream *makefile)
49 {
50 char tmp[1024];
51 CharList *infiles;
52
53 infiles = o->files;
54 sprintf(tmp, "\"$(%s)\\$(CMNTARGET)\" : $(DATAFILEPATHS)\n"
55 "\t%s\"$(ICUPKG)\" -t%c %s%s%s -s \"$(SRCDIR)\" -a \"$(LISTFILES)\" new \"$(%s)\\$(CMNTARGET)\"\n",
56 targetDirVar,
57 (o->verbose ? "" : "@"),
58 (U_IS_BIG_ENDIAN ? 'b' : 'l'),
59 (o->comment ? "-C \"" : ""),
60 (o->comment ? o->comment : ""),
61 (o->comment ? "\" " : ""),
62 targetDirVar);
63 T_FileStream_writeLine(makefile, tmp);
64 }
65
66
67
68 void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status) {
69 char tmp[1024];
70 char tmp2[1024];
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);
74
75 if(U_FAILURE(*status)) {
76 return;
77 }
78
79 sprintf(tmp2, "ICUROOT=%s\n\n", o->icuroot);
80 T_FileStream_writeLine(makefile, tmp2);
81
82 if (CONTAINS_REAL_PATH(o)) {
83 sprintf(tmp2,
84 "ICUPKG = $(ICUROOT)%sicupkg.exe\n", separator);
85 }
86 else {
87 sprintf(tmp2,
88 "ICUPKG = $(ICUROOT)%sbin\\icupkg.exe\n", separator);
89 }
90 T_FileStream_writeLine(makefile, tmp2);
91
92 if(isDll) {
93 uprv_strcpy(tmp, LIB_PREFIX);
94 uprv_strcat(tmp, o->libName);
95 if (o->version) {
96 uprv_strcat(tmp, "$(TARGET_VERSION)");
97 }
98 uprv_strcat(tmp, UDATA_SO_SUFFIX);
99
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);
102 }
103
104 if(o->nooutput) {
105 *status = U_ZERO_ERROR;
106 return;
107 }
108
109 sprintf(tmp2, "# DLL file to make:\nDLLTARGET=%s\n\n", tmp);
110 T_FileStream_writeLine(makefile, tmp2);
111
112 sprintf(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);
116
117 if (CONTAINS_REAL_PATH(o)) {
118 sprintf(tmp2,
119 "GENCCODE = $(ICUROOT)%sgenccode.exe\n", separator);
120 }
121 else {
122 sprintf(tmp2,
123 "GENCCODE = $(ICUROOT)%sbin\\genccode.exe\n", separator);
124 }
125 T_FileStream_writeLine(makefile, tmp2);
126
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"
132 "!ELSE\n"
133 "DATA_VER_INFO=\n"
134 "!ENDIF\n\n");
135
136
137 uprv_strcpy(tmp, UDATA_CMN_PREFIX "$(NAME)" UDATA_CMN_INTERMEDIATE_SUFFIX OBJ_SUFFIX);
138
139 sprintf(tmp2, "# intermediate obj file:\nCMNOBJTARGET=%s\n\n", tmp);
140 T_FileStream_writeLine(makefile, tmp2);
141 }
142 else if (isStatic)
143 {
144 uprv_strcpy(tmp, LIB_PREFIX);
145 uprv_strcat(tmp, o->libName);
146 uprv_strcat(tmp, UDATA_LIB_SUFFIX);
147
148 if (!o->quiet) {
149 pkg_sttc_writeReadme(o, tmp, status);
150 }
151 if(U_FAILURE(*status))
152 {
153 return;
154 }
155
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);
158 }
159
160 if(o->nooutput) {
161 *status = U_ZERO_ERROR;
162 return;
163 }
164
165 sprintf(tmp2, "# LIB file to make:\nDLLTARGET=%s\n\n", tmp);
166 T_FileStream_writeLine(makefile, tmp2);
167
168 sprintf(tmp2,
169 "LINK32 = LIB.exe\n"
170 "LINK32_FLAGS = /nologo /out:\"$(TARGETDIR)\\$(DLLTARGET)\"\n"
171 );
172 T_FileStream_writeLine(makefile, tmp2);
173
174
175 if (CONTAINS_REAL_PATH(o)) {
176 sprintf(tmp2,
177 "GENCCODE = $(ICUROOT)%sgenccode.exe\n", separator);
178 }
179 else {
180 sprintf(tmp2,
181 "GENCCODE = $(ICUROOT)%sbin\\genccode.exe\n", separator);
182 }
183 T_FileStream_writeLine(makefile, tmp2);
184
185 uprv_strcpy(tmp, UDATA_CMN_PREFIX "$(NAME)" UDATA_CMN_INTERMEDIATE_SUFFIX OBJ_SUFFIX);
186
187 sprintf(tmp2, "# intermediate obj file\nCMNOBJTARGET=%s\n\n", tmp);
188 T_FileStream_writeLine(makefile, tmp2);
189 }
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)");
194 }
195 uprv_strcat(tmp, UDATA_CMN_SUFFIX);
196
197 if(o->nooutput || o->verbose) {
198 fprintf(stdout, "# Output file: %s%s%s\n", o->targetDir, U_FILE_SEP_STRING, tmp);
199 }
200
201 if(o->nooutput) {
202 *status = U_ZERO_ERROR;
203 return;
204 }
205
206 sprintf(tmp2, "# common file to make:\nCMNTARGET=%s\n\n", tmp);
207 T_FileStream_writeLine(makefile, tmp2);
208
209
210 if(isDll || isStatic) {
211 sprintf(tmp, "all: \"$(TARGETDIR)\\$(DLLTARGET)\"\n\n");
212 T_FileStream_writeLine(makefile, tmp);
213
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);
220
221 sprintf(tmp2,
222 "clean:\n"
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);
227
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);
235
236 sprintf(tmp2,
237 "clean:\n"
238 "\t-@erase \"$(TARGETDIR)\\$(CMNTARGET)\"\n\n");
239 T_FileStream_writeLine(makefile, tmp2);
240
241 T_FileStream_writeLine(makefile, "install: \"$(TARGETDIR)\\$(CMNTARGET)\"\n"
242 "\tcopy \"$(TARGETDIR)\\$(CMNTARGET)\" \"$(INSTALLTO)\\$(CMNTARGET)\"\n\n");
243
244 /* Write compile rules */
245 writeCmnRules(o, "TARGETDIR", makefile);
246 }
247
248 T_FileStream_writeLine(makefile, "rebuild: clean all\n\n");
249
250 }
251
252 #endif