ページ

2008年3月16日日曜日

Mail.h の謎(sdef と sdp)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

前回 Mail.app でメールを送る ADCのサンプルを紹介した。その中で Mail.h が生成されているのが分かった。これは OSに付属するわけでもなく、ビルド時に動的に生成されいるようだ。



サンプルの ReadMe.txtを読んでみるとビルド時に sdef と sdp コマンドを使ってヘッダファイルを生成していることが分かった。ターゲットのルールは次のようになっている。




sdef コマンドは指定したアプリケーションからスクリプト定義(scripting definitions) をXMLで取得する。sdp はそれを Objective-Cのヘッダファイルに加工する。それぞれの man を抜粋。

sdef

NAME
sdef -- scripting definition file

DESCRIPTION
Scripting definition files (sdefs) are XML files that describe everything
about an application scripting interface: terminology, implementation
information, and complete documentation. Applications may incorporate
them to define their own scriptability, and scripting clients such as
AppleScript and Scripting Bridge read them to determine what operations
an application supports.
  :


sdp
NAME
sdp -- scripting definition (sdef) processor

SYNOPSIS
sdp -f {ahst} [-o directory | file | -] [options...] [file]

DESCRIPTION
sdp transforms a scripting definition (``sdef'') file, or standard input
if none is specified, into a variety of other formats for use with a
scriptable application. The options are as follows:

-f format
Specify the output format. The format may be one or more of the
following. Use these when you want to create a scriptable applica-
tion:

a Rez(1) input describing an `aete' resource.
s Cocoa Scripting ``.scriptSuite'' file.
t Cocoa Scripting ``.scriptTerminology'' file.

These formats are only necessary when creating a scriptable appli-
cation that will run on Mac OS X 10.4 (Tiger) or earlier; as of
10.5 (Leopard), an application may use only an sdef.

Use these when you want to control a scriptable application:

h Scripting Bridge Objective-C header.

 :



試しに iTunes でこれらのコマンドを使ってみた。ターミナルから下記を実行する。

$ sdef /Applications/iTunes.app |sdp -fh --basename iTunes


すると iTunes.h というファイルが作成される。中身はこんな感じ。

/*
* iTunes.h
*/

#import
#import


@class iTunesPrintSettings, iTunesApplication, iTunesItem, iTunesArtwork, iTunesEncoder, iTunesEQPreset, iTunesPlaylist, iTunesAudioCDPlaylist, iTunesDevicePlaylist, iTunesLibraryPlaylist, iTunesRadioTunerPlaylist, iTunesSource, iTunesTrack, iTunesAudioCDTrack, iTunesDeviceTrack, iTunesFileTrack, iTunesSharedTrack, iTunesURLTrack, iTunesUserPlaylist, iTunesFolderPlaylist, iTunesVisual, iTunesWindow, iTunesBrowserWindow, iTunesEQWindow, iTunesPlaylistWindow;

typedef enum {
iTunesEKndTrackListing = 'kTrk' /* a basic listing of tracks within a playlist */,
iTunesEKndAlbumListing = 'kAlb' /* a listing of a playlist grouped by album */,
iTunesEKndCdInsert = 'kCDi' /* a printout of the playlist for jewel case inserts */
} iTunesEKnd;

typedef enum {
iTunesEnumStandard = 'lwst' /* Standard PostScript error handling */,
iTunesEnumDetailed = 'lwdt' /* print a detailed report of PostScript errors */
} iTunesEnum;
 :


ああなるほど。これは便利だ。