2016-10-22 7 views
1

私は、bashまたはバッチビルドスクリプトを呼び出すビルドシステムを作成しました。今のところ、新しいプロジェクトにビルドスクリプトをコピーして貼り付け、プロジェクト関連のプロパティを変更します。プロジェクト依存のビルドシステム変数を設定する

毎回スクリプトを修正する必要がなくなるように(または、たとえばグローバルに設定されているものだけを使用して)、崇高なプロジェクト設定でいくつかの変数を設定し、ビルドシステムでそれらを取得できるようにしたいそれらを引数としてスクリプトに送ります。

このプロジェクトは、プロジェクトごとのビルドシステムを定義する必要はありませんか?

それはここでは関係である場合には、いくつかの単純化ビルドスクリプト

#!/bin/bash 
exe=some_defined_exe 

mkdir -p build 
cd build 
cmake .. 
make -j4 
make install 
cd ../bin 
$exe 
cd .. 

され、システム

{ 
    "cmd": ["build.sh"], 
    "working_dir": "${project_path:${folder}}", 
    "shell": false, 
} 

を構築し、私は彼らが

#!/bin/bash 
exe=$1 

mkdir -p build 
cd build 
cmake .. 
make -j4 
make install 
cd ../bin 
$exe 
cd .. 

のようなものになりたいです
{ 
    "cmd": ["build.sh", "${some_project_defined_variable}"], 
    "working_dir": "${project_path:${folder}}", 
    "shell": false, 
} 
+0

これは、標準ビルドシステムの背後にあるプログラムである 'exec.py'の修正版を作成しない限り不可能です。 – MattDMo

答えて

3

既にカスタムビルドシステムを使用しているので、少しのプラグインコードとカスタムビルドシステムのいくつかの変更を使用して、このようなものを引き出すことができます。

カスタムビルドシステムでは、ビルドを実行するコマンドを指定するtargetという名前のプロパティが許可されています。これを指定しないと(ほとんどのビルドシステムではない)、デフォルトはexecコマンドです。あなたは、あなたのための拡張を実行できる独自のカスタムコマンドを作成することができます。

単純な例として、Userパッケージにcustom_build.pyのように保存できるpythonのソースコードを参照してください。これにより、my_custom_buildという新しいコマンドが実装されます。このコマンドを実行すると、変数を展開してデフォルトのexecコマンドを実行して、引数を変換します。

import sublime, sublime_plugin 

# List of variable names we want to support 
custom_var_list = ["proj_var_1"] 

class MyCustomBuildCommand(sublime_plugin.WindowCommand): 
    def createExecDict(self, sourceDict): 
     global custom_var_list 

     # Get the project specific settings 
     project_data = self.window.project_data() 
     project_settings = (project_data or {}).get ("settings", {}) 

     # Get the view specific settings 
     view_settings = self.window.active_view().settings() 

     # Variables to expand; start with defaults, then add ours. 
     variables = self.window.extract_variables() 
     for custom_var in custom_var_list: 
      variables[custom_var] = view_settings.get (custom_var, 
       project_settings.get (custom_var, "")) 

     # Create arguments to return by expanding variables in the 
     # arguments given. 
     args = sublime.expand_variables (sourceDict, variables) 

     # Rename the command paramter to what exec expects. 
     args["cmd"] = args.pop ("command", []) 

     return args 

    def run(self, **kwargs): 
     self.window.run_command ("exec", self.createExecDict (kwargs)) 

具体的には、まず、現在のビューで指定した設定の変数を探し、それらは、プロジェクト固有の設定では、そこに見つからない場合。まだ見つからない変数は、デフォルトで空の文字列になります。

次のようなカスタムビルドシステムを指定する必要があります:今、カスタムコマンドがexecの代わりに実行する必要があることを指定しtargetフィールドがある

{ 
    "target": "my_custom_build", 
    "command": ["build.sh", "${proj_var_1}"], 

    "working_dir": "${project_path:${folder}}", 
    "shell": false 
} 

注意を。また、コマンドラインをcmdと指定する代わりに、ここではcommandと指定します。

これは、Sublimeがカスタムコマンドを実行する前にビルドシステムで既知のキーの値を事前展開しているように見えるためです。その結果、cmdキー内の変数を拡張しようとします。${proj_var_1}が空の文字列に展開され、コマンドがそれを見てもわからなくなってしまいます。

これを回避するために、キーの名前をSublimeが単独で残しておき、コード内に戻すようにキーの名前を変更します。

上記のコードは、ビルドシステムのどこにでも表示される変数を拡張しようとしますが、このようにしてcmdキーを保護するように特別な注意を払っています。たとえば、working_dirキーでカスタム変数を使用する場合は、同様の操作を行う必要があります。

+0

Wonderful、thanks :) – Zouch

関連する問題