From dc33dd9b3aa8891f2168d0b577ea89188897991b Mon Sep 17 00:00:00 2001 From: Universebenzene Date: Fri, 29 Oct 2021 20:48:49 +0800 Subject: [PATCH] app-i18n/mozc: Initial commit - add fcitx5 support --- app-i18n/mozc/Manifest | 3 + app-i18n/mozc/files/50mozc-gentoo.el | 4 + .../files/mozc-2.20.2673.102-tests_build.patch | 27 + .../files/mozc-2.20.2673.102-tests_skipping.patch | 70 +++ ...ozc-2.23.2815.102-environmental_variables.patch | 132 +++++ app-i18n/mozc/files/mozc-2.23.2815.102-gcc-8.patch | 22 + .../mozc/files/mozc-2.23.2815.102-python-3_1.patch | 621 +++++++++++++++++++++ .../mozc/files/mozc-2.23.2815.102-python-3_2.patch | 600 ++++++++++++++++++++ .../mozc/files/mozc-2.23.2815.102-python-3_3.patch | 583 +++++++++++++++++++ .../mozc/files/mozc-2.23.2815.102-python-3_4.patch | 537 ++++++++++++++++++ app-i18n/mozc/files/mozc-2.23.2815.102-reiwa.patch | 35 ++ .../mozc-2.23.2815.102-server_path_check.patch | 95 ++++ .../mozc-2.23.2815.102-system_libraries.patch | 274 +++++++++ .../mozc-2.26.4220-environmental_variables.patch | 89 +++ .../files/mozc-2.26.4220-server_path_check.patch | 95 ++++ .../files/mozc-2.26.4220-system_abseil-cpp.patch | 407 ++++++++++++++ .../mozc/files/mozc-2.26.4220-system_gtest.patch | 141 +++++ .../mozc/files/mozc-2.26.4220-system_jsoncpp.patch | 117 ++++ app-i18n/mozc/metadata.xml | 24 + ....26.4220_p20201212102434_p20201219202429.ebuild | 441 +++++++++++++++ app-i18n/mozc/mozc-9999.ebuild | 440 +++++++++++++++ 21 files changed, 4757 insertions(+) create mode 100644 app-i18n/mozc/Manifest create mode 100644 app-i18n/mozc/files/50mozc-gentoo.el create mode 100644 app-i18n/mozc/files/mozc-2.20.2673.102-tests_build.patch create mode 100644 app-i18n/mozc/files/mozc-2.20.2673.102-tests_skipping.patch create mode 100644 app-i18n/mozc/files/mozc-2.23.2815.102-environmental_variables.patch create mode 100644 app-i18n/mozc/files/mozc-2.23.2815.102-gcc-8.patch create mode 100644 app-i18n/mozc/files/mozc-2.23.2815.102-python-3_1.patch create mode 100644 app-i18n/mozc/files/mozc-2.23.2815.102-python-3_2.patch create mode 100644 app-i18n/mozc/files/mozc-2.23.2815.102-python-3_3.patch create mode 100644 app-i18n/mozc/files/mozc-2.23.2815.102-python-3_4.patch create mode 100644 app-i18n/mozc/files/mozc-2.23.2815.102-reiwa.patch create mode 100644 app-i18n/mozc/files/mozc-2.23.2815.102-server_path_check.patch create mode 100644 app-i18n/mozc/files/mozc-2.23.2815.102-system_libraries.patch create mode 100644 app-i18n/mozc/files/mozc-2.26.4220-environmental_variables.patch create mode 100644 app-i18n/mozc/files/mozc-2.26.4220-server_path_check.patch create mode 100644 app-i18n/mozc/files/mozc-2.26.4220-system_abseil-cpp.patch create mode 100644 app-i18n/mozc/files/mozc-2.26.4220-system_gtest.patch create mode 100644 app-i18n/mozc/files/mozc-2.26.4220-system_jsoncpp.patch create mode 100644 app-i18n/mozc/metadata.xml create mode 100644 app-i18n/mozc/mozc-2.26.4220_p20201212102434_p20201219202429.ebuild create mode 100644 app-i18n/mozc/mozc-9999.ebuild diff --git a/app-i18n/mozc/Manifest b/app-i18n/mozc/Manifest new file mode 100644 index 000000000..eb3863c7a --- /dev/null +++ b/app-i18n/mozc/Manifest @@ -0,0 +1,3 @@ +DIST fcitx-mozc-2.26.4220-20201219202429.tar.gz 37174759 BLAKE2B 3f320523103ee7a35a763f6613889e282e8a654db8ef11b5a1168db12611387e300621f015977875ffec3c10c055e36b3cb525a1e8559013f3ac42bc5b0cc296 SHA512 823e64267aa69e4d30dd7408f946a54072994f9a2d68691a3d393b216a15e70fd28bcb24705f9d9f483a2291517c48c5a1aeda893d2315f9a1d9cd352fb3feb2 +DIST japanese-usage-dictionary-20180701040110.tar.gz 71285 BLAKE2B dfad056a1d5061b6764f583da15b9ad60a3c4421cee0430c4665d1c2779a64f9b31473c1746a3e2b9bda5167349432e51dcf7d4d48f75fde9543e9c16ff74c0d SHA512 68b4d3f52dd6cd4f00a8012a870b4f5929519cd69815b1729f3881d1f964802308f4aa101e236824b4c0f832183a9e8097437ed620403f2a652f126e7cdc1eb3 +DIST mozc-2.26.4220-20201212102434.tar.gz 37106063 BLAKE2B 7d3c236809c8feb017f35e3f7a9b024ac34204f483c69913a2d1ae6b771054548f7f81afde35ed3a6887c9f7503584cee0fc646653fc7cde6fd015158de9c3d3 SHA512 9d87947b9b9256a3cc66cb23ab6caf4b6974142090b0d315c101bdc700fd289c259d09cb7f02f5f9e7462f48d652cd2d5b4822a645751fdcaed88b939520c429 diff --git a/app-i18n/mozc/files/50mozc-gentoo.el b/app-i18n/mozc/files/50mozc-gentoo.el new file mode 100644 index 000000000..121c62249 --- /dev/null +++ b/app-i18n/mozc/files/50mozc-gentoo.el @@ -0,0 +1,4 @@ +;;; app-i18n/ibus-mozc site-lisp configuration + +(add-to-list 'load-path "@SITELISP@") +(autoload 'mozc-mode "mozc" nil t) diff --git a/app-i18n/mozc/files/mozc-2.20.2673.102-tests_build.patch b/app-i18n/mozc/files/mozc-2.20.2673.102-tests_build.patch new file mode 100644 index 000000000..b8b447743 --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.20.2673.102-tests_build.patch @@ -0,0 +1,27 @@ +--- /src/net/json_util_test.cc ++++ /src/net/json_util_test.cc +@@ -784,13 +784,13 @@ + for (size_t i = 0; i < arraysize(kNumS32ValueKeys); ++i) { + { + Json::Value json_value; +- json_value[kNumS32ValueKeys[i]] = -2147483649ll; ++ json_value[kNumS32ValueKeys[i]] = static_cast(-2147483649ll); + TestMsg msg; + EXPECT_FALSE(JsonUtil::JsonValueToProtobufMessage(json_value, &msg)); + } + { + Json::Value json_value; +- json_value[kNumS32ValueKeys[i]] = 2147483648ull; ++ json_value[kNumS32ValueKeys[i]] = static_cast(2147483648ull); + TestMsg msg; + EXPECT_FALSE(JsonUtil::JsonValueToProtobufMessage(json_value, &msg)); + } +@@ -805,7 +805,7 @@ + } + { + Json::Value json_value; +- json_value[kNumU32ValueKeys[i]] = 4294967296ull; ++ json_value[kNumU32ValueKeys[i]] = static_cast(4294967296ull); + TestMsg msg; + EXPECT_FALSE(JsonUtil::JsonValueToProtobufMessage(json_value, &msg)); + } diff --git a/app-i18n/mozc/files/mozc-2.20.2673.102-tests_skipping.patch b/app-i18n/mozc/files/mozc-2.20.2673.102-tests_skipping.patch new file mode 100644 index 000000000..28c5486de --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.20.2673.102-tests_skipping.patch @@ -0,0 +1,70 @@ +Disable test leaving mozc_server orphan process. + +--- /src/unix/ibus/mozc_engine_test.cc ++++ /src/unix/ibus/mozc_engine_test.cc +@@ -41,65 +41,5 @@ + namespace mozc { + namespace ibus { + +-class LaunchToolTest : public testing::Test { +- public: +- LaunchToolTest() { +- g_type_init(); +- } +- +- protected: +- virtual void SetUp() { +- mozc_engine_.reset(new MozcEngine()); +- +- mock_ = new client::ClientMock(); +- mock_->ClearFunctionCounter(); +- mozc_engine_->client_.reset(mock_); +- } +- +- virtual void TearDown() { +- mozc_engine_.reset(); +- } +- +- client::ClientMock* mock_; +- unique_ptr mozc_engine_; +- +- private: +- DISALLOW_COPY_AND_ASSIGN(LaunchToolTest); +-}; +- +-TEST_F(LaunchToolTest, LaunchToolTest) { +- commands::Output output; +- +- // Launch config dialog +- mock_->ClearFunctionCounter(); +- mock_->SetBoolFunctionReturn("LaunchToolWithProtoBuf", true); +- output.set_launch_tool_mode(commands::Output::CONFIG_DIALOG); +- EXPECT_TRUE(mozc_engine_->LaunchTool(output)); +- +- // Launch dictionary tool +- mock_->ClearFunctionCounter(); +- mock_->SetBoolFunctionReturn("LaunchToolWithProtoBuf", true); +- output.set_launch_tool_mode(commands::Output::DICTIONARY_TOOL); +- EXPECT_TRUE(mozc_engine_->LaunchTool(output)); +- +- // Launch word register dialog +- mock_->ClearFunctionCounter(); +- mock_->SetBoolFunctionReturn("LaunchToolWithProtoBuf", true); +- output.set_launch_tool_mode(commands::Output::WORD_REGISTER_DIALOG); +- EXPECT_TRUE(mozc_engine_->LaunchTool(output)); +- +- // Launch no tool(means do nothing) +- mock_->ClearFunctionCounter(); +- mock_->SetBoolFunctionReturn("LaunchToolWithProtoBuf", false); +- output.set_launch_tool_mode(commands::Output::NO_TOOL); +- EXPECT_FALSE(mozc_engine_->LaunchTool(output)); +- +- // Something occurring in client::Client::LaunchTool +- mock_->ClearFunctionCounter(); +- mock_->SetBoolFunctionReturn("LaunchToolWithProtoBuf", false); +- output.set_launch_tool_mode(commands::Output::CONFIG_DIALOG); +- EXPECT_FALSE(mozc_engine_->LaunchTool(output)); +-} +- + } // namespace ibus + } // namespace mozc diff --git a/app-i18n/mozc/files/mozc-2.23.2815.102-environmental_variables.patch b/app-i18n/mozc/files/mozc-2.23.2815.102-environmental_variables.patch new file mode 100644 index 000000000..02e522a32 --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.23.2815.102-environmental_variables.patch @@ -0,0 +1,132 @@ +https://github.com/google/mozc/issues/470 + +--- /src/base/system_util.cc ++++ /src/base/system_util.cc +@@ -208,28 +208,39 @@ + dir_ = "/"; + return; + #else // MOZC_USE_PEPPER_FILE_IO ++ const char *configuration_directory_env; + string dir; + + #ifdef OS_WIN +- DCHECK(SUCCEEDED(Singleton::get()->result())); +- dir = Singleton::get()->path(); ++ configuration_directory_env = ::getenv("MOZC_CONFIGURATION_DIRECTORY"); ++ if (configuration_directory_env) { ++ dir = configuration_directory_env; ++ } else { ++ DCHECK(SUCCEEDED(Singleton::get()->result())); ++ dir = Singleton::get()->path(); + #ifdef GOOGLE_JAPANESE_INPUT_BUILD +- dir = FileUtil::JoinPath(dir, kCompanyNameInEnglish); +- FileUtil::CreateDirectory(dir); ++ dir = FileUtil::JoinPath(dir, kCompanyNameInEnglish); ++ FileUtil::CreateDirectory(dir); + #endif // GOOGLE_JAPANESE_INPUT_BUILD +- dir = FileUtil::JoinPath(dir, kProductNameInEnglish); ++ dir = FileUtil::JoinPath(dir, kProductNameInEnglish); ++ } + + #elif defined(OS_MACOSX) +- dir = MacUtil::GetApplicationSupportDirectory(); ++ configuration_directory_env = ::getenv("MOZC_CONFIGURATION_DIRECTORY"); ++ if (configuration_directory_env) { ++ dir = configuration_directory_env; ++ } else { ++ dir = MacUtil::GetApplicationSupportDirectory(); + #ifdef GOOGLE_JAPANESE_INPUT_BUILD +- dir = FileUtil::JoinPath(dir, "Google"); +- // The permission of ~/Library/Application Support/Google seems to be 0755. +- // TODO(komatsu): nice to make a wrapper function. +- ::mkdir(dir.c_str(), 0755); +- dir = FileUtil::JoinPath(dir, "JapaneseInput"); ++ dir = FileUtil::JoinPath(dir, "Google"); ++ // The permission of ~/Library/Application Support/Google seems to be 0755. ++ // TODO(komatsu): nice to make a wrapper function. ++ ::mkdir(dir.c_str(), 0755); ++ dir = FileUtil::JoinPath(dir, "JapaneseInput"); + #else // GOOGLE_JAPANESE_INPUT_BUILD +- dir = FileUtil::JoinPath(dir, "Mozc"); ++ dir = FileUtil::JoinPath(dir, "Mozc"); + #endif // GOOGLE_JAPANESE_INPUT_BUILD ++ } + + #elif defined(OS_ANDROID) + // For android, we do nothing here because user profile directory, +@@ -237,14 +248,24 @@ + // is injected from Java layer. + + #else // !OS_WIN && !OS_MACOSX && !OS_ANDROID +- char buf[1024]; +- struct passwd pw, *ppw; +- const uid_t uid = geteuid(); +- CHECK_EQ(0, getpwuid_r(uid, &pw, buf, sizeof(buf), &ppw)) +- << "Can't get passwd entry for uid " << uid << "."; +- CHECK_LT(0, strlen(pw.pw_dir)) +- << "Home directory for uid " << uid << " is not set."; +- dir = FileUtil::JoinPath(pw.pw_dir, ".mozc"); ++ configuration_directory_env = ::getenv("MOZC_CONFIGURATION_DIRECTORY"); ++ if (configuration_directory_env) { ++ dir = configuration_directory_env; ++ } else { ++ const char *home_env = ::getenv("HOME"); ++ if (home_env) { ++ dir = FileUtil::JoinPath(home_env, ".mozc"); ++ } else { ++ char buf[1024]; ++ struct passwd pw, *ppw; ++ const uid_t uid = geteuid(); ++ CHECK_EQ(0, getpwuid_r(uid, &pw, buf, sizeof(buf), &ppw)) ++ << "Can't get passwd entry for uid " << uid << "."; ++ CHECK_LT(0, strlen(pw.pw_dir)) ++ << "Home directory for uid " << uid << " is not set."; ++ dir = FileUtil::JoinPath(pw.pw_dir, ".mozc"); ++ } ++ } + #endif // !OS_WIN && !OS_MACOSX && !OS_ANDROID + + FileUtil::CreateDirectory(dir); +@@ -356,6 +377,10 @@ + #endif // OS_WIN + + string SystemUtil::GetServerDirectory() { ++ const char *server_directory_env = ::getenv("MOZC_SERVER_DIRECTORY"); ++ if (server_directory_env) { ++ return server_directory_env; ++ } + #ifdef OS_WIN + DCHECK(SUCCEEDED(Singleton::get()->result())); + #if defined(GOOGLE_JAPANESE_INPUT_BUILD) +@@ -409,6 +434,10 @@ + } + + string SystemUtil::GetDocumentDirectory() { ++ const char *documents_directory_env = ::getenv("MOZC_DOCUMENTS_DIRECTORY"); ++ if (documents_directory_env) { ++ return documents_directory_env; ++ } + #if defined(OS_MACOSX) + return GetServerDirectory(); + #elif defined(MOZC_DOCUMENT_DIRECTORY) +--- /src/handwriting/zinnia_handwriting.cc ++++ /src/handwriting/zinnia_handwriting.cc +@@ -31,6 +31,7 @@ + + #include "handwriting/zinnia_handwriting.h" + ++#include + #include + #include + +@@ -48,6 +49,10 @@ + + // static + string ZinniaHandwriting::GetModelFileName() { ++ const char *zinnia_model_file_env = ::getenv("MOZC_ZINNIA_MODEL_FILE"); ++ if (zinnia_model_file_env) { ++ return zinnia_model_file_env; ++ } + #if defined(MOZC_BUILD) + return MOZC_ZINNIA_MODEL_FILE; + #else diff --git a/app-i18n/mozc/files/mozc-2.23.2815.102-gcc-8.patch b/app-i18n/mozc/files/mozc-2.23.2815.102-gcc-8.patch new file mode 100644 index 000000000..07514048e --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.23.2815.102-gcc-8.patch @@ -0,0 +1,22 @@ +https://github.com/google/mozc/issues/441 + +--- /src/prediction/zero_query_dict.h ++++ /src/prediction/zero_query_dict.h +@@ -147,6 +147,17 @@ + return iter; + } + ++ iterator &operator--() { ++ ptr_ -= kTokenByteSize; ++ return *this; ++ } ++ ++ iterator operator--(int) { ++ const iterator tmp(ptr_, string_array_); ++ ptr_ -= kTokenByteSize; ++ return tmp; ++ } ++ + iterator &operator-=(ptrdiff_t n) { + ptr_ -= n * kTokenByteSize; + return *this; diff --git a/app-i18n/mozc/files/mozc-2.23.2815.102-python-3_1.patch b/app-i18n/mozc/files/mozc-2.23.2815.102-python-3_1.patch new file mode 100644 index 000000000..2b9bbd720 --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.23.2815.102-python-3_1.patch @@ -0,0 +1,621 @@ +https://github.com/google/mozc/issues/462 + +--- /src/base/gen_character_set.py ++++ /src/base/gen_character_set.py +@@ -33,7 +33,6 @@ + import itertools + import optparse + import re +-import string + import sys + + +@@ -89,7 +88,8 @@ + @staticmethod + def _LoadTable(filename, column_index, pattern, validater): + result = set() +- for line in open(filename): ++ fh = open(filename) ++ for line in fh: + if line.startswith('#'): + # Skip a comment line. + continue +@@ -100,6 +100,7 @@ + ucs = int(match.group(1), 16) + if validater(ucs): + result.add(ucs) ++ fh.close() + + return result + +@@ -250,7 +251,7 @@ + # (at most) four code points. + bit_list = [] + for _, group in itertools.groupby(enumerate(category_list), +- lambda (codepoint, _): codepoint / 4): ++ lambda x: x[0] // 4): + # Fill bits from LSB to MSB for each group. + bits = 0 + for index, (_, category) in enumerate(group): +@@ -263,7 +264,7 @@ + + # Output the content. Each line would have (at most) 16 bytes. + for _, group in itertools.groupby(enumerate(bit_list), +- lambda (index, _): index / 16): ++ lambda x: x[0] // 16): + line = [' \"'] + for _, bits in group: + line.append('\\x%02X' % bits) +@@ -386,7 +387,7 @@ + # Bitmap lookup. + # TODO(hidehiko): the bitmap has two huge 0-bits ranges. Reduce them. + category_map = [ +- (bits, category) for category, bits in CATEGORY_BITMAP.iteritems()] ++ (bits, category) for category, bits in CATEGORY_BITMAP.items()] + category_map.sort() + + lines.extend([ +@@ -451,7 +452,7 @@ + options.jisx0213file) + category_list = [ + categorizer.GetCategory(codepoint) +- for codepoint in xrange(categorizer.MaxCodePoint() + 1)] ++ for codepoint in range(categorizer.MaxCodePoint() + 1)] + generated_character_set_header = GenerateCharacterSetHeader(category_list) + + # Write the result. +--- /src/base/gen_config_file_stream_data.py ++++ /src/base/gen_config_file_stream_data.py +@@ -58,7 +58,7 @@ + result = [] + result.append(' { "%s", "' % os.path.basename(path)) + with open(path, 'rb') as stream: +- result.extend(r'\x%02X' % ord(byte) for byte in stream.read()) ++ result.extend(r'\x%02X' % byte for byte in stream.read()) + result.append('", %d }' % os.path.getsize(path)) + + return ''.join(result) +@@ -93,8 +93,8 @@ + def main(): + (options, args) = ParseOptions() + if not options.output: +- print >>sys.stderr, ( +- 'usage: gen_config_file_stream_data.py --output=filepath input ...') ++ print('usage: gen_config_file_stream_data.py --output=filepath input ...', ++ file=sys.stderr) + sys.exit(2) + + with open(options.output, 'w') as output: +--- /src/build_mozc.py ++++ /src/build_mozc.py +@@ -943,7 +943,7 @@ + logging.info('running %s...', binary) + try: + test_function(binary, gtest_report_dir, options) +- except RunOrDieError, e: ++ except RunOrDieError as e: + logging.error(e) + failed_tests.append(binary) + else: +@@ -1082,7 +1082,7 @@ + # and '-c' and 'Release' are build options. + targets = [] + build_options = [] +- for i in xrange(len(args)): ++ for i in range(len(args)): + if args[i].startswith('-'): + # starting with build options + build_options = args[i:] +@@ -1190,14 +1190,14 @@ + + def ShowHelpAndExit(): + """Shows the help message.""" +- print 'Usage: build_mozc.py COMMAND [ARGS]' +- print 'Commands: ' +- print ' gyp Generate project files.' +- print ' build Build the specified target.' +- print ' runtests Build all tests and run them.' +- print ' clean Clean all the build files and directories.' +- print '' +- print 'See also the comment in the script for typical usage.' ++ print('Usage: build_mozc.py COMMAND [ARGS]') ++ print('Commands: ') ++ print(' gyp Generate project files.') ++ print(' build Build the specified target.') ++ print(' runtests Build all tests and run them.') ++ print(' clean Clean all the build files and directories.') ++ print('') ++ print('See also the comment in the script for typical usage.') + sys.exit(1) + + +--- /src/build_tools/android_util.py ++++ /src/build_tools/android_util.py +@@ -548,7 +548,7 @@ + (devices_result, _) = process.communicate() + used_ports = set(int(port) for port + in re.findall(r'emulator-(\d+)', devices_result)) +- return [port for port in xrange(5554, 5586, 2) if port not in used_ports] ++ return [port for port in range(5554, 5586, 2) if port not in used_ports] + + + def SetUpTestingSdkHomeDirectory(dest_android_sdk_home, +@@ -575,7 +575,7 @@ + 'create', 'avd', + '--force', + '--sdcard', '512M',] +- for key, value in options.iteritems(): ++ for key, value in options.items(): + args.extend([key, value]) + env = {'ANDROID_SDK_HOME': os.path.abspath(dest_android_sdk_home)} + logging.info('Creating AVD: %s', args) +@@ -615,7 +615,7 @@ + def main(): + for arg in sys.argv[1:]: + for item in sorted(GetApkProperties(arg).items()): +- print '%s: %s' % item ++ print('%s: %s' % item) + + + if __name__ == '__main__': +--- /src/build_tools/binary_size_checker.py ++++ /src/build_tools/binary_size_checker.py +@@ -70,12 +70,12 @@ + actual_size = os.stat(filename).st_size + expected_size = EXPECTED_MAXIMUM_SIZES[basename] + if actual_size < expected_size * 1024 * 1024: +- print 'Pass: %s (size: %d) is smaller than expected (%d MB)' % ( +- filename, actual_size, expected_size) ++ print('Pass: %s (size: %d) is smaller than expected (%d MB)' % ( ++ filename, actual_size, expected_size)) + return True + else: +- print 'WARNING: %s (size: %d) is larger than expected (%d MB)' % ( +- filename, actual_size, expected_size) ++ print('WARNING: %s (size: %d) is larger than expected (%d MB)' % ( ++ filename, actual_size, expected_size)) + return False + + +--- /src/build_tools/build_and_sign_pkg_mac.py ++++ /src/build_tools/build_and_sign_pkg_mac.py +@@ -44,8 +44,8 @@ + import shutil + import sys + +-from util import PrintErrorAndExit +-from util import RunOrDie ++from .util import PrintErrorAndExit ++from .util import RunOrDie + + + def ParseOption(): +--- /src/build_tools/build_breakpad.py ++++ /src/build_tools/build_breakpad.py +@@ -54,9 +54,9 @@ + try: + subprocess.check_output(command) + except subprocess.CalledProcessError as e: +- print e.output ++ print(e.output) + sys.exit(e.returncode) +- print 'Done: %s' % ' '.join(command) ++ print('Done: %s' % ' '.join(command)) + + + def Xcodebuild(projdir, target, arch, sdk, outdir): +--- /src/build_tools/build_diskimage_mac.py ++++ /src/build_tools/build_diskimage_mac.py +@@ -90,7 +90,7 @@ + # setup volume directory + temp_dir = tempfile.mkdtemp() + CopyFile(path.join(build_dir, ".keystone_install"), temp_dir) +- os.chmod(path.join(temp_dir, ".keystone_install"), 0755) # rwxr-xr-x ++ os.chmod(path.join(temp_dir, ".keystone_install"), 0o755) # rwxr-xr-x + for a in args: + CopyFile(path.join(build_dir, a), temp_dir) + +--- /src/build_tools/change_reference_mac.py ++++ /src/build_tools/change_reference_mac.py +@@ -41,8 +41,8 @@ + import optparse + import os + +-from util import PrintErrorAndExit +-from util import RunOrDie ++from .util import PrintErrorAndExit ++from .util import RunOrDie + + + def ParseOption(): +--- /src/build_tools/code_generator_util.py ++++ /src/build_tools/code_generator_util.py +@@ -33,27 +33,26 @@ + __author__ = "hidehiko" + + import struct +-import types + + + def ToCppStringLiteral(s): + """Returns C-style string literal, or NULL if given s is None.""" + if s is None: +- return 'NULL' ++ return b'NULL' + +- if all(0x20 <= ord(c) <= 0x7E for c in s): ++ if all(0x20 <= c <= 0x7E for c in s): + # All characters are in ascii code. +- return '"%s"' % s.replace('\\', r'\\').replace('"', r'\"') ++ return b'"%b"' % s.replace(b'\\', br'\\').replace(b'"', br'\"') + else: + # One or more characters are non-ascii. +- return '"%s"' % ''.join(r'\x%02X' % ord(c) for c in s) ++ return b'"%b"' % b''.join(br'\x%02X' % c for c in s) + + + def FormatWithCppEscape(format_text, *args): + """Returns a string filling format with args.""" + literal_list = [] + for arg in args: +- if isinstance(arg, (types.StringType, types.NoneType)): ++ if isinstance(arg, (bytes, type(None))): + arg = ToCppStringLiteral(arg) + literal_list.append(arg) + +@@ -95,7 +94,7 @@ + if target_compiler and target_compiler.startswith('msvs'): + stream.write('const uint64 k%s_data_wordtype[] = {\n' % variable_name) + +- for word_index in xrange(0, len(data), 8): ++ for word_index in range(0, len(data), 8): + word_chunk = data[word_index:word_index + 8].ljust(8, '\x00') + stream.write('0x%016X, ' % struct.unpack('> sys.stderr, "==========" +- print >> sys.stderr, "COMMAND: " + command +- print >> sys.stderr, output ++ print("==========", file=sys.stderr) ++ print("COMMAND: " + command, file=sys.stderr) ++ print(output, file=sys.stderr) + except subprocess.CalledProcessError as e: +- print >> sys.stderr, "==========" +- print >> sys.stderr, "ERROR: " + command +- print >> sys.stderr, e.output +- print >> sys.stderr, "==========" ++ print("==========", file=sys.stderr) ++ print("ERROR: " + command, file=sys.stderr) ++ print(e.output, file=sys.stderr) ++ print("==========", file=sys.stderr) + sys.exit(1) + + +@@ -119,18 +119,18 @@ + (options, unused_args) = parser.parse_args() + + if not options.target: +- print "Error: --target should be specified." +- print parser.print_help() ++ print("Error: --target should be specified.") ++ print(parser.print_help()) + sys.exit(1) + + return options + + + def DumpEnviron(): +- print "=== os.environ ===" ++ print("=== os.environ ===") + for key in sorted(os.environ): +- print "%s = %s" % (key, os.getenv(key)) +- print "==================" ++ print("%s = %s" % (key, os.getenv(key))) ++ print("==================") + + + def main(): +--- /src/build_tools/copy_dll_and_symbol.py ++++ /src/build_tools/copy_dll_and_symbol.py +@@ -38,7 +38,7 @@ + import os + import shutil + +-from util import PrintErrorAndExit ++from .util import PrintErrorAndExit + + def ParseOption(): + """Parse command line options.""" +@@ -98,7 +98,7 @@ + if _GetLastModifiedTime(src) <= target_file_mtime: + # Older file found. Ignore. + continue +- print 'Copying %s to %s' % (src, target_file_abspath) ++ print('Copying %s to %s' % (src, target_file_abspath)) + shutil.copy2(src, target_file_abspath) + break + +--- /src/build_tools/copy_file.py ++++ /src/build_tools/copy_file.py +@@ -52,7 +52,7 @@ + Args: + message: The error message to be printed to stderr. + """ +- print >>sys.stderr, message ++ print(message, file=sys.stderr) + sys.exit(1) + + +--- /src/build_tools/copy_qt_frameworks_mac.py ++++ /src/build_tools/copy_qt_frameworks_mac.py +@@ -41,9 +41,9 @@ + import optparse + import os + +-from copy_file import CopyFiles +-from util import PrintErrorAndExit +-from util import RunOrDie ++from .copy_file import CopyFiles ++from .util import PrintErrorAndExit ++from .util import RunOrDie + + + def ParseOption(): +--- /src/build_tools/embed_file.py ++++ /src/build_tools/embed_file.py +@@ -46,10 +46,10 @@ + + def _FormatAsUint64LittleEndian(s): + """Formats a string as uint64 value in little endian order.""" +- for _ in xrange(len(s), 8): +- s += '\0' ++ for _ in range(len(s), 8): ++ s += b'\0' + s = s[::-1] # Reverse the string +- return '0x%s' % binascii.b2a_hex(s) ++ return b'0x%b' % binascii.b2a_hex(s) + + + def main(): +@@ -57,30 +57,30 @@ + with open(opts.input, 'rb') as infile: + with open(opts.output, 'wb') as outfile: + outfile.write( +- '#ifdef MOZC_EMBEDDED_FILE_%(name)s\n' +- '#error "%(name)s was already included or defined elsewhere"\n' +- '#else\n' +- '#define MOZC_EMBEDDED_FILE_%(name)s\n' +- 'const uint64 %(name)s_data[] = {\n' +- % {'name': opts.name}) ++ b'#ifdef MOZC_EMBEDDED_FILE_%(name)b\n' ++ b'#error "%(name)b was already included or defined elsewhere"\n' ++ b'#else\n' ++ b'#define MOZC_EMBEDDED_FILE_%(name)b\n' ++ b'const uint64 %(name)b_data[] = {\n' ++ % {b'name': opts.name.encode('utf-8')}) + + while True: + chunk = infile.read(8) + if not chunk: + break +- outfile.write(' ') ++ outfile.write(b' ') + outfile.write(_FormatAsUint64LittleEndian(chunk)) +- outfile.write(',\n') ++ outfile.write(b',\n') + + outfile.write( +- '};\n' +- 'const EmbeddedFile %(name)s = {\n' +- ' %(name)s_data,\n' +- ' %(size)d,\n' +- '};\n' +- '#endif // MOZC_EMBEDDED_FILE_%(name)s\n' +- % {'name': opts.name, +- 'size': os.stat(opts.input).st_size}) ++ b'};\n' ++ b'const EmbeddedFile %(name)b = {\n' ++ b' %(name)b_data,\n' ++ b' %(size)d,\n' ++ b'};\n' ++ b'#endif // MOZC_EMBEDDED_FILE_%(name)b\n' ++ % {b'name': opts.name.encode('utf-8'), ++ b'size': os.stat(opts.input).st_size}) + + + if __name__ == '__main__': +--- /src/build_tools/embed_pathname.py ++++ /src/build_tools/embed_pathname.py +@@ -28,7 +28,7 @@ + # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-"""A script to embed the given (relative) path name to C/C++ characters array. ++r"""A script to embed the given (relative) path name to C/C++ characters array. + + Example: + ./embed_pathname.py --path_to_be_embedded=d:\data\mozc +@@ -53,7 +53,7 @@ + + (options, unused_args) = parser.parse_args() + if not all(vars(options).values()): +- print parser.print_help() ++ print(parser.print_help()) + sys.exit(1) + + return options +@@ -63,7 +63,7 @@ + opt = ParseOption() + path = os.path.abspath(opt.path_to_be_embedded) + # TODO(yukawa): Consider the case of non-ASCII characters. +- escaped_path = path.encode('string-escape') ++ escaped_path = path.replace('\\', '\\\\') + with open(opt.output, 'w') as output_file: + output_file.write( + 'const char %s[] = "%s";\n' % (opt.constant_name, escaped_path)) +--- /src/build_tools/ensure_gyp_module_path.py ++++ /src/build_tools/ensure_gyp_module_path.py +@@ -48,7 +48,7 @@ + + (options, _) = parser.parse_args() + if not options.expected: +- print parser.print_help() ++ print(parser.print_help()) + sys.exit(1) + + return options +@@ -59,20 +59,20 @@ + opt = ParseOption() + expected_path = os.path.abspath(opt.expected) + if not os.path.exists(expected_path): +- print '%s does not exist.' % expected_path ++ print('%s does not exist.' % expected_path) + sys.exit(1) + + try: + import gyp # NOLINT + except ImportError as e: +- print 'import gyp failed: %s' % e ++ print('import gyp failed: %s' % e) + sys.exit(1) + + actual_path = os.path.abspath(gyp.__path__[0]) + if expected_path != actual_path: +- print 'Unexpected gyp module is loaded on this environment.' +- print ' expected: %s' % expected_path +- print ' actual : %s' % actual_path ++ print('Unexpected gyp module is loaded on this environment.') ++ print(' expected: %s' % expected_path) ++ print(' actual : %s' % actual_path) + sys.exit(1) + + if __name__ == '__main__': +--- /src/build_tools/gen_win32_resource_header.py ++++ /src/build_tools/gen_win32_resource_header.py +@@ -39,7 +39,7 @@ + __author__ = "yukawa" + + import logging +-import mozc_version ++from . import mozc_version + import optparse + import os + import sys +--- /src/build_tools/mozc_version.py ++++ /src/build_tools/mozc_version.py +@@ -94,7 +94,7 @@ + last_digit = TARGET_PLATFORM_TO_DIGIT.get(target_platform, None) + if last_digit is None: + logging.critical('target_platform %s is invalid. Accetable ones are %s', +- target_platform, TARGET_PLATFORM_TO_DIGIT.keys()) ++ target_platform, list(TARGET_PLATFORM_TO_DIGIT.keys())) + sys.exit(1) + + if not revision: +@@ -314,13 +314,14 @@ + self._properties = {} + if not os.path.isfile(path): + return +- for line in open(path): +- matchobj = re.match(r'(\w+)=(.*)', line.strip()) +- if matchobj: +- var = matchobj.group(1) +- val = matchobj.group(2) +- if var not in self._properties: +- self._properties[var] = val ++ with open(path) as file: ++ for line in file: ++ matchobj = re.match(r'(\w+)=(.*)', line.strip()) ++ if matchobj: ++ var = matchobj.group(1) ++ val = matchobj.group(2) ++ if var not in self._properties: ++ self._properties[var] = val + + # Check mandatory properties. + for key in VERSION_PROPERTIES: diff --git a/app-i18n/mozc/files/mozc-2.23.2815.102-python-3_2.patch b/app-i18n/mozc/files/mozc-2.23.2815.102-python-3_2.patch new file mode 100644 index 000000000..456e83680 --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.23.2815.102-python-3_2.patch @@ -0,0 +1,600 @@ +https://github.com/google/mozc/issues/462 + +--- /src/build_tools/redirect.py ++++ /src/build_tools/redirect.py +@@ -58,14 +58,15 @@ + process = subprocess.Popen(sys.argv, stdout=subprocess.PIPE, + universal_newlines=True) + except: +- print '==========' +- print ' ERROR: %s' % ' '.join(sys.argv) +- print '==========' ++ print('==========') ++ print(' ERROR: %s' % ' '.join(sys.argv)) ++ print('==========') + raise + (stdout_content, _) = process.communicate() + # Write the stdout content to the output file. + output_file = open(output_file_name, 'w') + output_file.write(stdout_content) ++ output_file.close() + return process.wait() + + if __name__ == '__main__': +--- /src/build_tools/run_after_chdir.py ++++ /src/build_tools/run_after_chdir.py +@@ -57,7 +57,7 @@ + sys.argv.insert(0, sys.executable) # Inject the python interpreter path. + # We don't capture stdout and stderr from Popen. The output will just + # be emitted to a terminal or console. +- print sys.argv ++ print(sys.argv) + sys.exit(subprocess.call(sys.argv)) + + if __name__ == '__main__': +--- /src/build_tools/serialized_string_array_builder.py ++++ /src/build_tools/serialized_string_array_builder.py +@@ -58,11 +58,11 @@ + f.write(struct.pack('>output, '%s.%s:' % (self.name, testcase.name) ++ print('%s.%s:' % (self.name, testcase.name), file=output) + for failure in testcase.failures: +- print >>output, failure.contents.encode('utf-8') ++ print(failure.contents.encode('utf-8'), file=output) + return output.getvalue() + + @classmethod +--- /src/build_tools/test_tools/test_launcher.py ++++ /src/build_tools/test_tools/test_launcher.py +@@ -101,11 +101,11 @@ + time.sleep(1) + try: + shutil.rmtree(self._path) +- except OSError, e: ++ except OSError as e: + logging.error('Failed to remove %s. error: %s', self._path, e) + + +-def _ExecuteTest((command, gtest_report_dir)): ++def _ExecuteTest(args): + """Executes tests with specified Test command. + + Args: +@@ -122,6 +122,7 @@ + module, which is used in multiprocessing module. + (http://docs.python.org/library/pickle.html) + """ ++ (command, gtest_report_dir) = args + binary = command[0] + binary_filename = os.path.basename(binary) + tmp_dir = tempfile.mkdtemp() +--- /src/build_tools/tweak_data.py ++++ /src/build_tools/tweak_data.py +@@ -55,7 +55,7 @@ + The value for the variable if the variable is defined in the + environment. Otherwise original string is returned. + """ +- if environment.has_key(matchobj.group(1)): ++ if matchobj.group(1) in environment: + return environment[matchobj.group(1)] + return matchobj.group(0) + +--- /src/build_tools/tweak_info_plist.py ++++ /src/build_tools/tweak_info_plist.py +@@ -42,8 +42,8 @@ + import logging + import optparse + import sys +-import mozc_version +-import tweak_data ++from . import mozc_version ++from . import tweak_data + + _COPYRIGHT_YEAR = datetime.date.today().year + +@@ -81,7 +81,7 @@ + + version = mozc_version.MozcVersion(options.version_file) + +- copyright_message = (u'© %d Google Inc.' % _COPYRIGHT_YEAR).encode('utf-8') ++ copyright_message = ('© %d Google Inc.' % _COPYRIGHT_YEAR).encode('utf-8') + long_version = version.GetVersionString() + short_version = version.GetVersionInFormat('@MAJOR@.@MINOR@.@BUILD@') + +--- /src/build_tools/tweak_info_plist_strings.py ++++ /src/build_tools/tweak_info_plist_strings.py +@@ -40,7 +40,7 @@ + import logging + import optparse + import sys +-import tweak_data ++from . import tweak_data + + _COPYRIGHT_YEAR = datetime.date.today().year + +@@ -77,7 +77,7 @@ + if options.branding == 'GoogleJapaneseInput': + variables = { + 'CF_BUNDLE_NAME_EN': 'Google Japanese Input', +- 'CF_BUNDLE_NAME_JA': u'Google 日本語入力'.encode('utf-8'), ++ 'CF_BUNDLE_NAME_JA': 'Google 日本語入力'.encode('utf-8'), + 'NS_HUMAN_READABLE_COPYRIGHT': copyright_message, + 'INPUT_MODE_ANNOTATION': 'Google', + } +--- /src/build_tools/tweak_macinstaller_script.py ++++ /src/build_tools/tweak_macinstaller_script.py +@@ -39,7 +39,7 @@ + import logging + import optparse + +-import mozc_version ++from . import mozc_version + + + def _ReplaceVariables(data, environment): +--- /src/build_tools/tweak_pkgproj.py ++++ /src/build_tools/tweak_pkgproj.py +@@ -45,7 +45,7 @@ + import os + import plistlib + import re +-import mozc_version ++from . import mozc_version + + from os import path + +@@ -71,7 +71,7 @@ + The value for the variable if the variable is defined in the + environment. Otherwise original string is returned. + """ +- if environment.has_key(matchobj.group(1)): ++ if matchobj.group(1) in environment: + return environment[matchobj.group(1)] + return matchobj.group(0) + +--- /src/build_tools/util.py ++++ /src/build_tools/util.py +@@ -73,11 +73,11 @@ + return 1 + + +-class RunOrDieError(StandardError): ++class RunOrDieError(Exception): + """The exception class for RunOrDie.""" + + def __init__(self, message): +- StandardError.__init__(self, message) ++ Exception.__init__(self, message) + + + def RunOrDie(argv): +@@ -105,7 +105,7 @@ + return # Do nothing if not exist. + if IsWindows(): + # Read-only files cannot be deleted on Windows. +- os.chmod(file_name, 0700) ++ os.chmod(file_name, 0o700) + logging.debug('Removing file: %s', file_name) + os.unlink(file_name) + +--- /src/build_tools/zlib_util.py ++++ /src/build_tools/zlib_util.py +@@ -58,7 +58,7 @@ + + def main(): + if len(sys.argv) != 4: +- print >>sys.stderr, 'Invalid arguments' ++ print('Invalid arguments', file=sys.stderr) + return + if sys.argv[1] == 'compress': + Compress(sys.argv[2], sys.argv[3]) +@@ -66,7 +66,7 @@ + if sys.argv[1] == 'decompress': + Decompress(sys.argv[2], sys.argv[3]) + return +- print >>sys.stderr, 'Unknown command:', sys.argv[1] ++ print('Unknown command:', sys.argv[1], file=sys.stderr) + + + if __name__ == '__main__': +--- /src/composer/internal/gen_typing_model.py ++++ /src/composer/internal/gen_typing_model.py +@@ -54,14 +54,13 @@ + __author__ = "noriyukit" + + import bisect +-import codecs + import collections + import optparse + import struct + + UNDEFINED_COST = -1 +-MAX_UINT16 = struct.unpack('H', '\xFF\xFF')[0] +-MAX_UINT8 = struct.unpack('B', '\xFF')[0] ++MAX_UINT16 = struct.unpack('H', b'\xFF\xFF')[0] ++MAX_UINT8 = struct.unpack('B', b'\xFF')[0] + + + def ParseArgs(): +@@ -113,7 +112,7 @@ + sorted_values = list(sorted(set(values))) + mapping_table = sorted_values[0] + mapping_table_size_without_special_value = mapping_table_size - 1 +- span = len(sorted_values) / (mapping_table_size_without_special_value - 1) ++ span = len(sorted_values) // (mapping_table_size_without_special_value - 1) + mapping_table = [sorted_values[i * span] + for i + in range(0, mapping_table_size_without_special_value - 1)] +@@ -150,7 +149,7 @@ + + def GetValueTable(unique_characters, mapping_table, dictionary): + result = [] +- for key, value in dictionary.iteritems(): ++ for key, value in dictionary.items(): + index = GetIndexFromKey(unique_characters, key) + while len(result) <= index: + result.append(len(mapping_table) - 1) +@@ -167,13 +166,13 @@ + romaji_transition_cost) + with open(output_path, 'wb') as f: + f.write(struct.pack('= %s && %s <= %s)" % (name, r[0], name, r[1])) + + if len(tmp) == 0: +- print "FATAL: No rule fiind %s" % (pattern) ++ print("FATAL: No rule fiind %s" % (pattern)) + sys.exit(-1) + + return " || ".join(tmp) +@@ -115,19 +118,21 @@ + def main(): + pos = ReadPOSID(sys.argv[1], sys.argv[2]) + +- print HEADER % (len(pos.keys()), len(pos.keys())) ++ print(HEADER % (len(pos.keys()), len(pos.keys()))) + +- for line in open(sys.argv[3], "r"): ++ fh = open(sys.argv[3], "r") ++ for line in fh: + if len(line) <= 1 or line[0] == '#': + continue + (l, r, result) = line.split() + result = result.lower() + lcond = GetRange(pos, l, "rid") or "true"; + rcond = GetRange(pos, r, "lid") or "true"; +- print " // %s %s %s" % (l, r, result) +- print " if ((%s) && (%s)) { return %s; }" % (lcond, rcond, result) ++ print(" // %s %s %s" % (l, r, result)) ++ print(" if ((%s) && (%s)) { return %s; }" % (lcond, rcond, result)) ++ fh.close() + +- print FOOTER ++ print(FOOTER) + + if __name__ == "__main__": + main() +--- /src/data_manager/gen_connection_data.py ++++ /src/data_manager/gen_connection_data.py +@@ -32,8 +32,7 @@ + + __author__ = "hidehiko" + +-import cStringIO as StringIO +-import itertools ++import io + import logging + import optparse + import os +@@ -45,7 +44,7 @@ + INVALID_COST = 30000 + INVALID_1BYTE_COST = 255 + RESOLUTION_FOR_1BYTE = 64 +-FILE_MAGIC = '\xAB\xCD' ++FILE_MAGIC = b'\xAB\xCD' + + FALSE_VALUES = ['f', 'false', '0'] + TRUE_VALUES = ['t', 'true', '1'] +@@ -79,28 +78,28 @@ + # The result is a square matrix. + mat_size = pos_size + special_pos_size + +- matrix = [[0] * mat_size for _ in xrange(mat_size)] ++ matrix = [[0] * mat_size for _ in range(mat_size)] + with open(text_connection_file) as stream: + stream = code_generator_util.SkipLineComment(stream) + # The first line contains the matrix column/row size. +- size = stream.next().rstrip() ++ size = next(stream).rstrip() + assert (int(size) == pos_size), '%s != %d' % (size, pos_size) + + for array_index, cost in enumerate(stream): + cost = int(cost.rstrip()) +- rid = array_index / pos_size ++ rid = array_index // pos_size + lid = array_index % pos_size + if rid == 0 and lid == 0: + cost = 0 + matrix[rid][lid] = cost + + # Fill INVALID_COST in matrix elements for special POS. +- for rid in xrange(pos_size, mat_size): +- for lid in xrange(1, mat_size): # Skip EOS ++ for rid in range(pos_size, mat_size): ++ for lid in range(1, mat_size): # Skip EOS + matrix[rid][lid] = INVALID_COST + +- for lid in xrange(pos_size, mat_size): +- for rid in xrange(1, mat_size): # Skip BOS ++ for lid in range(pos_size, mat_size): ++ for rid in range(1, mat_size): # Skip BOS + matrix[rid][lid] = INVALID_COST + + return matrix +@@ -116,7 +115,7 @@ + # Heuristically, we do not compress INVALID_COST. + continue + m[cost] = m.get(cost, 0) + 1 +- mode_value = max(m.iteritems(), key=lambda (_, count): count)[0] ++ mode_value = max(m.items(), key=lambda x: x[1])[0] + result.append(mode_value) + return result + +@@ -126,8 +125,8 @@ + # list, and fill None into the matrix if it equals to the corresponding + # mode value. + assert len(matrix) == len(mode_value_list) +- for row, mode_value in itertools.izip(matrix, mode_value_list): +- for index in xrange(len(row)): ++ for row, mode_value in zip(matrix, mode_value_list): ++ for index in range(len(row)): + if row[index] == mode_value: + row[index] = None + +@@ -179,7 +178,7 @@ + resolution = RESOLUTION_FOR_1BYTE + else: + resolution = 1 +- stream = StringIO.StringIO() ++ stream = io.BytesIO() + + # Output header. + stream.write(FILE_MAGIC) +@@ -194,7 +193,7 @@ + + # 4 bytes alignment. + if len(mode_value_list) % 2: +- stream.write('\x00\x00') ++ stream.write(b'\x00\x00') + + # Process each row: + for row in matrix: +@@ -218,7 +217,7 @@ + if cost == INVALID_COST: + cost = INVALID_1BYTE_COST + else: +- cost /= resolution ++ cost //= resolution + assert cost != INVALID_1BYTE_COST + values.append(cost) + +@@ -237,7 +236,7 @@ + values_size = len(values) * 2 + + # Output the bits for a row. +- stream.write(struct.pack('(-1)') ++ b'static_cast< ::mozc::user_dictionary::UserDictionary::PosType>(-1)') + else: +- value = '::mozc::user_dictionary::UserDictionary::' + value +- output.write(' { %s, %s },\n' % (key, value)) ++ value = b'::mozc::user_dictionary::UserDictionary::' + value ++ output.write(b' { %s, %s },\n' % (key, value)) + output.write(FOOTER) + + +@@ -121,7 +121,7 @@ + pos_map = GeneratePosMap(options.third_party_pos_map_file, + options.user_pos_file) + +- with open(options.output, 'w') as stream: ++ with open(options.output, 'wb') as stream: + OutputPosMap(pos_map, stream) + + +--- /src/dictionary/gen_pos_rewrite_rule.py ++++ /src/dictionary/gen_pos_rewrite_rule.py +@@ -46,29 +46,34 @@ + + + def LoadRewriteMapRule(filename): +- fh = open(filename) ++ fh = open(filename, 'rb') + rule = [] + for line in fh: +- line = line.rstrip('\n') +- if not line or line.startswith('#'): ++ line = line.rstrip(b'\n') ++ if not line or line.startswith(b'#'): + continue + fields = line.split() + rule.append([fields[0], fields[1]]) ++ fh.close() + return rule + + + def ReadPOSID(id_file, special_pos_file): + pos_list = [] + +- for line in open(id_file, 'r'): ++ fh = open(id_file, 'rb') ++ for line in fh: + fields = line.split() + pos_list.append(fields[1]) ++ fh.close() + +- for line in open(special_pos_file, 'r'): +- if len(line) <= 1 or line[0] == '#': ++ fh = open(special_pos_file, 'rb') ++ for line in fh: ++ if len(line) <= 1 or line[0:1] == b'#': + continue + fields = line.split() + pos_list.append(fields[0]) ++ fh.close() + + return pos_list + +@@ -112,7 +117,7 @@ + ids.append(id) + + with open(opts.output, 'wb') as f: +- f.write(''.join(chr(id) for id in ids)) ++ f.write(''.join(chr(id) for id in ids).encode('utf-8')) + + + if __name__ == '__main__': +--- /src/dictionary/gen_suffix_data.py ++++ /src/dictionary/gen_suffix_data.py +@@ -52,10 +52,10 @@ + opts = _ParseOptions() + + result = [] +- with open(opts.input, 'r') as stream: ++ with open(opts.input, 'rb') as stream: + for line in stream: +- line = line.rstrip('\r\n') +- fields = line.split('\t') ++ line = line.rstrip(b'\r\n') ++ fields = line.split(b'\t') + key = fields[0] + lid = int(fields[1]) + rid = int(fields[2]) +@@ -63,7 +63,7 @@ + value = fields[4] + + if key == value: +- value = '' ++ value = b'' + + result.append((key, value, lid, rid, cost)) + +--- /src/dictionary/gen_user_pos_data.py ++++ /src/dictionary/gen_user_pos_data.py +@@ -64,7 +64,7 @@ + f.write(struct.pack(' XX町YY and (XX町)ZZ + # YY、ZZ + # -> YY and ZZ +- chou_match = re.match(u'(.*町)?(.*)', level3, re.U) ++ chou_match = re.match('(.*町)?(.*)', level3, re.U) + if chou_match: +- chou = u'' ++ chou = '' + if chou_match.group(1): + chou = chou_match.group(1) + rests = chou_match.group(2) +- return [chou + rest for rest in rests.split(u'、')] ++ return [chou + rest for rest in rests.split('、')] + + return [level3] + + + def CanParseAddress(address): + """Return true for valid address.""" +- return (address.find(u'(') == -1 or +- address.find(u')') != -1) ++ return (address.find('(') == -1 or ++ address.find(')') != -1) + + + def ParseOptions(): +--- /src/dictionary/zip_code_util.py ++++ /src/dictionary/zip_code_util.py +@@ -86,11 +86,11 @@ + + + _SPECIAL_CASES = [ +- SpecialMergeZip(u'5900111', u'大阪府', u'堺市中区', [u'三原台']), +- SpecialMergeZip(u'8710046', u'大分県', u'中津市', +- [u'金谷', u'西堀端', u'東堀端', u'古金谷']), +- SpecialMergeZip(u'9218046', u'石川県', u'金沢市', +- [u'大桑町', u'三小牛町']), ++ SpecialMergeZip('5900111', '大阪府', '堺市中区', ['三原台']), ++ SpecialMergeZip('8710046', '大分県', '中津市', ++ ['金谷', '西堀端', '東堀端', '古金谷']), ++ SpecialMergeZip('9218046', '石川県', '金沢市', ++ ['大桑町', '三小牛町']), + ] + + +--- /src/gui/character_pad/data/gen_cp932_map.py ++++ /src/gui/character_pad/data/gen_cp932_map.py +@@ -32,7 +32,6 @@ + + import re + import sys +-import string + + kUnicodePat = re.compile(r'0x[0-9A-Fa-f]{2,4}') + def IsValidUnicode(n): +@@ -42,28 +41,29 @@ + fh = open(sys.argv[1]) + result = {} + for line in fh.readlines(): +- if line[0] is '#': ++ if line[0] == '#': + continue +- array = string.split(line) ++ array = line.split() + sjis = array[0] + ucs2 = array[1] + if eval(sjis) < 32 or not IsValidUnicode(ucs2): + continue + result.setdefault(ucs2, sjis) ++ fh.close() + + keys = sorted(result.keys()) + +- print "struct CP932MapData {" +- print " unsigned int ucs4;" +- print " unsigned short int sjis;" +- print "};" +- print "" +- print "static const size_t kCP932MapDataSize = %d;" % (len(keys)) +- print "static const CP932MapData kCP932MapData[] = {" ++ print("struct CP932MapData {") ++ print(" unsigned int ucs4;") ++ print(" unsigned short int sjis;") ++ print("};") ++ print("") ++ print("static const size_t kCP932MapDataSize = %d;" % (len(keys))) ++ print("static const CP932MapData kCP932MapData[] = {") + for n in keys: +- print " { %s, %s }," % (n ,result[n]) +- print " { 0, 0 }"; +- print "};" ++ print(" { %s, %s }," % (n ,result[n])) ++ print(" { 0, 0 }"); ++ print("};") + + if __name__ == "__main__": + main() +--- /src/gui/character_pad/data/gen_local_character_map.py ++++ /src/gui/character_pad/data/gen_local_character_map.py +@@ -30,7 +30,6 @@ + + __author__ = "taku" + +-import string + import re + import sys + +@@ -43,9 +42,9 @@ + fh = open(filename) + result = [] + for line in fh.readlines(): +- if line[0] is '#': ++ if line[0] == '#': + continue +- array = string.split(line) ++ array = line.split() + jis = array[0].replace('0x', '') + ucs2 = array[1].replace('0x', '') + if len(jis) == 2: +@@ -53,6 +52,7 @@ + + if IsValidUnicode(ucs2): + result.append([jis, ucs2]) ++ fh.close() + + return ["JISX0201", result] + +@@ -60,13 +60,14 @@ + fh = open(filename) + result = [] + for line in fh.readlines(): +- if line[0] is '#': ++ if line[0] == '#': + continue + array = line.split() + jis = array[1].replace('0x', '') + ucs2 = array[2].replace('0x', '') + if IsValidUnicode(ucs2): + result.append([jis, ucs2]) ++ fh.close() + + return ["JISX0208", result] + +@@ -74,13 +75,14 @@ + fh = open(filename) + result = [] + for line in fh.readlines(): +- if line[0] is '#': ++ if line[0] == '#': + continue + array = line.split() + jis = array[0].replace('0x', '') + ucs2 = array[1].replace('0x', '') + if IsValidUnicode(ucs2): + result.append([jis, ucs2]) ++ fh.close() + + return ["JISX0212", result] + +@@ -88,7 +90,7 @@ + fh = open(filename) + result = [] + for line in fh.readlines(): +- if line[0] is '#': ++ if line[0] == '#': + continue + array = line.split() + sjis = array[0].replace('0x', '') +@@ -100,19 +102,20 @@ + + if IsValidUnicode(ucs2): + result.append([sjis, ucs2]) ++ fh.close() + + return ["CP932", result] + + def Output(arg): + name = arg[0] + result = arg[1] +- print "static const size_t k%sMapSize = %d;" % (name, len(result)) +- print "static const mozc::gui::CharacterPalette::LocalCharacterMap k%sMap[] = {" % (name) ++ print("static const size_t k%sMapSize = %d;" % (name, len(result))) ++ print("static const mozc::gui::CharacterPalette::LocalCharacterMap k%sMap[] = {" % (name)) + for n in result: +- print " { 0x%s, 0x%s }," % (n[0] ,n[1]) +- print " { 0, 0 }"; +- print "};" +- print "" ++ print(" { 0x%s, 0x%s }," % (n[0] ,n[1])) ++ print(" { 0, 0 }"); ++ print("};") ++ print("") + + if __name__ == "__main__": + Output(LoadJISX0201(sys.argv[1])) +--- /src/gui/character_pad/data/gen_unicode_blocks.py ++++ /src/gui/character_pad/data/gen_unicode_blocks.py +@@ -33,13 +33,13 @@ + import sys + import re + +-re = re.compile('^(.....?)\.\.(.....?); (.+)') ++re = re.compile(r'^(.....?)\.\.(.....?); (.+)') + + def main(): +- print "static const mozc::gui::CharacterPalette::UnicodeBlock kUnicodeBlockTable[] = {" ++ print("static const mozc::gui::CharacterPalette::UnicodeBlock kUnicodeBlockTable[] = {") + fh = open(sys.argv[1]) + for line in fh.readlines(): +- if line[0] is '#': ++ if line[0] == '#': + continue + m = re.match(line) + if m is not None: +@@ -47,11 +47,12 @@ + end = int(m.group(2), 16) + name = m.group(3) + if start <= 0x2FFFF and end <= 0x2FFFF: +- print " { \"%s\", { %d, %d } }," % (name, start, end) ++ print(" { \"%s\", { %d, %d } }," % (name, start, end)) ++ fh.close() + +- print " { NULL, { 0, 0 } }" +- print "};" +- print "" ++ print(" { NULL, { 0, 0 } }") ++ print("};") ++ print("") + + if __name__ == "__main__": + main() +--- /src/gui/character_pad/data/gen_unicode_data.py ++++ /src/gui/character_pad/data/gen_unicode_data.py +@@ -46,18 +46,19 @@ + code = int(code, 16) + if code < 0x2FFFF: + results.append(" { %d, \"%s\" }," % (code, desc)) ++ fh.close() + +- print "struct UnicodeData {"; +- print " char32 ucs4;"; +- print " const char *description;"; +- print "};"; +- print "" +- print "static const size_t kUnicodeDataSize = %d;" % (len(results)) +- print "static const UnicodeData kUnicodeData[] = {"; ++ print("struct UnicodeData {"); ++ print(" char32 ucs4;"); ++ print(" const char *description;"); ++ print("};"); ++ print("") ++ print("static const size_t kUnicodeDataSize = %d;" % (len(results))) ++ print("static const UnicodeData kUnicodeData[] = {"); + for line in results: +- print line; +- print " { 0, NULL }"; +- print "};"; ++ print(line); ++ print(" { 0, NULL }"); ++ print("};"); + + if __name__ == "__main__": + main() +--- /src/gui/character_pad/data/gen_unihan_data.py ++++ /src/gui/character_pad/data/gen_unihan_data.py +@@ -31,35 +31,34 @@ + __author__ = "taku" + + import re +-import string + import sys + rs = {} + + def Escape(n): +- if n is not "NULL": ++ if n != "NULL": + return "\"%s\"" % (n) + else: + return "NULL" + + def GetCode(n): +- if n is not "NULL": +- n = string.replace(n, '0-', 'JIS X 0208: 0x') +- n = string.replace(n, '1-', 'JIS X 0212: 0x') +- n = string.replace(n, '3-', 'JIS X 0213: 0x') +- n = string.replace(n, '4-', 'JIS X 0213: 0x') +- n = string.replace(n, 'A-', 'Vendors Ideographs: 0x') +- n = string.replace(n, '3A', 'JIS X 0213 2000: 0x') ++ if n != "NULL": ++ n = n.replace('0-', 'JIS X 0208: 0x') ++ n = n.replace('1-', 'JIS X 0212: 0x') ++ n = n.replace('3-', 'JIS X 0213: 0x') ++ n = n.replace('4-', 'JIS X 0213: 0x') ++ n = n.replace('A-', 'Vendors Ideographs: 0x') ++ n = n.replace('3A', 'JIS X 0213 2000: 0x') + return "\"%s\"" % n + else: + return "NULL" + + def GetRadical(n): + pat = re.compile(r'^(\d+)\.') +- if n is not "NULL": ++ if n != "NULL": + m = pat.match(n) + if m: + result = rs[m.group(1)] +- return "\"%s\"" % (result.encode('string_escape')) ++ return "\"%s\"" % result + else: + return "NULL" + else: +@@ -73,6 +72,7 @@ + id = array[1] + radical = array[2] + rs[id] = radical ++ fh.close() + + dic = {} + pat = re.compile(r'^U\+(\S+)\s+(kTotalStrokes|kJapaneseKun|kJapaneseOn|kRSUnicode|kIRG_JSource)\t(.+)') +@@ -86,23 +86,24 @@ + n = int(m.group(1), 16) + if n <= 65536: + dic.setdefault(key, {}).setdefault(field, value) ++ fh.close() + + keys = sorted(dic.keys()) + +- print "struct UnihanData {"; +- print " unsigned int ucs4;"; ++ print("struct UnihanData {"); ++ print(" unsigned int ucs4;"); + # Since the total strokes defined in Unihan data is Chinese-based + # number, we can't use it. + # print " unsigned char total_strokes;"; +- print " const char *japanese_kun;"; +- print " const char *japanese_on;"; ++ print(" const char *japanese_kun;"); ++ print(" const char *japanese_on;"); + # Since the radical information defined in Unihan data is Chinese-based + # number, we can't use it. + # print " const char *radical;"; +- print " const char *IRG_jsource;"; +- print "};" +- print "static const size_t kUnihanDataSize = %d;" % (len(keys)) +- print "static const UnihanData kUnihanData[] = {" ++ print(" const char *IRG_jsource;"); ++ print("};") ++ print("static const size_t kUnihanDataSize = %d;" % (len(keys))) ++ print("static const UnihanData kUnihanData[] = {") + + for key in keys: + total_strokes = dic[key].get("kTotalStrokes", "0") +@@ -111,9 +112,9 @@ + rad = GetRadical(dic[key].get("kRSUnicode", "NULL")) + code = GetCode(dic[key].get("kIRG_JSource", "NULL")) + # print " { 0x%s, %s, %s, %s, %s, %s }," % (key, total_strokes, kun, on, rad, code) +- print " { 0x%s, %s, %s, %s }," % (key, kun, on, code) ++ print(" { 0x%s, %s, %s, %s }," % (key, kun, on, code)) + +- print "};" ++ print("};") + + if __name__ == "__main__": + main() diff --git a/app-i18n/mozc/files/mozc-2.23.2815.102-python-3_4.patch b/app-i18n/mozc/files/mozc-2.23.2815.102-python-3_4.patch new file mode 100644 index 000000000..41d2bf9ee --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.23.2815.102-python-3_4.patch @@ -0,0 +1,537 @@ +https://github.com/google/mozc/issues/462 + +--- /src/prediction/gen_zero_query_data.py ++++ /src/prediction/gen_zero_query_data.py +@@ -59,20 +59,20 @@ + Returns: + A integer indicating parsed pua. + """ +- if not s or s[0] == '>': ++ if not s or s[0:1] == b'>': + return 0 + return int(s, 16) + + + def NormalizeString(string): + return unicodedata.normalize( +- 'NFKC', string.decode('utf-8')).encode('utf-8').replace('~', '〜') ++ 'NFKC', string.decode('utf-8')).replace('~', '〜').encode('utf-8') + + + def RemoveTrailingNumber(string): + if not string: +- return '' +- return re.sub(r'^([^0-9]+)[0-9]+$', r'\1', string) ++ return b'' ++ return re.sub(br'^([^0-9]+)[0-9]+$', r'\1', string) + + + def GetReadingsFromDescription(description): +@@ -84,19 +84,19 @@ + # - ビル・建物 + # \xE3\x83\xBB : "・" + return [RemoveTrailingNumber(token) for token +- in re.split(r'(?:\(|\)|/|\xE3\x83\xBB)+', normalized)] ++ in re.split(br'(?:\(|\)|/|\xE3\x83\xBB)+', normalized)] + + + def ReadEmojiTsv(stream): + """Reads emoji data from stream and returns zero query data.""" + zero_query_dict = defaultdict(list) + stream = code_generator_util.SkipLineComment(stream) +- for columns in code_generator_util.ParseColumnStream(stream, delimiter='\t'): ++ for columns in code_generator_util.ParseColumnStream(stream, delimiter=b'\t'): + if len(columns) != 13: +- logging.critical('format error: %s', '\t'.join(columns)) ++ logging.critical('format error: %s', b'\t'.join(columns)) + sys.exit(1) + +- code_points = columns[0].split(' ') ++ code_points = columns[0].split(b' ') + + # Emoji code point. + emoji = columns[1] +@@ -114,12 +114,12 @@ + # - Composite emoji which has multiple code point. + # NOTE: Some Unicode 6.0 emoji don't have PUA, and it is also omitted. + # TODO(hsumita): Check the availability of such emoji and enable it. +- logging.info('Skip %s', ' '.join(code_points)) ++ logging.info('Skip %s', b' '.join(code_points)) + continue + + reading_list = [] + # \xe3\x80\x80 is a full-width space +- for reading in re.split(r'(?: |\xe3\x80\x80)+', NormalizeString(readings)): ++ for reading in re.split(br'(?: |\xe3\x80\x80)+', NormalizeString(readings)): + if not reading: + continue + reading_list.append(reading) +@@ -158,15 +158,15 @@ + zero_query_dict = defaultdict(list) + + for line in input_stream: +- if line.startswith('#'): ++ if line.startswith(b'#'): + continue +- line = line.rstrip('\r\n') ++ line = line.rstrip(b'\r\n') + if not line: + continue + +- tokens = line.split('\t') ++ tokens = line.split(b'\t') + key = tokens[0] +- values = tokens[1].split(',') ++ values = tokens[1].split(b',') + + for value in values: + zero_query_dict[key].append( +@@ -179,16 +179,16 @@ + """Reads emoticon data from stream and returns zero query data.""" + zero_query_dict = defaultdict(list) + stream = code_generator_util.SkipLineComment(stream) +- for columns in code_generator_util.ParseColumnStream(stream, delimiter='\t'): ++ for columns in code_generator_util.ParseColumnStream(stream, delimiter=b'\t'): + if len(columns) != 3: +- logging.critical('format error: %s', '\t'.join(columns)) ++ logging.critical('format error: %s', b'\t'.join(columns)) + sys.exit(1) + + emoticon = columns[0] + readings = columns[2] + + # \xe3\x80\x80 is a full-width space +- for reading in re.split(r'(?: |\xe3\x80\x80)+', readings.strip()): ++ for reading in re.split(br'(?: |\xe3\x80\x80)+', readings.strip()): + if not reading: + continue + zero_query_dict[reading].append( +@@ -202,9 +202,9 @@ + """Reads emoji data from stream and returns zero query data.""" + zero_query_dict = defaultdict(list) + stream = code_generator_util.SkipLineComment(stream) +- for columns in code_generator_util.ParseColumnStream(stream, delimiter='\t'): ++ for columns in code_generator_util.ParseColumnStream(stream, delimiter=b'\t'): + if len(columns) < 3: +- logging.warning('format error: %s', '\t'.join(columns)) ++ logging.warning('format error: %s', b'\t'.join(columns)) + continue + + symbol = columns[1] +@@ -222,7 +222,7 @@ + continue + + # \xe3\x80\x80 is a full-width space +- for reading in re.split(r'(?: |\xe3\x80\x80)+', readings.strip()): ++ for reading in re.split(br'(?: |\xe3\x80\x80)+', readings.strip()): + if not reading: + continue + zero_query_dict[reading].append( +@@ -247,7 +247,7 @@ + + def IsValidKeyForZeroQuery(key): + """Returns if the key is valid for zero query trigger.""" +- is_ascii = all(ord(char) < 128 for char in key) ++ is_ascii = all(char < 128 for char in key) + return not is_ascii + + +@@ -301,13 +301,13 @@ + + def main(): + options = ParseOptions() +- with open(options.input_rule, 'r') as input_stream: ++ with open(options.input_rule, 'rb') as input_stream: + zero_query_rule_dict = ReadZeroQueryRuleData(input_stream) +- with open(options.input_symbol, 'r') as input_stream: ++ with open(options.input_symbol, 'rb') as input_stream: + zero_query_symbol_dict = ReadSymbolTsv(input_stream) +- with open(options.input_emoji, 'r') as input_stream: ++ with open(options.input_emoji, 'rb') as input_stream: + zero_query_emoji_dict = ReadEmojiTsv(input_stream) +- with open(options.input_emoticon, 'r') as input_stream: ++ with open(options.input_emoticon, 'rb') as input_stream: + zero_query_emoticon_dict = ReadEmoticonTsv(input_stream) + + merged_zero_query_dict = MergeZeroQueryData( +--- /src/prediction/gen_zero_query_number_data.py ++++ /src/prediction/gen_zero_query_number_data.py +@@ -41,15 +41,15 @@ + zero_query_dict = defaultdict(list) + + for line in input_stream: +- if line.startswith('#'): ++ if line.startswith(b'#'): + continue +- line = line.rstrip('\r\n') ++ line = line.rstrip(b'\r\n') + if not line: + continue + +- tokens = line.split('\t') ++ tokens = line.split(b'\t') + key = tokens[0] +- values = tokens[1].split(',') ++ values = tokens[1].split(b',') + + for value in values: + zero_query_dict[key].append( +@@ -71,7 +71,7 @@ + + def main(): + options = ParseOption() +- with open(options.input, 'r') as input_stream: ++ with open(options.input, 'rb') as input_stream: + zero_query_dict = ReadZeroQueryNumberData(input_stream) + util.WriteZeroQueryData(zero_query_dict, + options.output_token_array, +--- /src/prediction/gen_zero_query_util.py ++++ /src/prediction/gen_zero_query_util.py +@@ -69,7 +69,7 @@ + output_string_array): + # Collect all the strings and assing index in ascending order + string_index = {} +- for key, entry_list in zero_query_dict.iteritems(): ++ for key, entry_list in zero_query_dict.items(): + string_index[key] = 0 + for entry in entry_list: + string_index[entry.value] = 0 +--- /src/rewriter/gen_counter_suffix_array.py ++++ /src/rewriter/gen_counter_suffix_array.py +@@ -43,7 +43,7 @@ + with codecs.open(id_file, 'r', encoding='utf-8') as stream: + stream = code_generator_util.ParseColumnStream(stream, num_column=2) + for pos_id, pos_name in stream: +- if pos_name.startswith(u'名詞,接尾,助数詞'): ++ if pos_name.startswith('名詞,接尾,助数詞'): + pos_ids.add(pos_id) + return pos_ids + +--- /src/rewriter/gen_emoji_rewriter_data.py ++++ /src/rewriter/gen_emoji_rewriter_data.py +@@ -74,19 +74,19 @@ + the glyph (in other words, it has alternative (primary) code point, which + doesn't lead '>' and that's why we'll ignore it). + """ +- if not s or s[0] == '>': ++ if not s or s[0:1] == b'>': + return None + return int(s, 16) + + +-_FULLWIDTH_RE = re.compile(ur'[!-~]') # U+FF01 - U+FF5E ++_FULLWIDTH_RE = re.compile(r'[!-~]') # U+FF01 - U+FF5E + + + def NormalizeString(string): + """Normalize full width ascii characters to half width characters.""" +- offset = ord(u'A') - ord(u'A') +- return _FULLWIDTH_RE.sub(lambda x: unichr(ord(x.group(0)) - offset), +- unicode(string, 'utf-8')).encode('utf-8') ++ offset = ord('A') - ord('A') ++ return _FULLWIDTH_RE.sub(lambda x: chr(ord(x.group(0)) - offset), ++ string.decode('utf-8')).encode('utf-8') + + + def ReadEmojiTsv(stream): +@@ -96,14 +96,14 @@ + token_dict = defaultdict(list) + + stream = code_generator_util.SkipLineComment(stream) +- for columns in code_generator_util.ParseColumnStream(stream, delimiter='\t'): ++ for columns in code_generator_util.ParseColumnStream(stream, delimiter=b'\t'): + if len(columns) != 13: +- logging.critical('format error: %s', '\t'.join(columns)) ++ logging.critical('format error: %s', b'\t'.join(columns)) + sys.exit(1) + +- code_points = columns[0].split(' ') ++ code_points = columns[0].split(b' ') + # Emoji code point. +- emoji = columns[1] if columns[1] else '' ++ emoji = columns[1] if columns[1] else b'' + android_pua = ParseCodePoint(columns[2]) + docomo_pua = ParseCodePoint(columns[3]) + softbank_pua = ParseCodePoint(columns[4]) +@@ -112,10 +112,10 @@ + readings = columns[6] + + # [7]: Name defined in Unicode. It is ignored in current implementation. +- utf8_description = columns[8] if columns[8] else '' +- docomo_description = columns[9] if columns[9] else '' +- softbank_description = columns[10] if columns[10] else '' +- kddi_description = columns[11] if columns[11] else '' ++ utf8_description = columns[8] if columns[8] else b'' ++ docomo_description = columns[9] if columns[9] else b'' ++ softbank_description = columns[10] if columns[10] else b'' ++ kddi_description = columns[11] if columns[11] else b'' + + if not android_pua or len(code_points) > 1: + # Skip some emoji, which is not supported on old devices. +@@ -123,7 +123,7 @@ + # - Composite emoji which has multiple code point. + # NOTE: Some Unicode 6.0 emoji don't have PUA, and it is also omitted. + # TODO(hsumita): Check the availability of such emoji and enable it. +- logging.info('Skip %s', ' '.join(code_points)) ++ logging.info('Skip %s', b' '.join(code_points)) + continue + + # Check consistency between carrier PUA codes and descriptions for Android +@@ -132,7 +132,7 @@ + (bool(softbank_pua) != bool(softbank_description)) or + (bool(kddi_pua) != bool(kddi_description))): + logging.warning('carrier PUA and description conflict: %s', +- '\t'.join(columns)) ++ b'\t'.join(columns)) + continue + + # Check if the character is usable on Android. +@@ -140,7 +140,7 @@ + android_pua = 0 # Replace None with 0. + + if not emoji and not android_pua: +- logging.info('Skip: %s', '\t'.join(columns)) ++ logging.info('Skip: %s', b'\t'.join(columns)) + continue + + index = len(emoji_data_list) +@@ -149,7 +149,7 @@ + kddi_description)) + + # \xe3\x80\x80 is a full-width space +- for reading in re.split(r'(?: |\xe3\x80\x80)+', readings.strip()): ++ for reading in re.split(br'(?: |\xe3\x80\x80)+', readings.strip()): + if reading: + token_dict[NormalizeString(reading)].append(index) + +@@ -159,7 +159,7 @@ + def OutputData(emoji_data_list, token_dict, + token_array_file, string_array_file): + """Output token and string arrays to files.""" +- sorted_token_dict = sorted(token_dict.iteritems()) ++ sorted_token_dict = sorted(token_dict.items()) + + strings = {} + for reading, _ in sorted_token_dict: +@@ -171,7 +171,7 @@ + strings[docomo_description] = 0 + strings[softbank_description] = 0 + strings[kddi_description] = 0 +- sorted_strings = sorted(strings.iterkeys()) ++ sorted_strings = sorted(strings.keys()) + for index, s in enumerate(sorted_strings): + strings[s] = index + +@@ -205,7 +205,7 @@ + + def main(): + options = ParseOptions() +- with open(options.input, 'r') as input_stream: ++ with open(options.input, 'rb') as input_stream: + (emoji_data_list, token_dict) = ReadEmojiTsv(input_stream) + + OutputData(emoji_data_list, token_dict, +--- /src/rewriter/gen_reading_correction_data.py ++++ /src/rewriter/gen_reading_correction_data.py +@@ -63,7 +63,7 @@ + def WriteData(input_path, output_value_array_path, output_error_array_path, + output_correction_array_path): + outputs = [] +- with open(input_path) as input_stream: ++ with open(input_path, 'rb') as input_stream: + input_stream = code_generator_util.SkipLineComment(input_stream) + input_stream = code_generator_util.ParseColumnStream(input_stream, + num_column=3) +@@ -73,7 +73,7 @@ + + # In order to lookup the entries via |error| with binary search, + # sort outputs here. +- outputs.sort(lambda x, y: cmp(x[1], y[1]) or cmp(x[0], y[0])) ++ outputs.sort(key=lambda x: (x[1], x[0])) + + serialized_string_array_builder.SerializeToFile( + [value for (value, _, _) in outputs], output_value_array_path) +--- /src/rewriter/gen_single_kanji_rewriter_data.py ++++ /src/rewriter/gen_single_kanji_rewriter_data.py +@@ -52,7 +52,7 @@ + stream = code_generator_util.ParseColumnStream(stream, num_column=2) + outputs = list(stream) + # For binary search by |key|, sort outputs here. +- outputs.sort(lambda x, y: cmp(x[0], y[0])) ++ outputs.sort(key=lambda x: x[0]) + + return outputs + +@@ -72,7 +72,7 @@ + variant_items.append([target, original, len(variant_types) - 1]) + + # For binary search by |target|, sort variant items here. +- variant_items.sort(lambda x, y: cmp(x[0], y[0])) ++ variant_items.sort(key=lambda x: x[0]) + + return (variant_types, variant_items) + +@@ -151,10 +151,10 @@ + def main(): + options = _ParseOptions() + +- with open(options.single_kanji_file, 'r') as single_kanji_stream: ++ with open(options.single_kanji_file, 'rb') as single_kanji_stream: + single_kanji = ReadSingleKanji(single_kanji_stream) + +- with open(options.variant_file, 'r') as variant_stream: ++ with open(options.variant_file, 'rb') as variant_stream: + variant_info = ReadVariant(variant_stream) + + WriteSingleKanji(single_kanji, +--- /src/session/gen_session_stress_test_data.py ++++ /src/session/gen_session_stress_test_data.py +@@ -50,24 +50,26 @@ + """ + result = '' + for c in s: +- hexstr = hex(ord(c)) ++ hexstr = hex(c) + # because hexstr contains '0x', remove the prefix and add our prefix + result += '\\x' + hexstr[2:] + return result + + def GenerateHeader(file): + try: +- print "const char *kTestSentences[] = {" +- for line in open(file, "r"): +- if line.startswith('#'): ++ print("const char *kTestSentences[] = {") ++ fh = open(file, "rb") ++ for line in fh: ++ if line.startswith(b'#'): + continue +- line = line.rstrip('\r\n') ++ line = line.rstrip(b'\r\n') + if not line: + continue +- print " \"%s\"," % escape_string(line) +- print "};" ++ print(" \"%s\"," % escape_string(line)) ++ fh.close() ++ print("};") + except: +- print "cannot open %s" % (file) ++ print("cannot open %s" % (file)) + sys.exit(1) + + def main(): +--- /src/unix/ibus/gen_mozc_xml.py ++++ /src/unix/ibus/gen_mozc_xml.py +@@ -74,7 +74,7 @@ + + + def OutputXmlElement(param_dict, element_name, value): +- print ' <%s>%s' % (element_name, (value % param_dict), element_name) ++ print(' <%s>%s' % (element_name, (value % param_dict), element_name)) + + + def OutputXml(param_dict, component, engine_common, engines, setup_arg): +@@ -90,26 +90,26 @@ + engines: A dictionary from a property name to a list of property values of + engines. For example, {'name': ['mozc-jp', 'mozc', 'mozc-dv']}. + """ +- print '' +- for key in component: ++ print('') ++ for key in sorted(component): + OutputXmlElement(param_dict, key, component[key]) +- print '' ++ print('') + for i in range(len(engines['name'])): +- print '' +- for key in engine_common: ++ print('') ++ for key in sorted(engine_common): + OutputXmlElement(param_dict, key, engine_common[key]) + if setup_arg: + OutputXmlElement(param_dict, 'setup', ' '.join(setup_arg)) +- for key in engines: ++ for key in sorted(engines): + OutputXmlElement(param_dict, key, engines[key][i]) +- print '' +- print '' +- print '' ++ print('') ++ print('') ++ print('') + + + def OutputCppVariable(param_dict, prefix, variable_name, value): +- print 'const char k%s%s[] = "%s";' % (prefix, variable_name.capitalize(), +- (value % param_dict)) ++ print('const char k%s%s[] = "%s";' % (prefix, variable_name.capitalize(), ++ (value % param_dict))) + + + def OutputCpp(param_dict, component, engine_common, engines): +@@ -122,18 +122,18 @@ + engines: ditto. + """ + guard_name = 'MOZC_UNIX_IBUS_MAIN_H_' +- print CPP_HEADER % (guard_name, guard_name) +- for key in component: ++ print(CPP_HEADER % (guard_name, guard_name)) ++ for key in sorted(component): + OutputCppVariable(param_dict, 'Component', key, component[key]) +- for key in engine_common: ++ for key in sorted(engine_common): + OutputCppVariable(param_dict, 'Engine', key, engine_common[key]) +- for key in engines: +- print 'const char* kEngine%sArray[] = {' % key.capitalize() ++ for key in sorted(engines): ++ print('const char* kEngine%sArray[] = {' % key.capitalize()) + for i in range(len(engines[key])): +- print '"%s",' % (engines[key][i] % param_dict) +- print '};' +- print 'const size_t kEngineArrayLen = %s;' % len(engines['name']) +- print CPP_FOOTER % guard_name ++ print('"%s",' % (engines[key][i] % param_dict)) ++ print('};') ++ print('const size_t kEngineArrayLen = %s;' % len(engines['name'])) ++ print(CPP_FOOTER % guard_name) + + + def CheckIBusVersion(options, minimum_version): +--- /src/usage_stats/gen_stats_list.py ++++ /src/usage_stats/gen_stats_list.py +@@ -37,23 +37,24 @@ + + def GetStatsNameList(filename): + stats = [] +- for line in open(filename, 'r'): +- stat = line.strip() +- if not stat or stat[0] == '#': +- continue +- stats.append(stat) ++ with open(filename, 'r') as file: ++ for line in file: ++ stat = line.strip() ++ if not stat or stat[0] == '#': ++ continue ++ stats.append(stat) + return stats + + + def main(): + stats_list = GetStatsNameList(sys.argv[1]) +- print '// This header file is generated by gen_stats_list.py' ++ print('// This header file is generated by gen_stats_list.py') + for stats in stats_list: +- print 'const char k%s[] = "%s";' % (stats, stats) +- print 'const char *kStatsList[] = {' ++ print('const char k%s[] = "%s";' % (stats, stats)) ++ print('const char *kStatsList[] = {') + for stats in stats_list: +- print ' k%s,' % (stats) +- print '};' ++ print(' k%s,' % (stats)) ++ print('};') + + + if __name__ == '__main__': diff --git a/app-i18n/mozc/files/mozc-2.23.2815.102-reiwa.patch b/app-i18n/mozc/files/mozc-2.23.2815.102-reiwa.patch new file mode 100644 index 000000000..561a989a4 --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.23.2815.102-reiwa.patch @@ -0,0 +1,35 @@ +https://github.com/google/mozc/issues/461 + +--- /src/data/symbol/categorized.tsv ++++ /src/data/symbol/categorized.tsv +@@ -405,6 +405,7 @@ + ㍽ MATH たいしょう ねんごう + ㍼ MATH しょうわ ねんごう + ㍻ MATH へいせい ねんごう ++㋿ MATH れいわ ねんごう + + ㌣ MATH せんと たんい + ㌦ MATH どる たんい +--- /src/data/symbol/symbol.tsv ++++ /src/data/symbol/symbol.tsv +@@ -528,6 +528,7 @@ + 記号 ㊦ した げ 丸下 + 記号 ㊧ ひだり 丸左 + 記号 ㊨ みぎ 丸右 ++記号 ㋿ れいわ ねんごう 年号 OTHER + 記号 ㍻ へいせい ねんごう 年号 OTHER + 記号 ㍼ しょうわ ねんごう 年号 OTHER + 記号 ㍽ たいしょう ねんごう 年号 OTHER +--- /src/rewriter/date_rewriter.cc ++++ /src/rewriter/date_rewriter.cc +@@ -1239,6 +1239,10 @@ + 1989, + "平成", + "へいせい", ++ }, { ++ 2019, ++ "令和", ++ "れいわ", + } + }; + diff --git a/app-i18n/mozc/files/mozc-2.23.2815.102-server_path_check.patch b/app-i18n/mozc/files/mozc-2.23.2815.102-server_path_check.patch new file mode 100644 index 000000000..dd606e27f --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.23.2815.102-server_path_check.patch @@ -0,0 +1,95 @@ +https://github.com/google/mozc/issues/471 + +--- /src/ipc/ipc_path_manager.cc ++++ /src/ipc/ipc_path_manager.cc +@@ -332,9 +332,21 @@ + return false; + } + ++ // Expand symbolic links in the expected server path to avoid false negatives ++ // during comparisons of the expected server path and the actual server path. ++ string real_server_path = server_path; ++#ifndef OS_WIN ++ char real_server_path_[PATH_MAX]; ++ if (realpath(server_path.c_str(), real_server_path_) == NULL) { ++ LOG(ERROR) << "realpath failed: " << strerror(errno); ++ return false; ++ } ++ real_server_path = real_server_path_; ++#endif ++ + // compare path name + if (pid == server_pid_) { +- return (server_path == server_path_); ++ return (real_server_path == server_path_); + } + + server_pid_ = 0; +@@ -344,17 +356,17 @@ + { + std::wstring expected_server_ntpath; + const std::map::const_iterator it = +- expected_server_ntpath_cache_.find(server_path); ++ expected_server_ntpath_cache_.find(real_server_path); + if (it != expected_server_ntpath_cache_.end()) { + expected_server_ntpath = it->second; + } else { + std::wstring wide_server_path; +- Util::UTF8ToWide(server_path, &wide_server_path); ++ Util::UTF8ToWide(real_server_path, &wide_server_path); + if (WinUtil::GetNtPath(wide_server_path, &expected_server_ntpath)) { +- // Caches the relationship from |server_path| to +- // |expected_server_ntpath| in case |server_path| is renamed later. ++ // Caches the relationship from |real_server_path| to ++ // |expected_server_ntpath| in case |real_server_path| is renamed later. + // (This can happen during the updating). +- expected_server_ntpath_cache_[server_path] = expected_server_ntpath; ++ expected_server_ntpath_cache_[real_server_path] = expected_server_ntpath; + } + } + +@@ -371,9 +383,9 @@ + return false; + } + +- // Here we can safely assume that |server_path| (expected one) should be ++ // Here we can safely assume that |real_server_path| (expected one) should be + // the same to |server_path_| (actual one). +- server_path_ = server_path; ++ server_path_ = real_server_path; + server_pid_ = pid; + } + #endif // OS_WIN +@@ -399,7 +411,7 @@ + #ifdef OS_LINUX + // load from /proc//exe + char proc[128]; +- char filename[512]; ++ char filename[PATH_MAX]; + snprintf(proc, sizeof(proc) - 1, "/proc/%u/exe", pid); + const ssize_t size = readlink(proc, filename, sizeof(filename) - 1); + if (size == -1) { +@@ -412,18 +424,18 @@ + server_pid_ = pid; + #endif // OS_LINUX + +- VLOG(1) << "server path: " << server_path << " " << server_path_; +- if (server_path == server_path_) { ++ VLOG(1) << "server path: " << real_server_path << " " << server_path_; ++ if (real_server_path == server_path_) { + return true; + } + + #ifdef OS_LINUX +- if ((server_path + " (deleted)") == server_path_) { +- LOG(WARNING) << server_path << " on disk is modified"; ++ if ((real_server_path + " (deleted)") == server_path_) { ++ LOG(WARNING) << real_server_path << " on disk is modified"; + // If a user updates the server binary on disk during the server is running, + // "readlink /proc//exe" returns a path with the " (deleted)" suffix. + // We allow the special case. +- server_path_ = server_path; ++ server_path_ = real_server_path; + return true; + } + #endif // OS_LINUX diff --git a/app-i18n/mozc/files/mozc-2.23.2815.102-system_libraries.patch b/app-i18n/mozc/files/mozc-2.23.2815.102-system_libraries.patch new file mode 100644 index 000000000..064b910c7 --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.23.2815.102-system_libraries.patch @@ -0,0 +1,274 @@ +--- /src/gyp/defines.gypi ++++ /src/gyp/defines.gypi +@@ -71,6 +71,12 @@ + # use_libibus represents if ibus library is used or not. + # This option is only for Linux. + 'use_libibus%': '0', ++ ++ # use_libgtest represents if gtest library is used or not. ++ 'use_libgtest%': '0', ++ ++ # use_libjsoncpp represents if jsoncpp library is used or not. ++ 'use_libjsoncpp%': '0', + }, + 'target_defaults': { + 'defines': [ +--- /src/net/jsoncpp.gyp ++++ /src/net/jsoncpp.gyp +@@ -31,32 +31,57 @@ + 'targets': [ + { + 'target_name': 'jsoncpp', +- 'type': 'static_library', +- 'variables': { +- 'jsoncpp_root': '<(third_party_dir)/jsoncpp', +- 'jsoncpp_srcs': [ +- '<(jsoncpp_root)/src/lib_json/json_reader.cpp', +- '<(jsoncpp_root)/src/lib_json/json_value.cpp', +- '<(jsoncpp_root)/src/lib_json/json_writer.cpp', +- ], +- 'jsoncpp_include_dirs': ['<(jsoncpp_root)/include'], +- 'jsoncpp_additional_macros': ['JSON_USE_EXCEPTION=0'], +- }, +- 'defines': [ +- '<@(jsoncpp_additional_macros)', ++ 'conditions': [ ++ ['use_libjsoncpp==1', { ++ 'type': 'none', ++ 'variables': { ++ 'jsoncpp_additional_macros': ['JSON_USE_EXCEPTION=0'], ++ }, ++ 'all_dependent_settings': { ++ 'defines': [ ++ '<@(jsoncpp_additional_macros)', ++ ], ++ 'cflags': [ ++ ' + #define MOZC_JSONCPP_JSON_H_INCLUDED + #endif // !MOZC_JSONCPP_JSON_H_INCLUDED + +--- /src/testing/testing.gyp ++++ /src/testing/testing.gyp +@@ -53,66 +53,101 @@ + 'targets': [ + { + 'target_name': 'testing', +- 'type': 'static_library', +- 'variables': { +- 'gtest_defines': [ +- 'GTEST_LANG_CXX11=1', +- 'GTEST_HAS_TR1_TUPLE=0', # disable tr1 tuple in favor of C++11 tuple. +- ], +- 'gtest_dir': '<(third_party_dir)/gtest/googletest', +- 'gmock_dir': '<(third_party_dir)/gtest/googlemock', +- 'conditions': [ +- ['_toolset=="target" and target_platform=="Android"', { +- 'gtest_defines': [ +- 'GTEST_HAS_RTTI=0', # Android NDKr7 requires this. +- 'GTEST_HAS_CLONE=0', +- 'GTEST_HAS_GLOBAL_WSTRING=0', +- 'GTEST_HAS_POSIX_RE=0', +- 'GTEST_HAS_STD_WSTRING=0', +- 'GTEST_OS_LINUX=1', +- 'GTEST_OS_LINUX_ANDROID=1', +- ], +- }], +- ], +- }, +- 'sources': [ +- '<(gmock_dir)/src/gmock-cardinalities.cc', +- '<(gmock_dir)/src/gmock-internal-utils.cc', +- '<(gmock_dir)/src/gmock-matchers.cc', +- '<(gmock_dir)/src/gmock-spec-builders.cc', +- '<(gmock_dir)/src/gmock.cc', +- '<(gtest_dir)/src/gtest-death-test.cc', +- '<(gtest_dir)/src/gtest-filepath.cc', +- '<(gtest_dir)/src/gtest-port.cc', +- '<(gtest_dir)/src/gtest-printers.cc', +- '<(gtest_dir)/src/gtest-test-part.cc', +- '<(gtest_dir)/src/gtest-typed-test.cc', +- '<(gtest_dir)/src/gtest.cc', +- ], +- 'include_dirs': [ +- '<(gmock_dir)', +- '<(gmock_dir)/include', +- '<(gtest_dir)', +- '<(gtest_dir)/include', +- ], +- 'defines': [ +- '<@(gtest_defines)', +- ], +- 'all_dependent_settings': { +- 'defines': [ +- '<@(gtest_defines)', +- ], +- 'include_dirs': [ +- '<(gmock_dir)/include', +- '<(gtest_dir)/include', +- ], +- }, + 'conditions': [ +- ['(_toolset=="target" and compiler_target=="clang") or ' +- '(_toolset=="host" and compiler_host=="clang")', { +- 'cflags': [ +- '-Wno-missing-field-initializers', +- '-Wno-unused-private-field', ++ ['use_libgtest==1', { ++ 'type': 'none', ++ 'variables': { ++ 'gtest_defines': [ ++ 'GTEST_LANG_CXX11=1', ++ 'GTEST_HAS_TR1_TUPLE=0', # disable tr1 tuple in favor of C++11 tuple. ++ ], ++ 'conditions': [ ++ ['_toolset=="target" and target_platform=="Android"', { ++ 'gtest_defines': [ ++ 'GTEST_HAS_RTTI=0', # Android NDKr7 requires this. ++ 'GTEST_HAS_CLONE=0', ++ 'GTEST_HAS_GLOBAL_WSTRING=0', ++ 'GTEST_HAS_POSIX_RE=0', ++ 'GTEST_HAS_STD_WSTRING=0', ++ 'GTEST_OS_LINUX=1', ++ 'GTEST_OS_LINUX_ANDROID=1', ++ ], ++ }], ++ ], ++ }, ++ 'all_dependent_settings': { ++ 'defines': [ ++ '<@(gtest_defines)', ++ ], ++ 'link_settings': { ++ 'libraries': [ ++ '-lgmock -lgtest', ++ ], ++ }, ++ }, ++ }, { ++ 'type': 'static_library', ++ 'variables': { ++ 'gtest_defines': [ ++ 'GTEST_LANG_CXX11=1', ++ 'GTEST_HAS_TR1_TUPLE=0', # disable tr1 tuple in favor of C++11 tuple. ++ ], ++ 'gtest_dir': '<(third_party_dir)/gtest/googletest', ++ 'gmock_dir': '<(third_party_dir)/gtest/googlemock', ++ 'conditions': [ ++ ['_toolset=="target" and target_platform=="Android"', { ++ 'gtest_defines': [ ++ 'GTEST_HAS_RTTI=0', # Android NDKr7 requires this. ++ 'GTEST_HAS_CLONE=0', ++ 'GTEST_HAS_GLOBAL_WSTRING=0', ++ 'GTEST_HAS_POSIX_RE=0', ++ 'GTEST_HAS_STD_WSTRING=0', ++ 'GTEST_OS_LINUX=1', ++ 'GTEST_OS_LINUX_ANDROID=1', ++ ], ++ }], ++ ], ++ }, ++ 'sources': [ ++ '<(gmock_dir)/src/gmock-cardinalities.cc', ++ '<(gmock_dir)/src/gmock-internal-utils.cc', ++ '<(gmock_dir)/src/gmock-matchers.cc', ++ '<(gmock_dir)/src/gmock-spec-builders.cc', ++ '<(gmock_dir)/src/gmock.cc', ++ '<(gtest_dir)/src/gtest-death-test.cc', ++ '<(gtest_dir)/src/gtest-filepath.cc', ++ '<(gtest_dir)/src/gtest-port.cc', ++ '<(gtest_dir)/src/gtest-printers.cc', ++ '<(gtest_dir)/src/gtest-test-part.cc', ++ '<(gtest_dir)/src/gtest-typed-test.cc', ++ '<(gtest_dir)/src/gtest.cc', ++ ], ++ 'include_dirs': [ ++ '<(gmock_dir)', ++ '<(gmock_dir)/include', ++ '<(gtest_dir)', ++ '<(gtest_dir)/include', ++ ], ++ 'defines': [ ++ '<@(gtest_defines)', ++ ], ++ 'all_dependent_settings': { ++ 'defines': [ ++ '<@(gtest_defines)', ++ ], ++ 'include_dirs': [ ++ '<(gmock_dir)/include', ++ '<(gtest_dir)/include', ++ ], ++ }, ++ 'conditions': [ ++ ['(_toolset=="target" and compiler_target=="clang") or ' ++ '(_toolset=="host" and compiler_host=="clang")', { ++ 'cflags': [ ++ '-Wno-missing-field-initializers', ++ '-Wno-unused-private-field', ++ ], ++ }], + ], + }], + ], diff --git a/app-i18n/mozc/files/mozc-2.26.4220-environmental_variables.patch b/app-i18n/mozc/files/mozc-2.26.4220-environmental_variables.patch new file mode 100644 index 000000000..dccdff76f --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.26.4220-environmental_variables.patch @@ -0,0 +1,89 @@ +https://github.com/google/mozc/issues/470 + +--- /src/base/system_util.cc ++++ /src/base/system_util.cc +@@ -226,6 +226,11 @@ + + std::string UserProfileDirectoryImpl::GetUserProfileDirectory() const { + #if defined(OS_CHROMEOS) ++ const char *configuration_directory_env = Environ::GetEnv("MOZC_CONFIGURATION_DIRECTORY"); ++ if (configuration_directory_env) { ++ return configuration_directory_env; ++ } ++ + // TODO(toka): Must use passed in user profile dir which passed in. If mojo + // platform the user profile is determined on runtime. + // It's hack, the user profile dir should be passed in. Although the value in +@@ -245,13 +250,23 @@ + #elif defined(OS_IOS) + // OS_IOS block must be placed before __APPLE__ because both macros are + // currently defined on iOS. +- // ++ ++ const char *configuration_directory_env = Environ::GetEnv("MOZC_CONFIGURATION_DIRECTORY"); ++ if (configuration_directory_env) { ++ return configuration_directory_env; ++ } ++ + // On iOS, use Caches directory instead of Application Spport directory + // because the support directory doesn't exist by default. Also, it is backed + // up by iTunes and iCloud. + return FileUtil::JoinPath({MacUtil::GetCachesDirectory(), kProductPrefix}); + + #elif defined(OS_WIN) ++ const char *configuration_directory_env = Environ::GetEnv("MOZC_CONFIGURATION_DIRECTORY"); ++ if (configuration_directory_env) { ++ return configuration_directory_env; ++ } ++ + DCHECK(SUCCEEDED(Singleton::get()->result())); + std::string dir = Singleton::get()->path(); + +@@ -263,6 +278,11 @@ + + + #elif defined(__APPLE__) ++ const char *configuration_directory_env = Environ::GetEnv("MOZC_CONFIGURATION_DIRECTORY"); ++ if (configuration_directory_env) { ++ return configuration_directory_env; ++ } ++ + std::string dir = MacUtil::GetApplicationSupportDirectory(); + # ifdef GOOGLE_JAPANESE_INPUT_BUILD + dir = FileUtil::JoinPath(dir, "Google"); +@@ -276,6 +296,11 @@ + + + #elif defined(OS_LINUX) ++ const char *configuration_directory_env = Environ::GetEnv("MOZC_CONFIGURATION_DIRECTORY"); ++ if (configuration_directory_env) { ++ return configuration_directory_env; ++ } ++ + // 1. If "$HOME/.mozc" already exists, + // use "$HOME/.mozc" for backward compatibility. + // 2. If $XDG_CONFIG_HOME is defined +@@ -395,6 +420,11 @@ + #endif // OS_WIN + + std::string SystemUtil::GetServerDirectory() { ++ const char *server_directory_env = Environ::GetEnv("MOZC_SERVER_DIRECTORY"); ++ if (server_directory_env) { ++ return server_directory_env; ++ } ++ + #ifdef OS_WIN + DCHECK(SUCCEEDED(Singleton::get()->result())); + # if defined(GOOGLE_JAPANESE_INPUT_BUILD) +@@ -453,6 +483,11 @@ + } + + std::string SystemUtil::GetDocumentDirectory() { ++ const char *documents_directory_env = Environ::GetEnv("MOZC_DOCUMENTS_DIRECTORY"); ++ if (documents_directory_env) { ++ return documents_directory_env; ++ } ++ + #if defined(__APPLE__) + return GetServerDirectory(); + #elif defined(MOZC_DOCUMENT_DIRECTORY) diff --git a/app-i18n/mozc/files/mozc-2.26.4220-server_path_check.patch b/app-i18n/mozc/files/mozc-2.26.4220-server_path_check.patch new file mode 100644 index 000000000..8dbabeac0 --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.26.4220-server_path_check.patch @@ -0,0 +1,95 @@ +https://github.com/google/mozc/issues/471 + +--- /src/ipc/ipc_path_manager.cc ++++ /src/ipc/ipc_path_manager.cc +@@ -340,9 +340,21 @@ + return false; + } + ++ // Expand symbolic links in the expected server path to avoid false negatives ++ // during comparisons of the expected server path and the actual server path. ++ string real_server_path = server_path; ++#ifndef OS_WIN ++ char real_server_path_[PATH_MAX]; ++ if (realpath(server_path.c_str(), real_server_path_) == NULL) { ++ LOG(ERROR) << "realpath failed: " << strerror(errno); ++ return false; ++ } ++ real_server_path = real_server_path_; ++#endif ++ + // compare path name + if (pid == server_pid_) { +- return (server_path == server_path_); ++ return (real_server_path == server_path_); + } + + server_pid_ = 0; +@@ -352,17 +364,17 @@ + { + std::wstring expected_server_ntpath; + const std::map::const_iterator it = +- expected_server_ntpath_cache_.find(server_path); ++ expected_server_ntpath_cache_.find(real_server_path); + if (it != expected_server_ntpath_cache_.end()) { + expected_server_ntpath = it->second; + } else { + std::wstring wide_server_path; +- Util::UTF8ToWide(server_path, &wide_server_path); ++ Util::UTF8ToWide(real_server_path, &wide_server_path); + if (WinUtil::GetNtPath(wide_server_path, &expected_server_ntpath)) { +- // Caches the relationship from |server_path| to +- // |expected_server_ntpath| in case |server_path| is renamed later. ++ // Caches the relationship from |real_server_path| to ++ // |expected_server_ntpath| in case |real_server_path| is renamed later. + // (This can happen during the updating). +- expected_server_ntpath_cache_[server_path] = expected_server_ntpath; ++ expected_server_ntpath_cache_[real_server_path] = expected_server_ntpath; + } + } + +@@ -379,9 +391,9 @@ + return false; + } + +- // Here we can safely assume that |server_path| (expected one) should be ++ // Here we can safely assume that |real_server_path| (expected one) should be + // the same to |server_path_| (actual one). +- server_path_ = server_path; ++ server_path_ = real_server_path; + server_pid_ = pid; + } + #endif // OS_WIN +@@ -406,7 +418,7 @@ + #ifdef OS_LINUX + // load from /proc//exe + char proc[128]; +- char filename[512]; ++ char filename[PATH_MAX]; + absl::SNPrintF(proc, sizeof(proc) - 1, "/proc/%u/exe", pid); + const ssize_t size = readlink(proc, filename, sizeof(filename) - 1); + if (size == -1) { +@@ -419,18 +431,18 @@ + server_pid_ = pid; + #endif // OS_LINUX + +- VLOG(1) << "server path: " << server_path << " " << server_path_; +- if (server_path == server_path_) { ++ VLOG(1) << "server path: " << real_server_path << " " << server_path_; ++ if (real_server_path == server_path_) { + return true; + } + + #ifdef OS_LINUX +- if ((server_path + " (deleted)") == server_path_) { +- LOG(WARNING) << server_path << " on disk is modified"; ++ if ((real_server_path + " (deleted)") == server_path_) { ++ LOG(WARNING) << real_server_path << " on disk is modified"; + // If a user updates the server binary on disk during the server is running, + // "readlink /proc//exe" returns a path with the " (deleted)" suffix. + // We allow the special case. +- server_path_ = server_path; ++ server_path_ = real_server_path; + return true; + } + #endif // OS_LINUX diff --git a/app-i18n/mozc/files/mozc-2.26.4220-system_abseil-cpp.patch b/app-i18n/mozc/files/mozc-2.26.4220-system_abseil-cpp.patch new file mode 100644 index 000000000..33f72b8f7 --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.26.4220-system_abseil-cpp.patch @@ -0,0 +1,407 @@ +https://github.com/google/mozc/issues/490 + +--- /src/base/absl.gyp ++++ /src/base/absl.gyp +@@ -28,119 +28,209 @@ + # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + { +- 'variables': { +- 'absl_srcdir': '<(DEPTH)/third_party/abseil-cpp/absl', +- 'gen_absl_dir': '<(SHARED_INTERMEDIATE_DIR)/third_party/abseil-cpp/absl', +- }, ++ 'conditions': [ ++ ['use_system_abseil_cpp==0', { ++ 'variables': { ++ 'absl_srcdir': '<(DEPTH)/third_party/abseil-cpp/absl', ++ 'gen_absl_dir': '<(SHARED_INTERMEDIATE_DIR)/third_party/abseil-cpp/absl', ++ }, ++ }], ++ ], + 'targets': [ + { + 'target_name': 'absl_base', +- 'type': 'static_library', + 'toolsets': ['host', 'target'], +- 'sources': [ +- '<(absl_srcdir)/base/internal/cycleclock.cc', +- '<(absl_srcdir)/base/internal/low_level_alloc.cc', +- '<(absl_srcdir)/base/internal/raw_logging.cc', +- '<(absl_srcdir)/base/internal/spinlock.cc', +- '<(absl_srcdir)/base/internal/spinlock_wait.cc', +- '<(absl_srcdir)/base/internal/sysinfo.cc', +- '<(absl_srcdir)/base/internal/thread_identity.cc', +- '<(absl_srcdir)/base/internal/throw_delegate.cc', +- '<(absl_srcdir)/base/internal/unscaledcycleclock.cc', +- '<(absl_srcdir)/container/internal/raw_hash_set.cc', +- '<(absl_srcdir)/hash/internal/city.cc', +- '<(absl_srcdir)/hash/internal/hash.cc', +- ], +- 'msvs_disabled_warnings': [ +- # 'type' : forcing value to bool 'true' or 'false' +- # (performance warning) +- # http://msdn.microsoft.com/en-us/library/b6801kcy.aspx +- '4800', ++ 'conditions': [ ++ ['use_system_abseil_cpp==1', { ++ 'type': 'none', ++ 'all_dependent_settings': { ++ 'link_settings': { ++ 'libraries': [ ++ '-labsl_base -labsl_city -labsl_hash -labsl_malloc_internal -labsl_raw_hash_set -labsl_raw_logging_internal -labsl_spinlock_wait -labsl_throw_delegate', ++ ], ++ }, ++ }, ++ }, { ++ 'type': 'static_library', ++ 'sources': [ ++ # libabsl_base ++ '<(absl_srcdir)/base/internal/cycleclock.cc', ++ # libabsl_malloc_internal ++ '<(absl_srcdir)/base/internal/low_level_alloc.cc', ++ # libabsl_raw_logging_internal ++ '<(absl_srcdir)/base/internal/raw_logging.cc', ++ # libabsl_base ++ '<(absl_srcdir)/base/internal/spinlock.cc', ++ # libabsl_spinlock_wait ++ '<(absl_srcdir)/base/internal/spinlock_wait.cc', ++ # libabsl_base ++ '<(absl_srcdir)/base/internal/sysinfo.cc', ++ '<(absl_srcdir)/base/internal/thread_identity.cc', ++ # libabsl_throw_delegate ++ '<(absl_srcdir)/base/internal/throw_delegate.cc', ++ # libabsl_base ++ '<(absl_srcdir)/base/internal/unscaledcycleclock.cc', ++ # libabsl_raw_hash_set ++ '<(absl_srcdir)/container/internal/raw_hash_set.cc', ++ # libabsl_city ++ '<(absl_srcdir)/hash/internal/city.cc', ++ # libabsl_hash ++ '<(absl_srcdir)/hash/internal/hash.cc', ++ ], ++ 'msvs_disabled_warnings': [ ++ # 'type' : forcing value to bool 'true' or 'false' ++ # (performance warning) ++ # http://msdn.microsoft.com/en-us/library/b6801kcy.aspx ++ '4800', ++ ], ++ }], + ], + }, + { + 'target_name': 'absl_numeric', +- 'type': 'static_library', + 'toolsets': ['host', 'target'], +- 'sources': [ +- '<(absl_srcdir)/numeric/int128.cc', +- ], +- 'dependencies': [ +- 'absl_base', ++ 'conditions': [ ++ ['use_system_abseil_cpp==1', { ++ 'type': 'none', ++ 'all_dependent_settings': { ++ 'link_settings': { ++ 'libraries': [ ++ '-labsl_int128', ++ ], ++ }, ++ }, ++ }, { ++ 'type': 'static_library', ++ 'sources': [ ++ # libabsl_int128 ++ '<(absl_srcdir)/numeric/int128.cc', ++ ], ++ 'dependencies': [ ++ 'absl_base', ++ ], ++ }], + ], + }, + { + 'target_name': 'absl_strings_internal', +- 'type': 'static_library', + 'toolsets': ['host', 'target'], +- 'sources': [ +- '<(absl_srcdir)/strings/internal/charconv_bigint.cc', +- '<(absl_srcdir)/strings/internal/charconv_parse.cc', +- '<(absl_srcdir)/strings/internal/escaping.cc', +- '<(absl_srcdir)/strings/internal/memutil.cc', +- '<(absl_srcdir)/strings/internal/str_format/arg.cc', +- '<(absl_srcdir)/strings/internal/str_format/bind.cc', +- '<(absl_srcdir)/strings/internal/str_format/extension.cc', +- '<(absl_srcdir)/strings/internal/str_format/float_conversion.cc', +- '<(absl_srcdir)/strings/internal/str_format/output.cc', +- '<(absl_srcdir)/strings/internal/str_format/parser.cc', +- '<(absl_srcdir)/strings/internal/utf8.cc', +- ], +- 'dependencies': [ +- 'absl_base', +- 'absl_numeric', ++ 'conditions': [ ++ ['use_system_abseil_cpp==1', { ++ 'type': 'none', ++ 'all_dependent_settings': { ++ 'link_settings': { ++ 'libraries': [ ++ '-labsl_strings_internal', ++ ], ++ }, ++ }, ++ }, { ++ 'type': 'static_library', ++ 'sources': [ ++ # libabsl_strings ++ '<(absl_srcdir)/strings/internal/charconv_bigint.cc', ++ '<(absl_srcdir)/strings/internal/charconv_parse.cc', ++ # libabsl_strings_internal ++ '<(absl_srcdir)/strings/internal/escaping.cc', ++ # libabsl_strings ++ '<(absl_srcdir)/strings/internal/memutil.cc', ++ # libabsl_str_format_internal ++ '<(absl_srcdir)/strings/internal/str_format/arg.cc', ++ '<(absl_srcdir)/strings/internal/str_format/bind.cc', ++ '<(absl_srcdir)/strings/internal/str_format/extension.cc', ++ '<(absl_srcdir)/strings/internal/str_format/float_conversion.cc', ++ '<(absl_srcdir)/strings/internal/str_format/output.cc', ++ '<(absl_srcdir)/strings/internal/str_format/parser.cc', ++ # libabsl_strings_internal ++ '<(absl_srcdir)/strings/internal/utf8.cc', ++ ], ++ 'dependencies': [ ++ 'absl_base', ++ 'absl_numeric', ++ ], ++ }], + ], + }, + { + 'target_name': 'absl_strings', +- 'type': 'static_library', + 'toolsets': ['host', 'target'], +- 'sources': [ +- '<(absl_srcdir)/strings/ascii.cc', +- '<(absl_srcdir)/strings/charconv.cc', +- '<(absl_srcdir)/strings/escaping.cc', +- '<(absl_srcdir)/strings/match.cc', +- '<(absl_srcdir)/strings/numbers.cc', +- '<(absl_srcdir)/strings/str_cat.cc', +- '<(absl_srcdir)/strings/str_replace.cc', +- '<(absl_srcdir)/strings/str_split.cc', +- '<(absl_srcdir)/strings/string_view.cc', +- '<(absl_srcdir)/strings/substitute.cc', +- ], +- 'dependencies': [ +- 'absl_base', +- 'absl_numeric', +- 'absl_strings_internal', ++ 'conditions': [ ++ ['use_system_abseil_cpp==1', { ++ 'type': 'none', ++ 'all_dependent_settings': { ++ 'link_settings': { ++ 'libraries': [ ++ '-labsl_str_format_internal -labsl_strings -labsl_strings_internal', ++ ], ++ }, ++ }, ++ }, { ++ 'type': 'static_library', ++ 'sources': [ ++ # libabsl_strings ++ '<(absl_srcdir)/strings/ascii.cc', ++ '<(absl_srcdir)/strings/charconv.cc', ++ '<(absl_srcdir)/strings/escaping.cc', ++ '<(absl_srcdir)/strings/match.cc', ++ '<(absl_srcdir)/strings/numbers.cc', ++ '<(absl_srcdir)/strings/str_cat.cc', ++ '<(absl_srcdir)/strings/str_replace.cc', ++ '<(absl_srcdir)/strings/str_split.cc', ++ '<(absl_srcdir)/strings/string_view.cc', ++ '<(absl_srcdir)/strings/substitute.cc', ++ ], ++ 'dependencies': [ ++ 'absl_base', ++ 'absl_numeric', ++ 'absl_strings_internal', ++ ], ++ }], + ], + }, + { + 'target_name': 'absl_time', +- 'type': 'static_library', + 'toolsets': ['host', 'target'], +- 'sources': [ +- '<(absl_srcdir)/time/civil_time.cc', +- '<(absl_srcdir)/time/clock.cc', +- '<(absl_srcdir)/time/duration.cc', +- '<(absl_srcdir)/time/format.cc', +- '<(absl_srcdir)/time/time.cc', +- '<(absl_srcdir)/time/internal/cctz/src/civil_time_detail.cc', +- '<(absl_srcdir)/time/internal/cctz/src/time_zone_fixed.cc', +- '<(absl_srcdir)/time/internal/cctz/src/time_zone_format.cc', +- '<(absl_srcdir)/time/internal/cctz/src/time_zone_if.cc', +- '<(absl_srcdir)/time/internal/cctz/src/time_zone_impl.cc', +- '<(absl_srcdir)/time/internal/cctz/src/time_zone_info.cc', +- '<(absl_srcdir)/time/internal/cctz/src/time_zone_libc.cc', +- '<(absl_srcdir)/time/internal/cctz/src/time_zone_lookup.cc', +- '<(absl_srcdir)/time/internal/cctz/src/time_zone_posix.cc', +- '<(absl_srcdir)/time/internal/cctz/src/zone_info_source.cc', +- ], +- 'cflags': [ +- '-Wno-error', +- ], +- 'dependencies': [ +- 'absl_base', +- 'absl_numeric', +- 'absl_strings_internal', ++ 'conditions': [ ++ ['use_system_abseil_cpp==1', { ++ 'type': 'none', ++ 'all_dependent_settings': { ++ 'link_settings': { ++ 'libraries': [ ++ '-labsl_civil_time -labsl_time -labsl_time_zone', ++ ], ++ }, ++ }, ++ }, { ++ 'type': 'static_library', ++ 'sources': [ ++ # libabsl_time ++ '<(absl_srcdir)/time/civil_time.cc', ++ '<(absl_srcdir)/time/clock.cc', ++ '<(absl_srcdir)/time/duration.cc', ++ '<(absl_srcdir)/time/format.cc', ++ '<(absl_srcdir)/time/time.cc', ++ # libabsl_civil_time ++ '<(absl_srcdir)/time/internal/cctz/src/civil_time_detail.cc', ++ # libabsl_time_zone ++ '<(absl_srcdir)/time/internal/cctz/src/time_zone_fixed.cc', ++ '<(absl_srcdir)/time/internal/cctz/src/time_zone_format.cc', ++ '<(absl_srcdir)/time/internal/cctz/src/time_zone_if.cc', ++ '<(absl_srcdir)/time/internal/cctz/src/time_zone_impl.cc', ++ '<(absl_srcdir)/time/internal/cctz/src/time_zone_info.cc', ++ '<(absl_srcdir)/time/internal/cctz/src/time_zone_libc.cc', ++ '<(absl_srcdir)/time/internal/cctz/src/time_zone_lookup.cc', ++ '<(absl_srcdir)/time/internal/cctz/src/time_zone_posix.cc', ++ '<(absl_srcdir)/time/internal/cctz/src/zone_info_source.cc', ++ ], ++ 'cflags': [ ++ '-Wno-error', ++ ], ++ 'dependencies': [ ++ 'absl_base', ++ 'absl_numeric', ++ 'absl_strings_internal', ++ ], ++ }], + ], + }, + ], +--- /src/config/config_test.gyp ++++ /src/config/config_test.gyp +@@ -36,6 +36,7 @@ + 'config_handler_test.cc', + ], + 'dependencies': [ ++ '../base/absl.gyp:absl_base', + '../testing/testing.gyp:gtest_main', + '../testing/testing.gyp:mozctest', + 'config.gyp:config_handler', +@@ -80,6 +81,7 @@ + 'character_form_manager_test.cc', + ], + 'dependencies': [ ++ '../base/absl.gyp:absl_base', + '../testing/testing.gyp:gtest_main', + 'config.gyp:character_form_manager', + ], +--- /src/gyp/common.gypi ++++ /src/gyp/common.gypi +@@ -194,7 +194,13 @@ + 'include_dirs': [ + '<(abs_depth)', + '<(SHARED_INTERMEDIATE_DIR)', +- '<(absl_dir)', ++ ], ++ 'conditions': [ ++ ['use_system_abseil_cpp==0', { ++ 'include_dirs': [ ++ '<(absl_dir)', ++ ], ++ }], + ], + 'mac_framework_headers': [], + 'target_conditions': [ +--- /src/gyp/common_win.gypi ++++ /src/gyp/common_win.gypi +@@ -307,10 +307,16 @@ + 'include_dirs': [ + '<(abs_depth)', + '<(SHARED_INTERMEDIATE_DIR)', +- '<(absl_dir)', + '<@(msvs_includes)', + '<(wtl_dir)/include', + ], ++ 'conditions': [ ++ ['use_system_abseil_cpp==0', { ++ 'include_dirs': [ ++ '<(absl_dir)', ++ ], ++ }], ++ ], + 'msvs_configuration_attributes': { + 'CharacterSet': '<(win_char_set_unicode)', + }, +--- /src/gyp/defines.gypi ++++ /src/gyp/defines.gypi +@@ -63,6 +63,10 @@ + # use_libibus represents if ibus library is used or not. + # This option is only for Linux. + 'use_libibus%': '0', ++ ++ # use_system_abseil_cpp represents if system version or bundled version ++ # of abseil-cpp library is used. ++ 'use_system_abseil_cpp%': '0', + }, + 'target_defaults': { + 'defines': [ +--- /src/gyp/directories.gypi ++++ /src/gyp/directories.gypi +@@ -31,7 +31,12 @@ + 'variables': { + # Top directory of third party libraries. + 'third_party_dir': '<(DEPTH)/third_party', +- 'absl_dir': '<(DEPTH)/third_party/abseil-cpp', ++ ++ 'conditions': [ ++ ['use_system_abseil_cpp==0', { ++ 'absl_dir': '<(DEPTH)/third_party/abseil-cpp', ++ }], ++ ], + + # Top directory of additional third party libraries. + 'ext_third_party_dir%': '<(abs_depth)/third_party', +--- /src/session/session_test.gyp ++++ /src/session/session_test.gyp +@@ -221,6 +221,7 @@ + 'internal/key_event_transformer_test.cc', + ], + 'dependencies': [ ++ '../base/absl.gyp:absl_base', + '../base/base.gyp:base', + '../converter/converter_base.gyp:converter_mock', + '../engine/engine.gyp:mock_converter_engine', +--- /src/storage/storage_test.gyp ++++ /src/storage/storage_test.gyp +@@ -41,6 +41,7 @@ + 'tiny_storage_test.cc', + ], + 'dependencies': [ ++ '../base/absl.gyp:absl_base', + '../testing/testing.gyp:gtest_main', + 'storage.gyp:storage', + ], diff --git a/app-i18n/mozc/files/mozc-2.26.4220-system_gtest.patch b/app-i18n/mozc/files/mozc-2.26.4220-system_gtest.patch new file mode 100644 index 000000000..47891fab9 --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.26.4220-system_gtest.patch @@ -0,0 +1,141 @@ +https://github.com/google/mozc/issues/490 + +--- /src/gyp/defines.gypi ++++ /src/gyp/defines.gypi +@@ -67,6 +67,10 @@ + # use_system_abseil_cpp represents if system version or bundled version + # of abseil-cpp library is used. + 'use_system_abseil_cpp%': '0', ++ ++ # use_system_gtest represents if system version or bundled version ++ # of gtest library is used. ++ 'use_system_gtest%': '0', + }, + 'target_defaults': { + 'defines': [ +--- /src/testing/testing.gyp ++++ /src/testing/testing.gyp +@@ -59,54 +59,76 @@ + 'targets': [ + { + 'target_name': 'testing', +- 'type': 'static_library', +- 'variables': { +- 'gtest_defines': [ +- 'GTEST_LANG_CXX11=1', +- 'GTEST_HAS_TR1_TUPLE=0', # disable tr1 tuple in favor of C++11 tuple. +- ], +- 'gtest_dir': '<(third_party_dir)/gtest/googletest', +- 'gmock_dir': '<(third_party_dir)/gtest/googlemock', +- }, +- 'sources': [ +- '<(gmock_dir)/src/gmock-cardinalities.cc', +- '<(gmock_dir)/src/gmock-internal-utils.cc', +- '<(gmock_dir)/src/gmock-matchers.cc', +- '<(gmock_dir)/src/gmock-spec-builders.cc', +- '<(gmock_dir)/src/gmock.cc', +- '<(gtest_dir)/src/gtest-death-test.cc', +- '<(gtest_dir)/src/gtest-filepath.cc', +- '<(gtest_dir)/src/gtest-matchers.cc', +- '<(gtest_dir)/src/gtest-port.cc', +- '<(gtest_dir)/src/gtest-printers.cc', +- '<(gtest_dir)/src/gtest-test-part.cc', +- '<(gtest_dir)/src/gtest-typed-test.cc', +- '<(gtest_dir)/src/gtest.cc', +- ], +- 'include_dirs': [ +- '<(gmock_dir)', +- '<(gmock_dir)/include', +- '<(gtest_dir)', +- '<(gtest_dir)/include', +- ], +- 'defines': [ +- '<@(gtest_defines)', +- ], +- 'all_dependent_settings': { +- 'defines': [ +- '<@(gtest_defines)', +- ], +- 'include_dirs': [ +- '<(gmock_dir)/include', +- '<(gtest_dir)/include', +- ], +- }, + 'conditions': [ +- ['(_toolset=="target" and compiler_target=="clang") or ' +- '(_toolset=="host" and compiler_host=="clang")', { +- 'cflags': [ +- '-Wno-missing-field-initializers', +- '-Wno-unused-private-field', ++ ['use_system_gtest==1', { ++ 'type': 'none', ++ 'variables': { ++ 'gtest_defines': [ ++ 'GTEST_LANG_CXX11=1', ++ 'GTEST_HAS_TR1_TUPLE=0', # disable tr1 tuple in favor of C++11 tuple. ++ ], ++ }, ++ 'all_dependent_settings': { ++ 'defines': [ ++ '<@(gtest_defines)', ++ ], ++ 'link_settings': { ++ 'libraries': [ ++ '-lgmock -lgtest', ++ ], ++ }, ++ }, ++ }, { ++ 'type': 'static_library', ++ 'variables': { ++ 'gtest_defines': [ ++ 'GTEST_LANG_CXX11=1', ++ 'GTEST_HAS_TR1_TUPLE=0', # disable tr1 tuple in favor of C++11 tuple. ++ ], ++ 'gtest_dir': '<(third_party_dir)/gtest/googletest', ++ 'gmock_dir': '<(third_party_dir)/gtest/googlemock', ++ }, ++ 'sources': [ ++ '<(gmock_dir)/src/gmock-cardinalities.cc', ++ '<(gmock_dir)/src/gmock-internal-utils.cc', ++ '<(gmock_dir)/src/gmock-matchers.cc', ++ '<(gmock_dir)/src/gmock-spec-builders.cc', ++ '<(gmock_dir)/src/gmock.cc', ++ '<(gtest_dir)/src/gtest-death-test.cc', ++ '<(gtest_dir)/src/gtest-filepath.cc', ++ '<(gtest_dir)/src/gtest-matchers.cc', ++ '<(gtest_dir)/src/gtest-port.cc', ++ '<(gtest_dir)/src/gtest-printers.cc', ++ '<(gtest_dir)/src/gtest-test-part.cc', ++ '<(gtest_dir)/src/gtest-typed-test.cc', ++ '<(gtest_dir)/src/gtest.cc', ++ ], ++ 'include_dirs': [ ++ '<(gmock_dir)', ++ '<(gmock_dir)/include', ++ '<(gtest_dir)', ++ '<(gtest_dir)/include', ++ ], ++ 'defines': [ ++ '<@(gtest_defines)', ++ ], ++ 'all_dependent_settings': { ++ 'defines': [ ++ '<@(gtest_defines)', ++ ], ++ 'include_dirs': [ ++ '<(gmock_dir)/include', ++ '<(gtest_dir)/include', ++ ], ++ }, ++ 'conditions': [ ++ ['(_toolset=="target" and compiler_target=="clang") or ' ++ '(_toolset=="host" and compiler_host=="clang")', { ++ 'cflags': [ ++ '-Wno-missing-field-initializers', ++ '-Wno-unused-private-field', ++ ], ++ }], + ], + }], + ], diff --git a/app-i18n/mozc/files/mozc-2.26.4220-system_jsoncpp.patch b/app-i18n/mozc/files/mozc-2.26.4220-system_jsoncpp.patch new file mode 100644 index 000000000..7ff132eaa --- /dev/null +++ b/app-i18n/mozc/files/mozc-2.26.4220-system_jsoncpp.patch @@ -0,0 +1,117 @@ +https://github.com/google/mozc/issues/490 + +--- /src/gyp/defines.gypi ++++ /src/gyp/defines.gypi +@@ -71,6 +71,10 @@ + # use_system_gtest represents if system version or bundled version + # of gtest library is used. + 'use_system_gtest%': '0', ++ ++ # use_system_jsoncpp represents if system version or bundled version ++ # of jsoncpp library is used. ++ 'use_system_jsoncpp%': '0', + }, + 'target_defaults': { + 'defines': [ +--- /src/net/jsoncpp.gyp ++++ /src/net/jsoncpp.gyp +@@ -31,32 +31,60 @@ + 'targets': [ + { + 'target_name': 'jsoncpp', +- 'type': 'static_library', +- 'variables': { +- 'jsoncpp_root': '<(third_party_dir)/jsoncpp', +- 'jsoncpp_srcs': [ +- '<(jsoncpp_root)/src/lib_json/json_reader.cpp', +- '<(jsoncpp_root)/src/lib_json/json_value.cpp', +- '<(jsoncpp_root)/src/lib_json/json_writer.cpp', +- ], +- 'jsoncpp_include_dirs': ['<(jsoncpp_root)/include'], +- 'jsoncpp_additional_macros': ['JSON_USE_EXCEPTION=0'], +- }, +- 'defines': [ +- '<@(jsoncpp_additional_macros)', ++ 'conditions': [ ++ ['use_system_jsoncpp==1', { ++ 'type': 'none', ++ 'variables': { ++ 'jsoncpp_additional_macros': [ ++ 'JSON_USE_EXCEPTION=0', ++ 'MOZC_USE_SYSTEM_JSONCPP', ++ ], ++ }, ++ 'all_dependent_settings': { ++ 'defines': [ ++ '<@(jsoncpp_additional_macros)', ++ ], ++ 'cflags': [ ++ ' ++#else + #include "third_party/jsoncpp/include/json/json.h" ++#endif + #define MOZC_JSONCPP_JSON_H_INCLUDED + #endif // !MOZC_JSONCPP_JSON_H_INCLUDED + diff --git a/app-i18n/mozc/metadata.xml b/app-i18n/mozc/metadata.xml new file mode 100644 index 000000000..5541b34c2 --- /dev/null +++ b/app-i18n/mozc/metadata.xml @@ -0,0 +1,24 @@ + + + + + arfrever.fta@gmail.com + Arfrever Frehtes Taifersar Arahesis + + + cjk@gentoo.org + Cjk + + + Enable support for app-i18n/fcitx 4 + Enable support for app-i18n/fcitx5 + Install graphical user interface tool (mozc_tool) + + Enable support for app-i18n/ibus + Enable native candidate window + + + google/mozc + + diff --git a/app-i18n/mozc/mozc-2.26.4220_p20201212102434_p20201219202429.ebuild b/app-i18n/mozc/mozc-2.26.4220_p20201212102434_p20201219202429.ebuild new file mode 100644 index 000000000..b6f5b4192 --- /dev/null +++ b/app-i18n/mozc/mozc-2.26.4220_p20201212102434_p20201219202429.ebuild @@ -0,0 +1,441 @@ +# Copyright 2010-2021 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI="7" +PYTHON_COMPAT=(python{3_7,3_8,3_9}) + +inherit elisp-common multiprocessing python-any-r1 toolchain-funcs desktop xdg + +if [[ "${PV}" == "9999" ]]; then + inherit git-r3 + + EGIT_REPO_URI="https://github.com/google/mozc" + EGIT_SUBMODULES=(src/third_party/japanese_usage_dictionary) +else + MOZC_GIT_REVISION="9ba59b64d53365c1fe93c1c245b4ec3e35bdadf0" + MOZC_DATE="${PV#*_p}" + MOZC_DATE="${MOZC_DATE%%_p*}" + + FCITX_MOZC_GIT_REVISION="1ea089debc31ff216473369ad71c08318384ee06" + FCITX_MOZC_DATE="${PV#*_p}" + FCITX_MOZC_DATE="${FCITX_MOZC_DATE#*_p}" + FCITX_MOZC_DATE="${FCITX_MOZC_DATE%%_p*}" + + JAPANESE_USAGE_DICTIONARY_GIT_REVISION="a4a66772e33746b91e99caceecced9a28507e925" + JAPANESE_USAGE_DICTIONARY_DATE="20180701040110" +fi + +DESCRIPTION="Mozc - Japanese input method editor" +HOMEPAGE="https://github.com/google/mozc" +if [[ "${PV}" == "9999" ]]; then + SRC_URI="" +else + SRC_URI="https://github.com/google/${PN}/archive/${MOZC_GIT_REVISION}.tar.gz -> ${PN}-${PV%%_p*}-${MOZC_DATE}.tar.gz + https://github.com/hiroyuki-komatsu/japanese-usage-dictionary/archive/${JAPANESE_USAGE_DICTIONARY_GIT_REVISION}.tar.gz -> japanese-usage-dictionary-${JAPANESE_USAGE_DICTIONARY_DATE}.tar.gz + https://github.com/fcitx/${PN}/archive/${FCITX_MOZC_GIT_REVISION}.tar.gz -> fcitx-${PN}-${PV%%_p*}-${FCITX_MOZC_DATE}.tar.gz" +fi + +# Mozc: BSD +# src/data/dictionary_oss: ipadic, public-domain +# src/data/unicode: unicode +# japanese-usage-dictionary: BSD-2 +LICENSE="BSD BSD-2 ipadic public-domain unicode" +SLOT="0" +#KEYWORDS="~amd64 ~arm64 ~ppc64 x86" +KEYWORDS="~amd64 ~x86" +IUSE="debug emacs fcitx4 fcitx5 +gui ibus renderer test" +REQUIRED_USE="|| ( emacs fcitx4 fcitx5 ibus )" +RESTRICT="!test? ( test )" + +BDEPEND="$(python_gen_any_dep 'dev-python/six[${PYTHON_USEDEP}]') + >=dev-libs/protobuf-3.0.0 + dev-util/gyp + dev-util/ninja + virtual/pkgconfig + emacs? ( app-editors/emacs:* ) + fcitx4? ( sys-devel/gettext ) + fcitx5? ( sys-devel/gettext )" +DEPEND="=dev-cpp/abseil-cpp-20200923*[cxx17(+)] + >=dev-libs/protobuf-3.0.0:= + fcitx4? ( + app-i18n/fcitx:4 + virtual/libintl + ) + fcitx5? ( + app-i18n/fcitx5:5 + app-i18n/libime + sys-devel/gettext + virtual/libintl + ) + gui? ( + dev-qt/qtcore:5 + dev-qt/qtgui:5 + dev-qt/qtwidgets:5 + ) + ibus? ( + >=app-i18n/ibus-1.4.1 + dev-libs/glib:2 + x11-libs/libxcb + ) + renderer? ( + dev-libs/glib:2 + x11-libs/cairo + x11-libs/gtk+:2 + x11-libs/pango + ) + test? ( + >=dev-cpp/gtest-1.8.0 + dev-libs/jsoncpp + )" +RDEPEND="=dev-cpp/abseil-cpp-20200923*[cxx17(+)] + >=dev-libs/protobuf-3.0.0:= + emacs? ( app-editors/emacs:* ) + fcitx4? ( + app-i18n/fcitx:4 + virtual/libintl + ) + fcitx5? ( + app-i18n/fcitx5:5 + app-i18n/libime + sys-devel/gettext + virtual/libintl + ) + gui? ( + dev-qt/qtcore:5 + dev-qt/qtgui:5 + dev-qt/qtwidgets:5 + ) + ibus? ( + >=app-i18n/ibus-1.4.1 + dev-libs/glib:2 + x11-libs/libxcb + ) + renderer? ( + dev-libs/glib:2 + x11-libs/cairo + x11-libs/gtk+:2 + x11-libs/pango + )" + +S="${WORKDIR}/${P}/src" + +SITEFILE="50${PN}-gentoo.el" + +execute() { + einfo "$@" + "$@" +} + +python_check_deps() { + has_version -b "dev-python/six[${PYTHON_USEDEP}]" +} + +src_unpack() { + if [[ "${PV}" == "9999" ]]; then + git-r3_src_unpack + + if use fcitx4; then + local EGIT_SUBMODULES=() + git-r3_fetch https://github.com/fcitx/mozc refs/heads/fcitx + git-r3_checkout https://github.com/fcitx/mozc "${WORKDIR}/fcitx-mozc" + fi + if use fcitx5; then + local EGIT_SUBMODULES=() + git-r3_fetch https://github.com/fcitx/mozc refs/heads/fcitx5 + git-r3_checkout https://github.com/fcitx/mozc "${WORKDIR}/fcitx5-mozc" + fi + else + unpack ${PN}-${PV%%_p*}-${MOZC_DATE}.tar.gz + mv mozc-${MOZC_GIT_REVISION} ${P} || die + + unpack japanese-usage-dictionary-${JAPANESE_USAGE_DICTIONARY_DATE}.tar.gz + cp -p japanese-usage-dictionary-${JAPANESE_USAGE_DICTIONARY_GIT_REVISION}/usage_dict.txt ${P}/src/third_party/japanese_usage_dictionary || die + + unpack fcitx-${PN}-${PV%%_p*}-${FCITX_MOZC_DATE}.tar.gz + if use fcitx4; then + cp -pr mozc-${FCITX_MOZC_GIT_REVISION} fcitx-${PN} || die + fi + if use fcitx5; then + cp -pr mozc-${FCITX_MOZC_GIT_REVISION} fcitx5-${PN} || die + fi + fi +} + +src_prepare() { + if use fcitx4; then + cp -pr "${WORKDIR}/fcitx-mozc/src/unix/fcitx" unix || die + fi + if use fcitx5; then + cp -pr "${WORKDIR}/fcitx5-mozc/src/unix/fcitx5" unix || die + fi + + pushd "${WORKDIR}/${P}" > /dev/null || die + + eapply "${FILESDIR}/${PN}-2.26.4220-system_abseil-cpp.patch" + eapply "${FILESDIR}/${PN}-2.26.4220-system_gtest.patch" + eapply "${FILESDIR}/${PN}-2.26.4220-system_jsoncpp.patch" + eapply "${FILESDIR}/${PN}-2.26.4220-environmental_variables.patch" + eapply "${FILESDIR}/${PN}-2.26.4220-server_path_check.patch" + + eapply_user + + popd > /dev/null || die + + sed \ + -e "s/def GypMain(options, unused_args):/def GypMain(options, gyp_args):/" \ + -e "s/RunOrDie(gyp_command + gyp_options)/RunOrDie(gyp_command + gyp_options + gyp_args)/" \ + -e "s/RunOrDie(\[ninja/&, '-j$(makeopts_jobs)', '-l$(makeopts_loadavg "${MAKEOPTS}" 0)', '-v'/" \ + -i build_mozc.py || die + + local ar=($(tc-getAR)) + local cc=($(tc-getCC)) + local cxx=($(tc-getCXX)) + local ld=($(tc-getLD)) + local nm=($(tc-getNM)) + local readelf=($(tc-getREADELF)) + + # Use absolute paths. Non-absolute paths are mishandled by GYP. + ar[0]=$(type -P ${ar[0]}) + cc[0]=$(type -P ${cc[0]}) + cxx[0]=$(type -P ${cxx[0]}) + ld[0]=$(type -P ${ld[0]}) + nm[0]=$(type -P ${nm[0]}) + readelf[0]=$(type -P ${readelf[0]}) + + sed \ + -e "s: ${PN}-${PV%%_p*}-${MOZC_DATE}.tar.gz + https://github.com/hiroyuki-komatsu/japanese-usage-dictionary/archive/${JAPANESE_USAGE_DICTIONARY_GIT_REVISION}.tar.gz -> japanese-usage-dictionary-${JAPANESE_USAGE_DICTIONARY_DATE}.tar.gz + https://github.com/fcitx/${PN}/archive/${FCITX_MOZC_GIT_REVISION}.tar.gz -> fcitx-${PN}-${PV%%_p*}-${FCITX_MOZC_DATE}.tar.gz" +fi + +# Mozc: BSD +# src/data/dictionary_oss: ipadic, public-domain +# src/data/unicode: unicode +# japanese-usage-dictionary: BSD-2 +LICENSE="BSD BSD-2 ipadic public-domain unicode" +SLOT="0" +KEYWORDS="" +IUSE="debug emacs fcitx4 fcitx5 +gui ibus renderer test" +REQUIRED_USE="|| ( emacs fcitx4 fcitx5 ibus )" +RESTRICT="!test? ( test )" + +BDEPEND="$(python_gen_any_dep 'dev-python/six[${PYTHON_USEDEP}]') + >=dev-libs/protobuf-3.0.0 + dev-util/gyp + dev-util/ninja + virtual/pkgconfig + emacs? ( app-editors/emacs:* ) + fcitx4? ( sys-devel/gettext ) + fcitx5? ( sys-devel/gettext )" +DEPEND=">=dev-cpp/abseil-cpp-20200923[cxx17(+)] + >=dev-libs/protobuf-3.0.0:= + fcitx4? ( + app-i18n/fcitx:4 + virtual/libintl + ) + fcitx5? ( + app-i18n/fcitx5:5 + app-i18n/libime + sys-devel/gettext + virtual/libintl + ) + gui? ( + dev-qt/qtcore:5 + dev-qt/qtgui:5 + dev-qt/qtwidgets:5 + ) + ibus? ( + >=app-i18n/ibus-1.4.1 + dev-libs/glib:2 + x11-libs/libxcb + ) + renderer? ( + dev-libs/glib:2 + x11-libs/cairo + x11-libs/gtk+:2 + x11-libs/pango + ) + test? ( + >=dev-cpp/gtest-1.8.0 + dev-libs/jsoncpp + )" +RDEPEND=">=dev-cpp/abseil-cpp-20200923[cxx17(+)] + >=dev-libs/protobuf-3.0.0:= + emacs? ( app-editors/emacs:* ) + fcitx4? ( + app-i18n/fcitx:4 + virtual/libintl + ) + fcitx5? ( + app-i18n/fcitx5:5 + app-i18n/libime + sys-devel/gettext + virtual/libintl + ) + gui? ( + dev-qt/qtcore:5 + dev-qt/qtgui:5 + dev-qt/qtwidgets:5 + ) + ibus? ( + >=app-i18n/ibus-1.4.1 + dev-libs/glib:2 + x11-libs/libxcb + ) + renderer? ( + dev-libs/glib:2 + x11-libs/cairo + x11-libs/gtk+:2 + x11-libs/pango + )" + +S="${WORKDIR}/${P}/src" + +SITEFILE="50${PN}-gentoo.el" + +execute() { + einfo "$@" + "$@" +} + +python_check_deps() { + has_version -b "dev-python/six[${PYTHON_USEDEP}]" +} + +src_unpack() { + if [[ "${PV}" == "9999" ]]; then + git-r3_src_unpack + + if use fcitx4; then + local EGIT_SUBMODULES=() + git-r3_fetch https://github.com/fcitx/mozc refs/heads/fcitx + git-r3_checkout https://github.com/fcitx/mozc "${WORKDIR}/fcitx-mozc" + fi + if use fcitx5; then + local EGIT_SUBMODULES=() + git-r3_fetch https://github.com/fcitx/mozc refs/heads/fcitx5 + git-r3_checkout https://github.com/fcitx/mozc "${WORKDIR}/fcitx5-mozc" + fi + else + unpack ${PN}-${PV%%_p*}-${MOZC_DATE}.tar.gz + mv mozc-${MOZC_GIT_REVISION} ${P} || die + + unpack japanese-usage-dictionary-${JAPANESE_USAGE_DICTIONARY_DATE}.tar.gz + cp -p japanese-usage-dictionary-${JAPANESE_USAGE_DICTIONARY_GIT_REVISION}/usage_dict.txt ${P}/src/third_party/japanese_usage_dictionary || die + + unpack fcitx-${PN}-${PV%%_p*}-${FCITX_MOZC_DATE}.tar.gz + if use fcitx4; then + cp -pr mozc-${FCITX_MOZC_GIT_REVISION} fcitx-${PN} || die + fi + if use fcitx5; then + cp -pr mozc-${FCITX_MOZC_GIT_REVISION} fcitx5-${PN} || die + fi + fi +} + +src_prepare() { + if use fcitx4; then + cp -pr "${WORKDIR}/fcitx-mozc/src/unix/fcitx" unix || die + fi + if use fcitx5; then + cp -pr "${WORKDIR}/fcitx5-mozc/src/unix/fcitx5" unix || die + fi + + pushd "${WORKDIR}/${P}" > /dev/null || die + + eapply "${FILESDIR}/${PN}-2.26.4220-system_abseil-cpp.patch" + eapply "${FILESDIR}/${PN}-2.26.4220-system_gtest.patch" + eapply "${FILESDIR}/${PN}-2.26.4220-system_jsoncpp.patch" + eapply "${FILESDIR}/${PN}-2.26.4220-environmental_variables.patch" + eapply "${FILESDIR}/${PN}-2.26.4220-server_path_check.patch" + + eapply_user + + popd > /dev/null || die + + sed \ + -e "s/def GypMain(options, unused_args):/def GypMain(options, gyp_args):/" \ + -e "s/RunOrDie(gyp_command + gyp_options)/RunOrDie(gyp_command + gyp_options + gyp_args)/" \ + -e "s/RunOrDie(\[ninja/&, '-j$(makeopts_jobs)', '-l$(makeopts_loadavg "${MAKEOPTS}" 0)', '-v'/" \ + -i build_mozc.py || die + + local ar=($(tc-getAR)) + local cc=($(tc-getCC)) + local cxx=($(tc-getCXX)) + local ld=($(tc-getLD)) + local nm=($(tc-getNM)) + local readelf=($(tc-getREADELF)) + + # Use absolute paths. Non-absolute paths are mishandled by GYP. + ar[0]=$(type -P ${ar[0]}) + cc[0]=$(type -P ${cc[0]}) + cxx[0]=$(type -P ${cxx[0]}) + ld[0]=$(type -P ${ld[0]}) + nm[0]=$(type -P ${nm[0]}) + readelf[0]=$(type -P ${readelf[0]}) + + sed \ + -e "s: