Theosを使ったMakefile

普段自分がTweakを作成するときは、Theosを使用してbuildしています。

Terminalから/opt/theos/bin/nic.plまたは$THEOS/bin/nic.plで何かしらの項目を選択すると、自動的に必要なファイルとMakefileが作成されます。

そのままでもいいのですが、自分がいつも使ってる方法を紹介します。

##Sample
<a href="https://github.com/ichitaso/UIRotation9/blob/master/Makefile" target="_blank" rel="nofollow">https://github.com/ichitaso/UIRotation9/blob/master/Makefile</a>

```lang:Makefile
PACKAGE_VERSION = $(THEOS_PACKAGE_BASE_VERSION)
GO_EASY_ON_ME := 1
ARCHS = armv7 arm64
LDFLAGS = -Wl,-segalign,0x4000
THEOS_DEVICE_IP = 192.168.0.12

TWEAK_NAME = UIRotation9
UIRotation9_FILES = Tweak.xm UIRController.m
UIRotation9_FRAMEWORKS = Foundation UIKit QuartzCore
UIRotation9_PRIVATE_FRAMEWORKS = GraphicsServices
UIRotation9_LDFLAGS = -lactivator


BUNDLE_NAME = UIRotationSettings
UIRotationSettings_FILES = Preference.m
UIRotationSettings_INSTALL_PATH = /Library/PreferenceBundles
UIRotationSettings_FRAMEWORKS = UIKit Social
UIRotationSettings_PRIVATE_FRAMEWORKS = Preferences


SUBPROJECTS += UIRotationHelper
SUBPROJECTS += UIRotationSwitch


include $(THEOS)/makefiles/common.mk
include $(THEOS_MAKE_PATH)/tweak.mk
include $(THEOS_MAKE_PATH)/bundle.mk
include $(THEOS_MAKE_PATH)/aggregate.mk

internal-stage::
	$(ECHO_NOTHING)mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences$(ECHO_END)
	$(ECHO_NOTHING)cp entry.plist $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/UIRotation.plist$(ECHO_END)

before-package::
	sudo chown -R root:wheel $(THEOS_STAGING_DIR)
	sudo chmod -R 755 $(THEOS_STAGING_DIR)
	sudo chmod 644 $(THEOS_STAGING_DIR)/Library/Switches/UIRotation.bundle/*

after-install::
	install.exec "killall -9 SpringBoard"
	make clean
	sudo rm -rf ./*.zip
	sudo mv _ $(THEOS_PACKAGE_NAME)_$(THEOS_PACKAGE_BASE_VERSION)_iphoneos-arm
	sudo rm -rf ./_
	zip -r $(THEOS_PACKAGE_NAME)_$(THEOS_PACKAGE_BASE_VERSION)_iphoneos-arm.zip ./$(THEOS_PACKAGE_NAME)_$(THEOS_PACKAGE_BASE_VERSION)_iphoneos-arm
	sudo rm -rf ./$(THEOS_PACKAGE_NAME)_$(THEOS_PACKAGE_BASE_VERSION)_iphoneos-arm
	rm -rf .obj
	rm -rf obj
#	rm -rf .theos
#	rm -rf *.deb
```

##先頭の行
```
PACKAGE_VERSION = $(THEOS_PACKAGE_BASE_VERSION)
```
こうすることによってTheosで作成したディレクトリ内のcontrolファイルに記載しているバージョンナンバーでコンパイルされます。
```
GO_EASY_ON_ME := 1
```
これを記載することによって足りない部分のコードでエラーが出てもMakeできるようになります。

最初は必要なヘッダーファイルなどを記載するのが面倒なので、記述しておくと楽です。

最終的にはMakeするときにエラーが無いようにします。
##中盤
```
include $(THEOS)/makefiles/common.mk
include $(THEOS_MAKE_PATH)/xxx.mk
```
このように記述することによって、theosへのシンボリックリンクがなくても、.bash_profileに/opt/theosへのリンクを記述していればMakeできるようになります。
```
$THEOS=/opt/theos
```
##before-package::
make packageでdebファイルへコンパイルする前にパーミッションと所有者を変更できます。

ただし、BigBossなどへ提出した場合は一度解凍されて独自のツールで再度パッケージを作成されるため、どうしてもパーミッションなどを残しておきたい場合はpostinstに記述しておきましょう。

##after-install::
```
install.exec "killall -9 SpringBoard"
make clean
sudo rm -rf ./*.zip
sudo mv _ $(THEOS_PACKAGE_NAME)_$(THEOS_PACKAGE_BASE_VERSION)_iphoneos-arm
sudo rm -rf ./_
zip -r $(THEOS_PACKAGE_NAME)_$(THEOS_PACKAGE_BASE_VERSION)_iphoneos-arm.zip ./$(THEOS_PACKAGE_NAME)_$(THEOS_PACKAGE_BASE_VERSION)_iphoneos-arm
 sudo rm -rf ./$(THEOS_PACKAGE_NAME)_$(THEOS_PACKAGE_BASE_VERSION)_iphoneos-arm
rm -rf .obj
```
このように記述することによって、BigBossやModmyiに提出する際、debファイルではなくzipで中身だけ送ることができるので、公式のリポ側で管理しやすくなるかと思います。

最初はzipの部分は消して、最終的に提出する際にzipで送るといいかと思います。