Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
Merge branch 'srl-v0.12-autoicu' of https://github.com/srl295/node in…
Browse files Browse the repository at this point in the history
…to srl-v0.12-autoicu

Conflicts:
	configure
  • Loading branch information
srl295 committed Nov 17, 2014
2 parents 8bce4eb + 8a33708 commit 957030f
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 12 deletions.
29 changes: 26 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,18 +83,41 @@ make doc
man doc/node.1
```

### To build `Intl` (ECMA-402) support:
### `Intl` (ECMA-402) support:

*Note:* more docs, including how to reduce disk footprint, are on
The `small-icu` mode is enabled by default. It will build
with English-only data. You can add full data at runtime.

*Note:* more docs are on
[the wiki](https://github.com/joyent/node/wiki/Intl).

#### Build with full ICU support (all locales supported by ICU):

Unix/Macintosh:

```sh
./configure --with-intl=full-icu
```

Windows:

```sh
vcbuild full-icu
```

#### Build with no Intl support `:-(`

```sh
./configure --with-intl=none
```

#### Use existing installed ICU (Unix/Macintosh only):

```sh
pkg-config --modversion icu-i18n && ./configure --with-intl=system-icu
```

#### Build ICU from source:
#### Build with a specific ICU:

First: Unpack latest ICU
[icu4c-**##.#**-src.tgz](http://icu-project.org/download) (or `.zip`)
Expand Down
73 changes: 64 additions & 9 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import subprocess
import sys
import urllib
import zipfile
import hashlib

CC = os.environ.get('CC', 'cc')

Expand Down Expand Up @@ -250,7 +251,7 @@ parser.add_option('--with-icu-path',
parser.add_option('--with-intl',
action='store',
dest='with_intl',
help='Intl mode: none, full-icu, small-icu (default is none)')
help='Intl mode: none, full-icu, small-icu (default is small-icu)')

parser.add_option('--with-perfctr',
action='store_true',
Expand Down Expand Up @@ -758,6 +759,57 @@ def icu_download(path):
return None

def configure_intl(o):
class ConfigOpener(urllib.FancyURLopener):
# append to existing version (UA)
version = '%s (node.js/configure)' % urllib.URLopener.version
def icu_download(path):
# download ICU, if needed
icus = [
{
'url': 'http://download.icu-project.org/files/icu4c/54.1/icu4c-54_1-src.zip',
# from https://ssl.icu-project.org/files/icu4c/54.1/icu4c-src-54_1.md5:
'md5': '6b89d60e2f0e140898ae4d7f72323bca',
},
]
def fmtMb(amt):
return "{:.1f}".format(amt / 1024000.)
spin = "\\|/-"
def reporthook(count, size, total):
sys.stdout.write(' ICU: %c %sMB total, %sMB downloaded \r' %
(spin[count%4], fmtMb(total), fmtMb(count*size)))
for icu in icus:
url = icu['url']
md5 = icu['md5']
local = url.split('/')[-1]
targetfile = os.path.join(root_dir, 'deps', local)
if not os.path.isfile(targetfile):
try:
sys.stdout.write(' <%s>\nConnecting...\r' % url)
sys.stdout.flush()
msg = urllib.urlretrieve(url, targetfile, reporthook=reporthook)
print '' # clear the line
except:
print ' ** Error occurred while downloading\n <%s>' % url
raise
else:
print ' Re-using existing %s' % targetfile
if os.path.isfile(targetfile):
digest = hashlib.md5()
count = 0
sys.stdout.write(' Checking file integrity with MD5:\r')
with open(targetfile, 'rb') as f:
chunk = f.read(1024)
while chunk != "":
digest.update(chunk)
chunk = f.read(1024)
gotmd5 = digest.hexdigest()
print ' MD5: %s %s' % (gotmd5, targetfile)
if (md5 == gotmd5):
return targetfile
else:
print ' Expected: %s *MISMATCH*' % md5
print '\n ** Corrupted ZIP? Delete %s to retry download.\n' % targetfile
return None
icu_config = {
'variables': {}
}
Expand Down Expand Up @@ -786,7 +838,7 @@ def configure_intl(o):
return
# --with-intl=<with_intl>
if with_intl is None:
with_intl = 'none' # this is the default 'intl' mode.
with_intl = 'small-icu' # The default mode
if with_intl == 'none' or with_intl is None:
o['variables']['v8_enable_i18n_support'] = 0
return # no Intl
Expand Down Expand Up @@ -825,21 +877,24 @@ def configure_intl(o):
icu_full_path = os.path.join(icu_parent_path, 'icu')
o['variables']['icu_path'] = icu_full_path
if not os.path.isdir(icu_full_path):
print 'ECMA-402 (Intl) needs an ICU in %s' % (icu_full_path)
print '* ECMA-402 (Intl) support didn\'t find ICU in %s..' % (icu_full_path)
# can we download (or find) a zipfile?
localzip = icu_download(icu_full_path)
if localzip:
with zipfile.ZipFile(localzip, 'r') as icuzip:
print 'Extracting ICU source zip: %s' % localzip
print ' Extracting ICU source zip: %s' % localzip
icuzip.extractall(icu_parent_path)
if not os.path.isdir(icu_full_path):
print 'Cannot continue without ICU in %s.' % (icu_full_path)
print ' Cannot build Intl without ICU in %s.' % (icu_full_path)
print ' (Fix, or disable with "--with-intl=none" )'
sys.exit(1)
else:
print '* Using ICU in %s' % (icu_full_path)
# Now, what version of ICU is it? We just need the "major", such as 54.
# uvernum.h contains it as a #define.
uvernum_h = os.path.join(icu_full_path, 'source/common/unicode/uvernum.h')
if not os.path.isfile(uvernum_h):
print 'Error: could not load %s - is ICU installed?' % uvernum_h
print ' Error: could not load %s - is ICU installed?' % uvernum_h
sys.exit(1)
icu_ver_major = None
matchVerExp = r'^\s*#define\s+U_ICU_VERSION_SHORT\s+"([^"]*)".*'
Expand All @@ -849,7 +904,7 @@ def configure_intl(o):
if m:
icu_ver_major = m.group(1)
if not icu_ver_major:
print 'Could not read U_ICU_VERSION_SHORT version from %s' % uvernum_h
print ' Could not read U_ICU_VERSION_SHORT version from %s' % uvernum_h
sys.exit(1)
icu_endianness = sys.byteorder[0]; # TODO(srl295): EBCDIC should be 'e'
o['variables']['icu_ver_major'] = icu_ver_major
Expand All @@ -876,8 +931,8 @@ def configure_intl(o):
# this is the icudt*.dat file which node will be using (platform endianness)
o['variables']['icu_data_file'] = icu_data_file
if not os.path.isfile(icu_data_path):
print 'Error: ICU prebuilt data file %s does not exist.' % icu_data_path
print 'See the README.md.'
print ' Error: ICU prebuilt data file %s does not exist.' % icu_data_path
print ' See the README.md.'
# .. and we're not about to build it from .gyp!
sys.exit(1)
# map from variable name to subdirs
Expand Down

0 comments on commit 957030f

Please sign in to comment.