BigQuery エディタのフォーマッタマシにしたい
思いつき
BigQuery や Spanner コンソールで使いたい
TODO
x bigquery console のクエリを置き換えられないか見てみる x wasm で関数を作って js から呼んでみる ブラウザ拡張からいい感じに呼べるか確認
bazel で formatter を依存として利用する関数を作ってビルドする
zetasql-formatter の FormatSQL メソッドを js から呼べるようにしてビルドする
BigQuery コンソールのエディタ
Monaco Editor
window.monaco.editor.getModels()[0].setValue("foo") したら書き換えられる
タブの数だけ model インスタンスあるけど今どれかどうやって分かる?
タブ閉じても model には残っていて数が合わない、isDisposed とかも false になっている?
なんか面倒そうなコード書くしかない? ページロード時からタブの要素数と model を監視して対応付けるとか...
monaco のちからで良い方法がないか
monaco.editor.getModel('inmemory://model/4') みたいな URL 個別の Model を取れる
WebAssembly
バイナリのサイズ制限は?
google/zetasql のビルドに使われているので雰囲気知っておく
Emscripten + Bazel
zetasql-formatter
まあまあバイナリでかい
code:ls -l -h /usr/local/bin/zetasql-formatter
-rwxr-xr-x 1 root admin 19M 6 8 11:28 /usr/local/bin/zetasql-formatter
Cloud Run とかで動かすやつ
Abseil
Google の C++ ライブラリ
wasm でビルド
m4 を emcc でビルドしようとしてしまう、bison のビルドで使っている感じに見えるが wasm でビルドする必要はないと思うがどうだろ? parser から使っている
code:log
checking for gcc... /private/var/tmp/_bazel_pokutuna/a97ffe834d1ea6b331460b5dcef20beb/sandbox/darwin-sandbox/14/execroot/wasm/external/emsdk/emscripten_toolchain/emcc.sh
checking whether the C compiler works... no
どうすればよいのか??
configure_make
m4, flex, bison あたりはバイナリインストールしたものを使えないか
bazel/bison.bzl, bazel/flex.bzl の genyacc や genlex をいじる?
http_archive でなくて local_repository にしていじりながらためす
build:wasm --crosstool_top=@emsdk//emscripten_toolchain:everything
build:wasm --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
なんかここで host 側のを使うみたいな指定できないか
1度普通にビルドしてそのあと wasm 作るとツール類が入っていて済むとか
bson の生成するやつは作りわけないとだめそう
依存グラフ見てみる
死ぬほど巨大
--noimplicit_deps したら意味ない
zetasql-formatter ビルドしてなんかライブラリ的に使えないのかなあ
m4 とか bison は parser を作るのに必要なだけで、ホストのプラットフォームでは普通にビルドできるのだから
parser をllvm ir にして自作の部分を wasm にコンパイルするときにリンクできないか
emcc .sh に渡してエラーになる warning option を消す
-Wno-unused-but-set-parameter
-Wnonnull-compare
parser からの依存のこのへんのやつ、並列にビルドされるので最初に落ちるやつが違ってエラーが一貫しないけど関係するやつのオプションをちまちま消す
zetasql/base/BUILD, zetasql/parser/BUILD, zetasql/public/functions/BUILD, zetasql/common/BUILD, zetasql/public/types/BUILD
m4, flex, bison をビルドせずインストール済みのを使うようにする
bison.bzl, flex.bzl から {m4, flex, bison}_bin への依存をコメントアウトする & path を設定する & 他の BUILD から bison, flex への依存をコメントアウトする
(TODO なんかまとめてできないか? -Wno-unknown-warning-option みたいな)
--copt="-Wno-unknown-warning-option" でいける
bison でコケる
external/bison/data/skeletons/location.cc:25: error: invalid defines value: b4_defines_flag
依存している bison のバージョンは 3.6.2 使ってるのは 3.8.1 であってはいないのだがそこまで厳密なものか
sandbox のなか grep しても b4_defines_flag が見つからない(めちゃ古い bison の Changelog だけひっかかる)
brew で入れたほうと xcode でいれたほうでエラーが違うなあ→ xcode のやつ激古で 2.3 だったしここでは使ってない
brew edit bison して 3.6.1 入れる、brew edit bison && brew reinstall --build-from-source
進んだ気がする
external/zetasql_formatter/zetasql/public/functions/convert_proto.cc:82:29: error: class with destructor marked 'final' cannot be inherited from -Werror,-Wfinal-dtor-non-final-class 該当のビルドオプションで -Wno-final-dtor-non-final-class つける
icu のビルドまでいけた、m4, bison, flex のようにコケる
linkopts に USE_ICU=1 を追加する
@icu//... へ依存しているところをコメントアウト
code:error
external/zetasql_formatter/zetasql/common/multiprecision_int.h:1270:18: error: unknown attribute 'optimize' ignored -Werror,-Wunknown-attributes __attribute__((optimize("O0")))
これも -Wno-unknown-attributes かなあ
code:error
external/zetasql_formatter/zetasql/parser/flex_tokenizer.h:38:10: fatal error: 'FlexLexer.h' file not found
bison_parser_generated_libs の copts で host の flex にパスを通す "-I/usr/local/opt/flex/include"
code:error
external/zetasql_formatter/zetasql/common/utf_util.h:25:10: fatal error: 'unicode/utf8.h' file not found
string_util の copts で同様に icu4c にパスを通す -I/usr/local/opt/icu4c/include、icu4c は homebrew でいれたやつ
code:error
bazel-out/wasm-fastbuild/bin/external/zetasql_formatter/zetasql/parser/parse_tree_generated.h:4380:19: error: 'alias' overrides a member function but is not marked 'override' -Werror,-Winconsistent-missing-override const ASTAlias* alias() const { return alias_; }
external/zetasql_formatter/zetasql/public/value_inl.h:675:1: error: 'ContentLayout' defined as a class template here but previously declared as a struct template; this is valid, but may result in linker errors under the Microsoft C++ ABI -Werror,-Wmismatched-tags sql_formatter で
-Wno-inconsistent-missing-override
-Wno-mismatched-tags ← いいのかこれ?
-I/usr/local/opt/flex/include
↑ う、こういうのだめなのか
new_local_repository で宣言してそれを参照する、icu も同様
code:error
static const uint64_t kYearMask = 0x3FFFLL << kYearShift; // 14 bits
civil_time で -Wno-unused-const-variable
code:error
external/zetasql_formatter/zetasql/public/functions/convert_internal.h:103:29: error: implicit conversion from 'std::numeric_limits<long long>::type' (aka 'long long') to 'float' changes value from 9223372036854775807 to 9223372036854775808 -Werror,-Wimplicit-const-int-float-conversion FloatType upper_bound = std::numeric_limits<ResultType>::max();
こういうのいっぱいでてくる
type で -Wno-implicit-const-int-float-conversion
code:error
external/zetasql_formatter/zetasql/public/parse_location.cc:30:10: fatal error: 'unicode/umachine.h' file not found
無限に続くなあ、これも icu の local_repo を参照させる
う、これは @icu//:common を参照していたのをコメントアウトしている、:header じゃだめかも
code:icu.BUILD
cc_library(
name = "common",
deps = [
"icu",
],
)
cc_library(
name = "headers",
deps = [
"icu",
],
)
こういう感じだからまず header で行ってみるか、name が違うだけで同じものを参照していると思えるが...
**/*.h だけ参照しているけどリンク時に emscripten の ICU とリンク出来るのだろうか?? うーーん......
code:error
external/zetasql_formatter/zetasql/public/value_inl.h:675:1: error: 'ContentLayout' defined as a class template here but previously declared as a struct template; this is valid, but may result in linker errors under the Microsoft C++ ABI -Werror,-Wmismatched-tags class Value::Metadata::ContentLayout<8> {
^
external/zetasql_formatter/zetasql/public/value.h:833:5: note: did you mean class here?
struct ContentLayout;
^~~~~~
class
external/zetasql_formatter/zetasql/public/proto_util.cc:556:10: error: comparison of different enumeration types in switch statement ('google::protobuf::FieldDescriptor::Type' and 'google::protobuf::internal::WireFormatLite::FieldType') -Werror,-Wenum-compare-switch case WireFormatLite::TYPE_GROUP: {
^~~~~~~~~~~~~~~~~~~~~~~~~~
external/zetasql_formatter/zetasql/public/proto_util.cc:548:10: error: comparison of different enumeration types in switch statement ('google::protobuf::FieldDescriptor::Type' and 'google::protobuf::internal::WireFormatLite::FieldType') -Werror,-Wenum-compare-switch case WireFormatLite::TYPE_MESSAGE: {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
public/BUILD の value ででまくる
-Wno-mismatched-tags
-Wno-enum-compare-switch
うまくいくならあとでまとめて .bazelrc でビルドオプションに指定したい...
なんかめちゃエラーでて疲れて build:wasm --copt="-Wno-deprecated-declarations" した
code:error
external/zetasql_formatter/zetasql/common/json_parser.cc:28:10: fatal error: 'unicode/utf8.h' file not found
common/BUILD の json_parser、これも icu
コケるたびにいろいろ -Wno-hogehoge しつつ @local_flex, @local_icu にパスを通していく
code:error
external/zetasql_formatter/zetasql/public/value.cc:1953:16: error: no matching constructor for initialization of 'zetasql::Value::Metadata::Content' (aka 'ContentLayout<sizeof(zetasql::Type *)>')
*content() = Content(type, is_null, preserves_order);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
external/zetasql_formatter/zetasql/public/value_inl.h:643:3: note: candidate constructor not viable: 1st argument ('const zetasql::Type *') would lose const qualifier
ContentLayout<4>(Type* type, bool is_null, bool preserves_order)
^
external/zetasql_formatter/zetasql/public/value_inl.h:650:13: note: candidate constructor not viable: requires 4 arguments, but 3 were provided
constexpr ContentLayout<4>(TypeKind kind, bool is_null, bool preserves_order,
^
external/zetasql_formatter/zetasql/public/value_inl.h:630:24: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 3 were provided
class Value::Metadata::ContentLayout<4> {
う、小手先ではなんとかならなそうなやつがきた
public/BUILD の value
うーんシグニチャのコンストラクタが見つかっていない
Content → Value::Metadata::Content にしてみる → やっぱだめ
Metadata とかフォーマッタに関係ないだろう、返り値ないしメソッドの実装空にしてしまう(ひどすぎる)
また flex 依存しているやつがあるので通す
めちゃめちゃビルドが進む、やったか??
うまくいってもセグフォしそうだなこれは
code:error
emcc: error: Foundation: No such file or directory ("Foundation" was expected to be an input file, based on the commandline arguments provided)
リンクでコケる
Foundation って apple の Foundation だろうか、いらなそうだけどなあ
リンクパラメータに -framework Foundation が入っている
Docker でビルドしようとしたら
ERROR: Analysis of target '//main:format' failed; build aborted: Either the path attribute of android_sdk_repository or the ANDROID_HOME environment variable must be set.
bazel か emscripten が android_sdk_repository に依存している?? そんなバカな