• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1## Makefile.in for ICU data
2## Copyright (C) 2016 and later: Unicode, Inc. and others.
3## License & terms of use: http://www.unicode.org/copyright.html
4## Copyright (c) 1999-2015, International Business Machines Corporation and
5## others. All Rights Reserved.
6
7## Source directory information
8srcdir = @srcdir@
9top_srcdir = @top_srcdir@
10
11# So that you have $(top_builddir)/config.status
12top_builddir = ..
13
14## All the flags and other definitions are included here.
15include $(top_builddir)/icudefs.mk
16
17## Build directory information
18# So that  $(top_builddir)/$(subdir) ~= "here"
19subdir = data
20
21#lib icu data for link
22LIB_ICUDATA_NAME=$(LIBICU)$(DATA_STUBNAME)$(ICULIBSUFFIX)
23LIB_STATIC_ICUDATA_NAME=$(LIBSICU)$(DATA_STUBNAME)$(ICULIBSUFFIX)
24
25# Allow Windows to override these options
26ifeq ($(PKGDATA_OPTS),)
27PKGDATA_OPTS = -O $(top_builddir)/data/icupkg.inc
28endif
29ifeq ($(PKGDATA_VERSIONING),)
30PKGDATA_VERSIONING = -r $(SO_TARGET_VERSION)
31endif
32
33# This allows all the data to be in one directory
34ifeq ($(PKGDATA_MODE),dll)
35ICUPKGDATA_OUTDIR = $(LIBDIR)
36else
37ifeq ($(PKGDATA_MODE),static)
38ICUPKGDATA_OUTDIR = $(LIBDIR)
39else
40ICUPKGDATA_OUTDIR = $(OUTDIR)
41endif
42endif
43
44CURDIR:=$(CURR_FULL_DIR)
45# current directory should not be blank
46ifeq ($(CURDIR),)
47CURDIR=.
48endif
49ifeq ($(BUILD_HOST_ICU),OS390)
50PKGDATA = $(TOOLBINDIR)/pkgdata $(PKGDATA_OPTS) -z -q -c -s $(CURDIR)/out/build/$(ICUDATA_PLATFORM_NAME) -d $(ICUPKGDATA_OUTDIR)
51else
52PKGDATA = $(TOOLBINDIR)/pkgdata $(PKGDATA_OPTS) -q -c -s $(CURDIR)/out/build/$(ICUDATA_PLATFORM_NAME) -d $(ICUPKGDATA_OUTDIR)
53endif
54
55# OBJDATADIR must be a short path (with ..'s) to the data.
56
57ifeq ($(top_srcdir),..)
58SRCDATADIR=.
59else
60SRCDATADIR=$(top_srcdir)/data
61endif
62ifeq ($(top_builddir),..)
63OUTDIR=./out
64else
65OUTDIR=$(top_builddir)/data/out
66endif
67
68OUTTMPDIR=$(OUTDIR)/tmp
69MAINBUILDDIR=$(OUTDIR)/build
70BUILDDIR=$(MAINBUILDDIR)/$(ICUDATA_PLATFORM_NAME)
71MISCSRCDIR=$(SRCDATADIR)/misc
72SRCLISTDEPS=Makefile $(srcdir)/Makefile.in
73
74# Variable names for rules.mk
75OUT_DIR=$(BUILDDIR)
76TMP_DIR=$(OUTTMPDIR)
77
78# relative lib links from pkgdata are the same as for tmp
79TOOLDIR=$(top_builddir)/tools
80
81## List of phony targets
82.PHONY : all all-local all-recursive install install-local install-files	\
83install-recursive clean clean-local clean-recursive distclean		\
84distclean-local distclean-recursive dist dist-local dist-recursive	\
85check check-local check-recursive clean-resindex icudata.jar	\
86check-exhaustive
87
88## Clear suffix list
89.SUFFIXES :
90
91## List of standard targets
92all: all-local
93install: all-local install-local
94clean: clean-local
95distclean : distclean-local
96dist:
97check: all check-local
98
99check-exhaustive: check
100
101-include Makefile.local
102
103
104distclean-local: clean
105	$(RMV) Makefile
106
107all-local: icupkg.inc build-local packagedata $(POST_DATA_BUILD)
108
109dist-local:
110
111clean-map:
112	-test -z *.map || $(RMV) *.map
113
114clean-local: cleanpackage cleanfiles clean-map
115	$(RMV) $(OUTDIR) build-local packagedata uni-core-data
116
117cleanfiles:
118	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
119
120cleanpackage:
121	$(RMV) $(OUTDIR)
122	$(RMV) $(LIBDIR)/*$(LIB_ICUDATA_NAME)*.$(SO)* $(LIBDIR)/$(LIB_STATIC_ICUDATA_NAME).$(A)
123
124check-local:
125	PYTHONPATH=$(top_srcdir)/python @PYTHON@ -m icutools.databuilder.test
126
127# Find out if we have a source archive.
128# If we have that, then use that instead of building everything from scratch.
129ICUDATA_SOURCE_ARCHIVE = $(wildcard $(srcdir)/in/$(ICUDATA_PLATFORM_NAME).dat)
130ifeq ($(ICUDATA_SOURCE_ARCHIVE),)
131ICUDATA_ARCHIVE = $(firstword $(wildcard $(srcdir)/in/$(ICUDATA_BASENAME_VERSION)*.dat))
132# We don't have the data in the current endianness or charset.
133# See if we can find data of any archive type,
134# and convert it to the current type.
135ifneq ($(ICUDATA_ARCHIVE),)
136ICUDATA_SOURCE_ARCHIVE = $(OUTDIR)/$(ICUDATA_PLATFORM_NAME).dat
137$(ICUDATA_SOURCE_ARCHIVE): $(ICUDATA_ARCHIVE)
138	$(MKINSTALLDIRS) $(OUTDIR)
139	$(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $(ICUDATA_ARCHIVE) $(ICUDATA_SOURCE_ARCHIVE)
140
141$(OUTDIR):
142	mkdir -p $(OUTDIR)
143
144endif
145else
146ifneq ($(ENABLE_STATIC),YES)
147ifeq ($(PKGDATA_MODE),common)
148# We have a source data common archive in the native endianness,
149# and it's what we want to build. Try to not run any of ICU's tools.
150ICUDATA_SOURCE_IS_NATIVE_TARGET=YES
151endif
152endif
153endif
154
155packagedata: icupkg.inc $(PKGDATA_LIST) build-local
156ifneq ($(ENABLE_STATIC),)
157ifeq ($(PKGDATA_MODE),dll)
158	$(PKGDATA_INVOKE) $(PKGDATA) -e $(ICUDATA_ENTRY_POINT) -T $(OUTTMPDIR) -p $(ICUDATA_NAME) $(PKGDATA_LIBSTATICNAME) -m static $(PKGDATA_VERSIONING) $(PKGDATA_LIST)
159endif
160endif
161ifneq ($(ICUDATA_SOURCE_IS_NATIVE_TARGET),YES)
162	$(PKGDATA_INVOKE) $(PKGDATA) -e $(ICUDATA_ENTRY_POINT) -T $(OUTTMPDIR) -p $(ICUDATA_NAME) -m $(PKGDATA_MODE) $(PKGDATA_VERSIONING) $(PKGDATA_LIBNAME) $(PKGDATA_LIST)
163else
164	$(INSTALL_DATA) $(ICUDATA_SOURCE_ARCHIVE) $(OUTDIR)
165endif
166	echo timestamp > $@
167
168## Install ICU data.
169install-local: $(PKGDATA_LIST) ./icupkg.inc packagedata
170	$(MKINSTALLDIRS) $(TMPDATADIR) $(DESTDIR)$(ICUPKGDATA_DIR)
171ifeq ($(PKGDATA_MODE),files)
172	$(MKINSTALLDIRS) $(ICUPKGDATA_DIR)/$(ICUDATA_NAME)
173	$(MKINSTALLDIRS) $(ICUPKGDATA_DIR)/$(ICUDATA_NAME)/$(CURR_TREE)
174	$(MKINSTALLDIRS) $(ICUPKGDATA_DIR)/$(ICUDATA_NAME)/$(LANG_TREE)
175	$(MKINSTALLDIRS) $(ICUPKGDATA_DIR)/$(ICUDATA_NAME)/$(REGION_TREE)
176	$(MKINSTALLDIRS) $(ICUPKGDATA_DIR)/$(ICUDATA_NAME)/$(ZONE_TREE)
177	$(MKINSTALLDIRS) $(ICUPKGDATA_DIR)/$(ICUDATA_NAME)/$(UNIT_TREE)
178	$(MKINSTALLDIRS) $(ICUPKGDATA_DIR)/$(ICUDATA_NAME)/$(BREAK_TREE)
179	$(MKINSTALLDIRS) $(ICUPKGDATA_DIR)/$(ICUDATA_NAME)/$(COLLATION_TREE)
180	$(MKINSTALLDIRS) $(ICUPKGDATA_DIR)/$(ICUDATA_NAME)/$(RBNF_TREE)
181	$(MKINSTALLDIRS) $(ICUPKGDATA_DIR)/$(ICUDATA_NAME)/$(TRANSLIT_TREE)
182endif
183ifneq ($(ENABLE_STATIC),)
184ifeq ($(PKGDATA_MODE),dll)
185# For MinGW, do we want the DLL to go in the bin location?
186ifeq ($(MINGW_MOVEDLLSTOBINDIR),YES)
187	$(PKGDATA_INVOKE) $(PKGDATA) -m static -e $(ICUDATA_ENTRY_POINT) -T $(OUTTMPDIR) -s $(BUILDDIR) -p $(ICUDATA_NAME) $(PKGDATA_LIBSTATICNAME) $(PKGDATA_LIST) -I $(DESTDIR)$(bindir)
188else
189	$(PKGDATA_INVOKE) $(PKGDATA) -m static -e $(ICUDATA_ENTRY_POINT) -T $(OUTTMPDIR) -s $(BUILDDIR) -p $(ICUDATA_NAME) $(PKGDATA_LIBSTATICNAME) $(PKGDATA_LIST) -I $(ICUPKGDATA_INSTALL_LIBDIR)
190endif
191endif
192endif
193ifneq ($(ICUDATA_SOURCE_IS_NATIVE_TARGET),YES)
194# For MinGW, do we want the DLL to go in the bin location?
195ifeq ($(MINGW_MOVEDLLSTOBINDIR),YES)
196	$(PKGDATA_INVOKE) $(PKGDATA) -m $(PKGDATA_MODE) $(PKGDATA_VERSIONING) -e $(ICUDATA_ENTRY_POINT) -T $(OUTTMPDIR) -s $(BUILDDIR) -p $(ICUDATA_NAME) $(PKGDATA_LIBNAME) $(PKGDATA_LIST) -I $(DESTDIR)$(bindir)
197else
198	$(PKGDATA_INVOKE) $(PKGDATA) -m $(PKGDATA_MODE) $(PKGDATA_VERSIONING) -e $(ICUDATA_ENTRY_POINT) -T $(OUTTMPDIR) -s $(BUILDDIR) -p $(ICUDATA_NAME) $(PKGDATA_LIBNAME) $(PKGDATA_LIST) -I $(ICUPKGDATA_INSTALL_DIR)
199endif
200else
201	$(INSTALL_DATA) $(ICUDATA_SOURCE_ARCHIVE) $(DESTDIR)$(ICUPKGDATA_DIR)
202endif
203
204
205## Include the main build rules for data files
206include $(top_builddir)/$(subdir)/rules.mk
207
208
209ifeq ($(ENABLE_SO_VERSION_DATA),1)
210ifeq ($(PKGDATA_MODE),dll)
211SO_VERSION_DATA = $(OUTTMPDIR)/icudata.res
212$(SO_VERSION_DATA) : $(MISCSRCDIR)/icudata.rc | $(TMP_DIR)/dirs.timestamp
213ifeq ($(MSYS_RC_MODE),1)
214	rc.exe -i$(srcdir)/../common -i$(top_builddir)/common -fo$@ $(CPPFLAGS) $<
215else
216	rc.exe /i$(srcdir)/../common /i$(top_builddir)/common /fo$@ $(CPPFLAGS) $(SOURCE_FILE)
217endif
218endif
219endif
220
221PKGDATA_LIST = $(TMP_DIR)/icudata.lst
222
223
224#####################################################
225# General data build rules
226
227## Files to remove for 'make clean'
228CLEANFILES = *~ icupkg.inc *.x
229
230ifeq ($(ICUDATA_SOURCE_ARCHIVE),)
231build-local: $(SO_VERSION_DATA) $(ICUDATA_ALL_OUTPUT_FILES) $(PKGDATA_LIST)
232	echo timestamp > $@
233else
234build-local: $(SO_VERSION_DATA) $(PKGDATA_LIST)
235	echo timestamp > $@
236$(PKGDATA_LIST): $(SRCLISTDEPS) $(ICUDATA_SOURCE_ARCHIVE)
237ifneq ($(ICUDATA_SOURCE_IS_NATIVE_TARGET),YES)
238	$(MKINSTALLDIRS) $(OUTTMPDIR) $(BUILDDIR)
239	@echo "Unpacking $(ICUDATA_SOURCE_ARCHIVE) and generating $@ (list of data files)"
240	@-$(RMV) $@
241	$(INVOKE) $(TOOLBINDIR)/icupkg -d $(BUILDDIR) --list -x \* $(ICUDATA_SOURCE_ARCHIVE) -o $@
242else
243	@echo "$@" > $@
244endif
245endif
246
247
248# if the tzcode directory contains a new tzdata*.tar.gz file, use it for zoneinfo
249ifeq ($(TZDATA),)
250TZDATA = $(firstword $(wildcard $(top_builddir)/tools/tzcode/tzdata*.tar.gz) $(wildcard $(top_srcdir)/tools/tzcode/tzdata*.tar.gz))
251endif
252
253# TODO(ICU-20466): Make the TZDATA override part of Python icutools.databuilder
254ifneq ($(TZDATA),)
255
256TZCODE_DIR=$(top_builddir)/tools/tzcode
257ZONEINFO=$(TZCODE_DIR)/zoneinfo64.txt
258
259# Override the normal genrb for zoneinfo to always pull from
260# icu/source/tools/tzcode/zoneinfo64.txt
261$(BUILDDIR)/zoneinfo64.res: $(ZONEINFO) $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
262	@echo Note: $(MISCSRCDIR)/zoneinfo.txt is IGNORED because $(TZDATA) is present.
263	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -q -i $(BUILDDIR) -d $(BUILDDIR) $(ZONEINFO)
264
265# Create the tzcode tool and zoneinfo as needed.
266$(ZONEINFO): $(TZDATA)
267	@echo "$(MAKE)[$(MAKELEVEL)]: Making \`$(ZONEINFO)' in \`$(TZCODE_DIR)'"; \
268	(cd $(TZCODE_DIR) && $(MAKE)) || exit; \
269
270# end of zoneinfo-generation
271endif
272
273# Build the ICU4J icudata.jar.
274# Command line:
275#   (Run this from the output data folder which may not be .../source/data in an out-of-source build.)
276#   ~/svn.icu/trunk/source/data> make JAR=jar ICU4J_ROOT=~/svn.icu4j/trunk icudata.jar
277# You can omit the ICU4J_ROOT for just building the .jar files without copying them.
278# You can omit the JAR if it's just jar.
279JAR=jar
280
281# For building the testdata.jar see ../test/testdata/Makefile.
282
283ICU4J_TZDATA=$(OUTDIR)/icu4j/icutzdata.jar
284ICU4J_TZDATA_FILES=zoneinfo64 metaZones timezoneTypes windowsZones
285ICU4J_DATA_DIRNAME=com/ibm/icu/impl/data/icudata
286ICU4J_TZDATA_PATHS=$(ICU4J_TZDATA_FILES:%="$(ICU4J_DATA_DIRNAME)/%.res")
287
288# generate icu4j-related data to $(OUTDIR)/icu4j/com/ibm/icu/impl/data/...
289generate-data: packagedata $(OUTTMPDIR)/$(ICUDATA_PLATFORM_NAME).dat
290	mkdir -p $(OUTDIR)/icu4j/$(ICU4J_DATA_DIRNAME)
291	mkdir -p $(OUTDIR)/icu4j/tzdata/$(ICU4J_DATA_DIRNAME)
292	$(INVOKE) $(TOOLBINDIR)/icupkg $(OUTTMPDIR)/$(ICUDATA_PLATFORM_NAME).dat $(OUTDIR)/icu4j/$(ICUDATA_BASENAME_VERSION)b.dat -s $(BUILDDIR) -x '*' -tb -d $(OUTDIR)/icu4j/$(ICU4J_DATA_DIRNAME)
293	mv $(ICU4J_TZDATA_PATHS:%=$(OUTDIR)/icu4j/%) "$(OUTDIR)/icu4j/tzdata/$(ICU4J_DATA_DIRNAME)"
294
295$(OUTDIR)/icu4j/icutzdata.jar: generate-data
296	$(JAR) cf $(OUTDIR)/icu4j/icutzdata.jar -C $(OUTDIR)/icu4j/tzdata $(ICU4J_DATA_DIRNAME)/
297
298# Build icudata.jar:
299# - add the uni-core-data to the ICU package
300# - swap the ICU data
301# - extract all data items
302# - package them into the .jar file
303# TODO(ICU-20466): Move this to Python
304# NOTE: If you get the error "No rule to make target 'out/build/icudt64l/uprops.icu'",
305# you need to reconfigure with unicore data.  See icu4j-readme.txt
306$(OUTDIR)/icu4j/icudata.jar: generate-data | $(OUT_DIR)/uprops.icu
307	$(JAR) cf $(OUTDIR)/icu4j/icudata.jar -C $(OUTDIR)/icu4j $(ICU4J_DATA_DIRNAME)/
308
309ICU4J_DATA=$(OUTDIR)/icu4j/icudata.jar
310
311ifdef ICU4J_ROOT
312
313ICU4J_DATA_INSTALLED=$(ICU4J_ROOT)/main/shared/data/icudata.jar $(ICU4J_ROOT)/main/shared/data/icutzdata.jar
314
315$(ICU4J_ROOT)/main/shared/data/icudata.jar: $(OUTDIR)/icu4j/icudata.jar
316	mkdir -p $(ICU4J_ROOT)/main/shared/data
317	cp $(OUTDIR)/icu4j/icudata.jar $(ICU4J_ROOT)/main/shared/data
318
319$(ICU4J_ROOT)/main/shared/data/icutzdata.jar: $(OUTDIR)/icu4j/icutzdata.jar
320	mkdir -p $(ICU4J_ROOT)/main/shared/data
321	cp $(OUTDIR)/icu4j/icutzdata.jar $(ICU4J_ROOT)/main/shared/data
322
323icu4j-data-install: $(ICU4J_DATA_INSTALLED)
324
325else
326
327icu4j-data-install: icu4j-data
328	@echo data is built into $(OUTDIR)/icu4j
329	@echo '** Error:' ICU4J_ROOT was not set, could not install
330	exit 1
331
332endif
333
334icu4j-data: $(ICU4J_DATA) $(ICU4J_TZDATA)
335
336
337###################################################################
338Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
339	cd $(top_builddir) \
340	&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
341
342icupkg.inc: pkgdataMakefile
343	$(MAKE) -f pkgdataMakefile
344
345pkgdataMakefile:
346	cd $(top_builddir) \
347	&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
348
349###########
350########### 390 (z/OS) support
351UCMFILES390=ebcdic-xml-us.ucm ibm-37_P100-1995.ucm ibm-1047_P100-1995.ucm ibm-4909_P100-1999.ucm
352# used to depend on pnames.icu uprops.icu ucase.icu ubidi.icu
353# These are now hardcoded in ICU4C and only loaded in ICU4J.
354ALLFILES390=cnvalias.icu $(UCMFILES390:.ucm=.cnv)
355
356$(OUTTMPDIR)/icudata390.lst: $(SRCLISTDEPS)
357	@echo "generating $@ (list of 390 data files)"
358	@-$(RMV) $@
359	@for file in $(ALLFILES390); do \
360	  echo $$file >> $@; \
361	done;
362
363ifeq ($(POST_DATA_BUILD), os400-data-rebind)
364os400-data-rebind: $(LIBICUUC)
365
366$(LIBICUUC): $(LIBICUDT)
367	$(RMV) $(LIBICUUC)
368	(cd ../common && $(MAKE) RECURSIVE=YES) || exit;
369endif
370
371