2013年8月31日土曜日

gradle でOSのアーキテクチャ情報を利用する方法を語りき

概要
 最近流行りのビルドツール gradle でOSが32bitか64bitか切り分け方法

対象者
  gradle を使っている初心者以上


背景
 gradle は単純なビルドツールだけでなく、個人のPCの環境セットアップを助けるツールとしても注目されている。PCの環境は場合によりけりのため簡単に切り分ける手段が求められている

一般的な情報
 gradle の環境系で最もよくまとまっているものとして 「Gradle で環境ごとにあれもこれも変更する - bluepapa32’s Java Blog」がある。ここでは、antモジュールを用いて

ant.condition(property: "os", value: "windows") { os(family: "windows") } ant.condition(property: "os", value: "unix" ) { os(family: "unix") }

を定義することで、

ant.properties['os']

に windows, unix(Linux/Mac) の値が入る。antでは考えられないぐらい簡単だ。しかし、eclipseなどはOSの種類だけでなく x86 か ia64 なのかによってもバイナリが異なるものがある。これらを切り分けるには更に深く入りこんでみる。
How to detect the current OS from gradle - Stack Overflow」 を見てみるとどうも、 前記処理のバックエンドは org.apache.tools.ant.taskdefs.condition.Os に有るようである。
GrepCode: org.apache.tools.ant.taskdefs.condition.Os (.java) - Class - Source Code Viewでソースを見ると色々と値がある。試しに利用するソースを書くと、

import org.apache.tools.ant.taskdefs.condition.Os
task checkWin() << {    println Os.OS_NAME
    println Os.OS_ARCH
    println Os.OS_VERSION
    println Os.PATH_SEP
}
結果は、
windows 7
x86
6.1
;
なかなか使えるが、パッケージをDLするので環境作成に時間がかかってしまうようにみえる。
ant.condition()は早いのに謎だ。ならもっと簡単な方法はないかと、 Osのコードを見ると、

String OS_ARCH = System.getProperty("os.arch").toLowerCase(Locale.ENGLISH);

と、system propそのまま。わざわざantをって

ant.condition(property: "arch", value: "x86" ) { os(ARCH: "x86") }
ant.condition(property: "arch", value: "amd64") { os(ARCH: "amd64") }
ant.condition(property: "arch", value: "ia64") { os(ARCH: "ia64") }
として

ant.properties['arch]

と利用するのもいまいちピンとこない。なので、gradleでもsystem propを使うのがいいかと思う。

ここで、一旦話を撃ち切って、osの種類は取得をantを使わないようにしてみると

public class OSChecker{
    static public String getFamily(){
        String os=System.getProperty("os.name");
        if(os==null)
            return "";
        else if(os.startsWith("Windows"))
            return "windows";
        else if(os.startsWith("Mac OS X"))
            return "mac";
        else if(os.startsWith("Linux"))
            return "unix";
        return ""
    }
}
と書いて、

println OSChecker.getFamily()

とすれば、似たようなことはできるが、行数も多くなる。
 ant.condition() のほうがシンプルなのは明白


結論
OSの種類は従来の 
ant.condition(property: "os", value: "windows") { os(family: "windows") }
ant.condition(property: "os", value: "unix"   ) { os(family: "unix")    }
 が最もシンプル。
アーキテクチャが32bit、64bitのどちらか判定するのは

System.getProperty("os.arch")
で x86, amd64, ia64 を見分けるので十分。
想像以上に単純になる

0 件のコメント:

コメントを投稿