際際滷

際際滷Share a Scribd company logo
ClangのModules

Cocoa茶氏	#62	/	2013-10-19	/	直翫局

Powered by Rabbit 2.1.1 and COZMIXNG
Highlights of Xcode 5
Compiler
Modules for system frameworks
to speed build time
Auto Link frameworks imported
by code modules (...)
"What?s New in Xcode"
Modules
Xcode 5 (Clang 3.3)の仟C嬬
iOS 7 or Mac OS X 10.9
C, Objective-C (C++ not ready)
ぶっちゃけ、あんまり
櫃砲靴覆てよい
Xcodeがよきに
はからってくれる
Modules
コンパイルが堀くなる(らしい)
あるNのprecompiled header
moduleg了でバイナリを伏撹
ASTをシリアライズしたもの(らしい)
fragileがうんぬんは麿のY創をてね。
Modules @import
// including header file
#import <Foundation/Foundation.h>
#import <Foundation/NSString.h>
// using Modules
@import Foundation;
@import Foundation.NSString;
あっとま`く	+	import。
ヘッダファイル兆でなくモジュ`ル兆をく。
宥械ヘッダファイル兆とモジュ`ル兆は揖じ。
Modules Auto Link
コ`ド嶄に@import
★駅勣なものを徭啜弔縫螢鵐。
リンクするライブラリやフレ`ムワ`
クの峺幣が音勣に。
Modules Auto Linking
clangを岷俊たたいてるなら、リンカ
オプションが音勣に。
-llib
-framework f
覆侭にないとき、-Iや-Fは駅勣
すこと
modulesとは	(gみ)
module.map
してみる
clang-3.4での仟C嬬	(の嚠協)
module.map
モジュ`ルを協xするファイル。
これさえあればライブラリ、フレ`ム
ワ`クがモジュ`ル鬉法
module.mapの嶄附はテキスト
module.map

$ cd `xcrun --sdk iphoneos
--show-sdk-path`
$ find . -name module.map
:
./System/Library/Frameworks/
Foundation.framework/module.m
:
./System/Library/Frameworks/
StoreKit/module.map
:
module.map
./System/Library/Frameworks/
UIKit.framework/module.map
:
./usr/include/module.map
./usr/include/objc/module.map
10.9は隆リリ`スだから、iOS7のSDKにあるmodule.mapをてみ
よう。
フレ`ムワ`クとinludeとヘッダファイルがあったような侭に
module.mapが崔かれている。
Foundation.framework/
module.map

framework module Foundation [system] {
umbrella header "Foundation.h"
export *
module * {
export *
}
module.mapの嶄附。しくはClangのドキュメントてね。
/usr/include/module.map

module Darwin [system] {
// Headers that are repeatedly inclu
// assigned to any given module.
exclude header "_structs.h"
exclude header "sys/_structs.h"
module cdefs {
header "sys/cdefs.h"
export *
}
/usr/include/module.map
// C standard library
module C {
module complex {
header "complex.h"
export *
}
:
"Module Map Language"
まだまだ笋錣蠅修Αclang 3.4で嚠s
Zもえてる。
iOS7 SDKでは聞われてないC嬬も。
config_macros
conflict
link
モジュ`ルとライブラリの兆念ちがうときにlink聞うぽい。
"Module declaration"
Name.framework/
module.map
/* module map file */
Headers/
Frameworks/
Resources/
Name
.frameworkのすぐ和にmodule.mapを崔くようになっている。
聞ってみる
iOS 7.0 SDKを歌深に、Mountain Lion
にmodule.mapをつっこむ

framework module Foundation [system] {
umbrella header "Foundation.h"
export *
module * {
export *
}
}
mod1.m / 書までのやり圭

#import <Foundation/Foundation.h>
int main (int argc, const char * argv[
@autoreleasepool {
NSLog(@"Hello, modules!");
}
return 0;
}
mod1.m / 書までのやり圭
% clang mod1.m -o mod1
-framework Foundation
# framework name ^^^^^^^^^^
% otool -L mod1
mod1:
/System/Library/Frameworks/
Foundation.framework/
Versions/C/Foundation (...)
:
mod2.m / Modulesを聞う

@import Foundation;
/* ^^^^ using modules */
int main (int argc, const char * argv[
@autoreleasepool {
NSLog(@"Hello, modules!");
}
return 0;
}
mod2.m / Modulesを聞う
% clang mod2.m -o mod2 -fmodules
# no -framework
^^^^^^^^^
% otool -L mod2
mod2:
:
/System/Library/Frameworks/
Foundation.framework/
Versions/C/Foundation (...)
#importを@importにiみ紋え
% clang mod1.m -o mod1 -fmodules
% ./mod1
2013-10-18 ...[] Hello, modules!
# works fine!
ソ`スコ`ド嶄は#importなのにモジュ`ルが聞えてる。
リンクするフレ`ムワ`クを-frameworkで峺協してない★徭咼螢
クがC嬬してる。
autolinkをo燭

% clang mod1.m -o mod1 -fmodules
-fno-autolink
#
disable autolink ^^^^^^^^^^^^^
Undefined symbols for architecture x86
"_NSLog", referenced from:
_main in mod1-dTLx89.o
:
XcodeでのO協
CLANG_ENABLE_MODULES:
YES ★ -fmodules

CLANG_MODULES_AUTOLINK:
NO ★ -fno-autolink
ここまでのまとめ
module.mapがあればmodulesが聞
える
#importも-fmodulesで@importと
して盾される
★コ`ド俐屎音勣
Apple井でない、clang-3.3でも揖
mod3.m / cache

@import Foundation.NSObjCRuntime;
/* ^^^^ using modules */
int main (int argc, const char * argv[
@autoreleasepool {
NSLog(@"Hello, modules!");
}
return 0;
}
mod3.m / cache

% clang mod3.m -o mod3 -fmodules
-fmodules-cache-path=./tmp
% find ./tmp
./tmp
./tmp/B76TNZTEB88L
./tmp/B76TNZTEB88L/_Builtin_intrinsics
./tmp/B76TNZTEB88L/Foundation.pcm
./tmp/B76TNZTEB88L/modules.idx
./tmp/modules.timestamp
mod3.m / cache

% clang -module-file-info
./tmp/.../Foundation.pcm
Information for module file
'./tmp/.../Foundation.pcm':
Generated by this Clang: (clang-500.
Language options:
C99: Yes
C11: No
Microsoft extensions: No
:
mod3.m / cache
% strings ./tmp/.../Foundation.pcm |
grep ^NS
NS,I
NSs@
NSGreaterThanPredicateOperatorType
NSURLRequest
NSInvalidArchiveOperationException
:
シンボルも秘ってるぽい。
Problems modules do not
solve
Rewrite the world's code
Versioning
Namespaces
Binary distribution of modules
"Clang 3.3 documentation"
clang-3.4 modules
C++ support (experimental)
compiler options
-fmodule-maps, -fmodule-mapfile, ...

module map lang
private, extern, use
clang-3.4 modularize
clang-tools-extra
generate module.map (r192703)
ヘッダファイルからmodule.mapを伏撹するC嬬が弖紗された。
Resources
Clang documentation
WWDC 2013
湖
ユ`ザ(_k宀)があまり櫃鮖悗気
くてもうまくいくよう、よく笋
れてる
まだまだ笋錣蠅修
ヘッダごとでなくmoduleg了で伏
撹することでパフォ`マンス借いで
る
K

Powered by Rabbit 2.1.1 and COZMIXNG

More Related Content

Clang Modules