2019-05-20

require_actionがエラーになる

今年4月に、いわゆる働き方改革関連法が施行された。その目玉は「残業時間の上限規制」(労使協定があったとしても超えられない上限を定めたこと)だそうな。 この法律に当て込んでか「わたし、定時で帰ります。」なんてドラマも始まっている。

サラリーマンの長時間労働を是正しましょうみたいな、耳タコな問題への小手先の方策に対して、大仰に 改革 とか銘打つあたり、ヘソが茶を沸かす。わざわざ新規に立法するようなことか。

お上に決めていただかないと、残業をやめることも、有給休暇の取得もできないような労働者の容態(国民性?)にこそ根本的な問題があるんじゃないの?

歴史と伝統が何より大切な美しい国では、空気を読んで皆(みんな)と同じように行動することが何より重要なので、定時に帰ると嫌われるから仕方ないか。

日本の会社は営利事業団体ではなく、社会保障団体だという指摘は50年前からあるが、まずはそのあたり、徴税や社会福祉を企業に押し付けるようなシステムから改革したらどうなんだろう、滅私奉公するような人間も減ると思うが……

ま、到底ムリだろうということで、あきらめて、大昔に作ったMac用の Objective-C プログラムを64-bit対応にするお仕事をすることにした。

そいつはプロジェクトフォーマットが「Xcode 2.4-互換」時代のものである。ターゲット(実行ファイル)アーキテクチャは32-bit ppc と i386 のユニバーサル! なんと懐かしい(PowerPC搭載Macなんて、若い人は実物を見たこともないだろう)。

この記事を書いている時点で最新の macOS Mojave 10.14.5 + Xcode 10.2.1 で古いプロジェクトを開いてみると、エラーと警告の嵐だった。IDEの画面を埋め尽くす赤色、黄色のアイコンに圧倒され諦めかけたが、よく見るとすべて同じようなエラーである。

require()require_action() の部分に発生している。

なんだっけこれ? 最近Macのプログラムを書いてないのですっかり忘れていたが、これらは AssertMacros.h に定義されているApple独自のアサートマクロだ。次のような仲間がいる。

check(assertion)
check_noerr(errorCode)
check_noerr_string(errorCode, message)
check_string(assertion, message)
require(assertion, exceptionLabel)
require_action(assertion, exceptionLabel, action)
require_action_string(assertion, exceptionLabel, action, message)
require_noerr(errorCode, exceptionLabel)
require_noerr_action(errorCode, exceptionLabel, action)
require_noerr_action_string(errorCode, exceptionLabel, action, message)
require_noerr_string(errorCode, exceptionLabel, message)
require_string(assertion, exceptionLabel, message)
verify(assertion)
verify_action(assertion, action)
verify_noerr(errorCode)
verify_noerr_action(errorCode, action)
verify_noerr_string(errorCode, message)
verify_string(assertion, message)
ncheck(assertion)
ncheck_string(assertion, message)
nrequire(assertion, exceptionLabel)
nrequire_action(assertion, exceptionLabel, action)
nrequire_action_quiet(assertion, exceptionLabel, action)
nrequire_action_string(assertion, exceptionLabel, action, message)
nrequire_quiet(assertion, exceptionLabel)
nrequire_string(assertion, exceptionLabel, string)
nverify(assertion)
nverify_string(assertion, message)
require_action_quiet(assertion, exceptionLabel, action)
require_noerr_action_quiet(errorCode, exceptionLabel, action)
require_noerr_quiet(errorCode, exceptionLabel)
require_quiet(assertion, exceptionLabel)
check_compile_time( expr )
debug_string(message)

macOS High Sierra 10.13 以降これらマクロの名前が変更されたことがエラーの原因だった。エラーへの対処方法も同ヘッダファイル内に書かれている(ヘッダ内をキーワード「find」で検索)。

とりあえずプロジェクトの設定で、

  • Architecturesを 64-bit Intel に変更
  • Base SDKを macOS に変更
  • Preprocessor Macrosに __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES を追加

しただけで、ビルドできるようになった。 deprecated なAPIを呼び出しているという警告は残るものの、プログラムは正常に動作することを確認。あっさり64-bit化できてしまった。

AssertMacros.hのような秘伝のタレを使い続けるプログラマーに配慮してくれるとは、大したものだ。ドラスティックな改革が大好きで互換性など知ったこっちゃない(古いものをすぐに切り捨ててしまう)アップルにしては、なかなかやるじゃないか、少し見直したぞ。

0 件のコメント:

コメントを投稿