]>
Commit | Line | Data |
---|---|---|
b75a7d8f A |
1 | /****************************************************************************** |
2 | * | |
73c04bcf | 3 | * Copyright (C) 2000-2006, International Business Machines |
b75a7d8f A |
4 | * Corporation and others. All Rights Reserved. |
5 | * | |
6 | ******************************************************************************* | |
7 | * file name: filemode.c | |
8 | * encoding: ANSI X3.4 (1968) | |
9 | * tab size: 8 (not used) | |
10 | * indentation:4 | |
11 | * | |
12 | * created on: 2000sep28 | |
13 | * created by: Steven \u24C7 Loomis | |
14 | * | |
15 | * The mode which uses raw files (i.e. does nothing until installation). | |
16 | */ | |
17 | ||
18 | #include <stdio.h> | |
19 | #include <stdlib.h> | |
20 | #include "unicode/utypes.h" | |
21 | #include "unicode/putil.h" | |
22 | #include "cmemory.h" | |
23 | #include "cstring.h" | |
24 | #include "filestrm.h" | |
25 | #include "toolutil.h" | |
26 | #include "unewdata.h" | |
27 | #include "uoptions.h" | |
28 | #include "pkgtypes.h" | |
29 | #include "makefile.h" | |
30 | ||
31 | /* The file we will make will look like this: | |
32 | ||
33 | (where /out is the full path to the output dir) | |
34 | ||
35 | SOURCES=/out/filea /out/fileb ./somewhere/filec ../somewhereelse/filed | |
36 | ||
37 | TARGETS=/out/filea /out/fileb /out/filec /out/filed | |
38 | ||
39 | all: $(TARGETS) | |
40 | ||
41 | /out/filec /out/filed: ../somewhere/filec ../somewhereelse/filed | |
42 | $(INSTALL_DATA) $? $(OUTDIR) | |
43 | ||
44 | install: all | |
45 | $(INSTALL_DATA) $(TARGETS) $(instdir) | |
46 | ||
47 | ||
48 | ==Note:== | |
49 | The only items in the first '$(INSTALL_DATA)' are files NOT already in the out dir! | |
50 | ||
51 | ||
52 | */ | |
53 | ||
73c04bcf A |
54 | #ifdef U_MAKE_IS_NMAKE |
55 | #define DEPENDENT_FILE_RULE "$?" | |
56 | #else | |
57 | #define DEPENDENT_FILE_RULE "$<" | |
58 | #endif | |
b75a7d8f A |
59 | |
60 | void pkg_mode_files(UPKGOptions *o, FileStream *makefile, UErrorCode *status) | |
61 | { | |
73c04bcf A |
62 | char tmp[1024], tmp2[1024], srcPath[1024]; |
63 | char stanza[3072]; | |
b75a7d8f | 64 | |
73c04bcf | 65 | CharList *tail = NULL, *infiles = NULL; |
b75a7d8f | 66 | |
73c04bcf A |
67 | CharList *copyFilesLeft = NULL; /* left hand side of the copy rule*/ |
68 | CharList *copyFilesRight = NULL; /* rhs "" "" */ | |
69 | CharList *copyFilesInstall = NULL; | |
b75a7d8f | 70 | |
73c04bcf A |
71 | CharList *copyFilesLeftTail = NULL; |
72 | CharList *copyFilesRightTail = NULL; | |
73 | CharList *copyFilesInstallTail = NULL; | |
b75a7d8f | 74 | |
73c04bcf A |
75 | CharList *copyDirs = NULL; /* list of dirs to create for copying */ |
76 | CharList *installDirs = NULL; /* list of dirs to create for installation */ | |
374ca955 | 77 | |
73c04bcf | 78 | /* CharList *copyCommands = NULL;*/ |
b75a7d8f | 79 | |
73c04bcf | 80 | const char *baseName; |
b75a7d8f | 81 | |
73c04bcf A |
82 | #ifndef U_MAKE_IS_NMAKE |
83 | T_FileStream_writeLine(makefile, "\n.PHONY: $(NAME) all install clean\n"); | |
84 | #endif | |
85 | T_FileStream_writeLine(makefile, "\nall: $(NAME)\n\n"); | |
b75a7d8f | 86 | |
374ca955 | 87 | infiles = o->files; /* raw files - no paths other than tree paths */ |
374ca955 | 88 | |
73c04bcf A |
89 | /* Dont' copy files already in tmp */ |
90 | for(;infiles;infiles = infiles->next) | |
91 | { | |
92 | uprv_strcpy(tmp, o->targetDir); | |
93 | uprv_strcat(tmp, U_FILE_SEP_STRING); | |
94 | baseName = infiles->str; | |
95 | uprv_strcat(tmp, o->shortName); | |
96 | uprv_strcat(tmp, U_FILE_SEP_STRING); | |
97 | uprv_strcpy(srcPath, "$(SRCDIR)/"); | |
98 | uprv_strcat(srcPath, infiles->str); | |
99 | uprv_strcat(tmp, baseName); | |
100 | ||
101 | copyDirs = pkg_appendUniqueDirToList(copyDirs, NULL, tmp); | |
102 | ||
103 | o->outFiles = pkg_appendToList(o->outFiles, &tail, uprv_strdup(tmp)); | |
104 | ||
105 | if(strcmp(tmp, infiles->str) == 0) | |
106 | { | |
107 | /* fprintf(stderr, "### NOT copying: %s\n", tmp); */ | |
108 | /* no copy needed.. */ | |
109 | } else { | |
110 | sprintf(stanza, "%s: %s\n\t$(INSTALL_DATA) "DEPENDENT_FILE_RULE" $@\n", tmp, srcPath); | |
111 | convertToNativePathSeparators(stanza); | |
112 | T_FileStream_writeLine(makefile, stanza); | |
113 | } | |
114 | ||
115 | uprv_strcpy(tmp2, "$(INSTALLTO)" U_FILE_SEP_STRING); | |
116 | uprv_strcat(tmp2, o->shortName); | |
117 | uprv_strcat(tmp2, U_FILE_SEP_STRING); | |
118 | uprv_strcat(tmp2, baseName); | |
119 | ||
120 | installDirs = pkg_appendUniqueDirToList(installDirs, NULL, tmp2); | |
121 | ||
122 | if(strcmp(tmp2, infiles->str) == 0) { | |
123 | /* fprintf(stderr, "### NOT copying: %s\n", tmp2); */ | |
124 | /* no copy needed.. */ | |
125 | } else { | |
126 | sprintf(stanza, "%s: %s\n\t$(INSTALL_DATA) "DEPENDENT_FILE_RULE" $@\n", tmp2, tmp); | |
127 | convertToNativePathSeparators(stanza); | |
128 | T_FileStream_writeLine(makefile, stanza); | |
129 | ||
130 | /* left hand side: target path, target name */ | |
131 | copyFilesLeft = pkg_appendToList(copyFilesLeft, ©FilesLeftTail, uprv_strdup(tmp)); | |
132 | ||
133 | /* fprintf(stderr, "##### COPY %s from %s\n", tmp, infiles->str); */ | |
134 | /* rhs: source path */ | |
135 | copyFilesRight = pkg_appendToList(copyFilesRight, ©FilesRightTail, uprv_strdup(infiles->str)); | |
136 | ||
137 | /* install: installed path */ | |
138 | copyFilesInstall = pkg_appendToList(copyFilesInstall, ©FilesInstallTail, uprv_strdup(tmp2)); | |
139 | } | |
b75a7d8f A |
140 | } |
141 | ||
73c04bcf A |
142 | if(o->nooutput || o->verbose) { |
143 | CharList *i; | |
144 | fprintf(stdout, "# Output files: "); | |
145 | for(i = o->outFiles; i; i=i->next) { | |
146 | printf("%s ", i->str); | |
147 | } | |
148 | printf("\n"); | |
374ca955 | 149 | } |
b75a7d8f | 150 | |
73c04bcf A |
151 | if(o->nooutput) { |
152 | *status = U_ZERO_ERROR; | |
153 | return; | |
154 | } | |
b75a7d8f | 155 | |
73c04bcf A |
156 | /* these are also the files to delete */ |
157 | T_FileStream_writeLine(makefile, "COPIEDDEST= "); | |
158 | pkg_writeCharListWrap(makefile, copyFilesLeft, " ", " \\\n", 0); | |
159 | T_FileStream_writeLine(makefile, "\n\n"); | |
b75a7d8f A |
160 | |
161 | ||
73c04bcf A |
162 | T_FileStream_writeLine(makefile, "INSTALLEDDEST= "); |
163 | pkg_writeCharListWrap(makefile, copyFilesInstall, " ", " \\\n", 0); | |
164 | T_FileStream_writeLine(makefile, "\n\n"); | |
b75a7d8f | 165 | |
73c04bcf A |
166 | T_FileStream_writeLine(makefile, "COPYDIRS= "); |
167 | pkg_writeCharListWrap(makefile, copyDirs, " ", " \\\n", 0); | |
168 | T_FileStream_writeLine(makefile, "\n\n"); | |
374ca955 A |
169 | |
170 | ||
73c04bcf A |
171 | T_FileStream_writeLine(makefile, "INSTALLDIRS= "); |
172 | pkg_writeCharListWrap(makefile, installDirs, " ", " \\\n", 0); | |
173 | T_FileStream_writeLine(makefile, "\n\n"); | |
374ca955 | 174 | |
73c04bcf A |
175 | if(copyFilesRight != NULL) |
176 | { | |
177 | T_FileStream_writeLine(makefile, "$(NAME): copy-dirs $(COPIEDDEST)\n\n"); | |
b75a7d8f | 178 | |
73c04bcf A |
179 | T_FileStream_writeLine(makefile, "clean:\n\t-$(RMV) $(COPIEDDEST) $(MAKEFILE)"); |
180 | T_FileStream_writeLine(makefile, "\n\n"); | |
b75a7d8f | 181 | |
73c04bcf A |
182 | } |
183 | else | |
184 | { | |
185 | T_FileStream_writeLine(makefile, "clean:\n\n"); | |
186 | } | |
187 | T_FileStream_writeLine(makefile, "install: install-dirs $(INSTALLEDDEST)\n\n"); | |
188 | T_FileStream_writeLine(makefile, "install-dirs:\n\t$(MKINSTALLDIRS) $(INSTALLDIRS)\n\n"); | |
189 | T_FileStream_writeLine(makefile, "copy-dirs:\n\t$(MKINSTALLDIRS) $(COPYDIRS)\n\n"); | |
b75a7d8f A |
190 | } |
191 |