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