Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ビルド時間とアーティファクトサイズの軽減が狙いですが、主としてバッチのリファクタリングです。 #626

Closed
wants to merge 6 commits into from

Conversation

ds14050
Copy link
Contributor

@ds14050 ds14050 commented Nov 20, 2018

#615 のコミット再構成版です。

コミット構成について

リファクタリングを目的とした最初のコミット(9959259)が以降のコミットのベースになっています。2番目以降のコミットの取捨選択は容易ですが、1番目のコミットなしでは2番目以降のコミットが成り立ちません。

そういうわけでひとつの PR にまとめていますが、コミット毎に採用可否を判断していただければと思います。

大きな修正は1番目だけで、他は小さな変更ばかりです。

cmd /C "call "%Batch%" %Platform% %Config%" ^
|| exit /b 1
call :StopWatch
echo ---- end %Batch% [%StopDate% %StopTime% / %Elapsed% seconds elapsed.] ----
Copy link
Contributor Author

@ds14050 ds14050 Nov 20, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

わりと見かけると思うのですが、こういうメッセージで s を脱着するまではしないけれど、括弧を付けずにはいられない(second(s))几帳面さが日本語使いには理解しがたいものがあります。

マーク・ピーターセンさんの古典的名著『日本人の英語』を読むとそういう、(不)定冠詞を軽視した態度は厳に改めるべきものだと反省させられます。英語ネイティブはまず a や the を発話してから、具体的な名詞となる単語を頭の中で探すことがあるらしいですよ。そっちが核なんですね。

この echo メッセージも改めるべきなのかもしれません。

@ds14050 ds14050 added refactoring リファクタリング 【ChangeLog除外】 CI appveyor など CI 関連 【ChangeLog除外】 labels Nov 20, 2018
@ds14050 ds14050 added this to the next release milestone Nov 20, 2018
build-all.bat Outdated Show resolved Hide resolved
call :StartWatch
echo ---- start %Batch% [%StartDate% %StartTime%] ----
echo.
cmd /C "call "%Batch%" %Platform% %Config%" ^
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cmd /C "%Batch%" の代わりに call|"%Batch%" でもいけそうですがあまりに趣味的なのでやめておきます。

@berryzplus
Copy link
Contributor

`%time%‘ の書式がロケール依存なのを嫌って powershell のワンライナー書いた人がいるみたいです。
https://pslabo.hatenablog.com/entry/20150803/p1

とりあえず「使いやすい」からバッチにしてますけど、バッチにこだわる必要はないと思ってます。計時部分だけ wsh とかもアリだと思います。(計時に他プロセス起動していいのか?という根源的なツッコミは置いておいて・・・。)

そもそも、すでに一部pythonを使った処理が入りこんでいますよね?unix系文化では使えるもんはなんでも使う系のビルドスクリプトが多いように思います。c-shellオンリーで外部コマンド禁止みたいな縛りプレイを要求されるのは業務だけであって欲しいです 😢

@berryzplus
Copy link
Contributor

計時機能についてダメ出し、というか単に趣味の問題なんですが。

こうなってるんですけど、

	call :StartWatch
	echo ---- start %Batch% [%StartDate% %StartTime%] ----
	echo.
	cmd /C "call "%Batch%" %Platform% %Config%" ^
	|| exit /b 1
	call :StopWatch
	echo ---- end   %Batch% [%StopDate% %StopTime% / %Elapsed% seconds elapsed.] ----
	echo.
exit /b 0

:StartWatch

こうならんですかね?

	call :StartWatch "%LogFileName%" "%Batch%" %Platform% %Config% || exit /b 1
exit /b 0

:StartWatch
        set LogFileName=%~2
        shift /2
        :: この辺に時刻取得処理がある
	echo ---- start %1 [%StartDate% %StartTime%] ---- > "%LogFileName%"
	echo. > "%LogFileName%"
	cmd /C %*  > "%LogFileName%" || exit /b 1
        :: この辺に時刻取得処理がある
	echo ---- end   %1 [%StopDate% %StopTime% / %Elapsed% seconds elapsed.] ---- > "%LogFileName%"
	echo. > "%LogFileName%"

こういう構成の場合、StopWatch.bat を別ファイルにすることもできると思います。
元のバッチ呼出しに対する変更量も少なめなのもメリットです。

@ds14050
Copy link
Contributor Author

ds14050 commented Nov 23, 2018

`%time%‘ の書式がロケール依存なのを嫌って powershell のワンライナー書いた人がいるみたいです。

今のところ %DATE% の差異は確認しましたが %TIME% の違いは確認していません。

こうならんですかね?

目的がよくわかりません。ファイルを分けるにしても、とっちらかるのに勝る理由が欲しいです。

それと以前ここの githash.h に関するやりとりで知ったのですが、ラベル呼び出しをリダイレクトできるらしいです。

call :label > log

@berryzplus
Copy link
Contributor

こうならんですかね?

目的がよくわかりません。ファイルを分けるにしても、とっちらかるのに勝る理由が欲しいです。

start & end を出すのは計時機構の一部だと思います。
外部化しようとしたら計時機構単体の完成度を上げたくなると思います。
使いまわしができることはメリットだと思っています。

@ds14050
Copy link
Contributor Author

ds14050 commented Nov 24, 2018

start & end を出していたのは build-all.bat と tests/build-and-test.bat です。そこにタイムスタンプを埋め込みました。

外部バッチ化して引数としてテンプレート文字列を受け取り、キーワード(!WATCHDATE!!WATCHTIME! エクスクラメーションマークがキーです)をタイムスタンプで置換して出力して、出力先はバッチ呼び出し元に制御してもらう案もありますが、むしろ build-all.bat と tests/build-and-test.bat を統合することで StartWatch/StopWatch の重複をなくそうと考えています。

他で引き合いが出てきてから汎用ツール化するのでいいと思います。

@ds14050
Copy link
Contributor Author

ds14050 commented Nov 24, 2018

単体ファイル化(Watch.bat)するとこうです。

@echo off
setlocal ENABLEDELAYEDEXPANSION

call :%~1Watch %~2 %~3 %~4 %~5 %~6 %~7 %~8 %~9^
 || exit /b 1
exit /b 0

:StartWatch
	set StartDate=%DATE%
	set StartTime=%TIME: =0%
	if not "%*" == "" echo %*
exit /b 0

:StopWatch
	rem Be aware of space-padding hours and octal number literals
	rem when calculating the Elapsed.

	set StopDate=%DATE%
	set StopTime=%TIME: =0%
	set /A Elapsed=(1%StopTime:~0,2%  * 3600 + 1%StopTime:~3,2%  * 60 + 1%StopTime:~6,2%) ^
	              -(1%StartTime:~0,2% * 3600 + 1%StartTime:~3,2% * 60 + 1%StartTime:~6,2%)
	if not "%StartDate%" == "%StopDate%" (
		set /A Elapsed=%Elapsed% + 60 * 3600
	)
	if not "%*" == "" echo %*
exit /b 0

こうやって使います。

>call Watch Start "Starting at ^^!StartDate^^! ^^!StartTime^^!"

@ds14050
Copy link
Contributor Author

ds14050 commented Nov 24, 2018

setlocal したら Start と Stop の間で環境変数が維持されないでしょう。setlocal を外して親環境を汚染しようとしても新しいコマンドインタープリタ上で実行されていればそれも叶いません。決まった名前の一時ファイルを使用すると一度に一か所からしか使えません。どうやって汎用ツール化するのかわからなくなってしまいました(今のところそのつもりはありませんが)。

@@ -1,19 +1,57 @@
@echo off
setlocal ENABLEDELAYEDEXPANSION
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

遅延環境変数を利用したい CMAKE_PATH_FIX が呼び出し元の PATH 環境変数に影響を与えるためにこの場所で setlocal しましたが、endlocal & set PATH=%PATH% することにより setlocal を CMAKE_PATH_FIX 内部のみで完結させられます。

Copy link
Contributor

@berryzplus berryzplus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あらためて内容確認しましたが、これ #653 と内容被りますね。
入れる前提で考えると事前調整が必要と思われます。

全体的な総括として、修正前後のバッチ記述の技術レベルに差がありすぎて、何がどう変わっているかを把握するのが難しいコミットだと思いました。

取りうる対応として2通り。

  1. 動いてるからこれで行こうぜ!で突き進むパターン
  2. 変更内容をぼくらが理解できるまで説明するパターン

問題発生時に即対応できるなら 1. でもいいと思ってます。少なくとも個人的には。

あと、全体見渡してみて気付いた点ですが、
googletest submoduleの更新がPRに含まれています。
もしも意図する変更であれば、これはPRを分けるべきと思います。

@ds14050
Copy link
Contributor Author

ds14050 commented Dec 4, 2018

こんばんは。お久しぶりです>@berryzplus さん

これ #653 と内容被りますね。

そうでしょうか。Files Changed > Jump to... からファイル一覧が見られますが、見事にかぶりなしに見えました。

  1. 動いてるからこれで行こうぜ!で突き進むパターン
  2. 変更内容をぼくらが理解できるまで説明するパターン

リファクタリングを行う1コミット目は、動いている一事を以て「行こうぜ!」と考えてもらえるとありがたいです。説明は望むところですが、テクニカルな説明に終始する予感がします。

2コミット目以降はたとえば「Release と Debug でビルド内容を分ける」ことについて、いま分ける必要があるのか、分けるとしてその分配など、一度は検討してもらいたいと思っています。


force-push について。

現在の master に rebase して googletest の変更を取り除きました。内容の修正は計時機能に関して時刻が 23:59:59 から 00:00:00 に巻き戻るときに加算する補正値を (24 * 3600) 秒にしたことのみです。動いているかどうかは AppVeyor 待ちです。

berryzplus
berryzplus previously approved these changes Feb 19, 2019
@berryzplus berryzplus dismissed their stale review February 19, 2019 15:52

IE誤動作のため。request changesをdismissしたかっただけです。

@berryzplus
Copy link
Contributor

あと、全体見渡してみて気付いた点ですが、
googletest submoduleの更新がPRに含まれています。
もしも意図する変更であれば、これはPRを分けるべきと思います。

これが直ってたのでdismissしようとしたらIE11が暴走...orz

* コードの繰り返しを配列データに変換し、ビルド別に実行内容を取捨選択しやすく。
* バッチの実行環境(echo, PATH, カレントディレクトリなど)をバッチ毎に切り離す。
  親から子への継承は引き続き行われるが、子から親へ影響を与えることができなくなる。
* pushd, popd の使用を減らし、バッチ中断時に変なディレクトリに残されないように。
* CMake のために sh.exe を PATH から外す対策をより汎用的に。
  ※遅延環境変数が必要だが PATH 操作を外部に作用させるためにサブルーチン単位で SETLOCAL はできない。
* バッチの親子で共有される環境変数 ERROR_RESULT の使用をやめ、SETLOCAL する。
* MinGW ビルドでテストプログラム置き場を Configuration 別に分ける。
* run-tests.bat でテストプログラムの再帰探索範囲を狭められる。
* run-tests.bat は --gtest_list_tests オプションを内包するだけの意味しか持っていなかった。
* test_result_filter_tell_AppVeyor.bat は AppVeyor に特有なので appveyor.yml に書くのが適当。
* Cppcheck には Config の別を伝えていないので、Config:Debug でだけ実行すれば十分。
* ヘルプとインストーラの作成は Config:Release でだけ実行する。
@ds14050
Copy link
Contributor Author

ds14050 commented Feb 19, 2019

気がついたので最新の master に rebase しました。

@m-tmatma m-tmatma removed this from the v2.4.0 milestone Jun 13, 2020
@ds14050 ds14050 closed this Jun 14, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CI appveyor など CI 関連 【ChangeLog除外】 refactoring リファクタリング 【ChangeLog除外】
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants