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