Как я могу добавить версию сборки в сборку scons - PullRequest
3 голосов
/ 09 февраля 2011

В данный момент я использую магию, чтобы получить текущую версию git в своих сборках scons .. Я просто собираю версию и вставляю ее в CPPDEFINES. Это работает довольно хорошо ... пока версия не изменится и scons не захочет перестроить все, а не только файлы, которые изменились - потому что определено, что все используемые файлы изменились.

В идеале я бы сгенерировал файл, используя специальный конструктор с именем git_version.cpp и просто есть функция, которая возвращает правильный тег. Таким образом, будет перестроен только один файл.

Теперь я уверен, что видел учебник, показывающий, как именно это сделать ... но я не могу его отследить. И я нахожу, что нестандартные вещи для строителей немного странные в scons ...

Так что любые указатели будут оценены ...

В любом случае, просто для справки, вот что я сейчас делаю:

# Lets get the version from git
# first get the base version
git_sha = subprocess.Popen(["git","rev-parse","--short=10","HEAD"], stdout=subprocess.PIPE ).communicate()[0].strip()
p1 = subprocess.Popen(["git", "status"], stdout=subprocess.PIPE )
p2 = subprocess.Popen(["grep", "Changed but not updated\\|Changes to be committed"], stdin=p1.stdout,stdout=subprocess.PIPE)
result = p2.communicate()[0].strip()

if result!="":
  git_sha += "[MOD]"

print "Building version %s"%git_sha

env = Environment()
env.Append( CPPDEFINES={'GITSHAMOD':'"\\"%s\\""'%git_sha} )

1 Ответ

5 голосов
/ 09 февраля 2011

Вам не нужен пользовательский Builder, так как это всего лишь один файл.Вы можете использовать функцию (прикрепленную к целевому файлу версии как действие) для генерации файла версии.В приведенном ниже примере кода я уже вычислил версию и поместил ее в переменную окружения.Вы можете сделать то же самое, или вы можете поместить свой код, который делает git-вызовы в функцию version_action.

version_build_template="""/*
* This file is automatically generated by the build process
* DO NOT EDIT!
*/

const char VERSION_STRING[] = "%s";

const char* getVersionString() { return VERSION_STRING; }
"""

def version_action(target, source, env):
    """
    Generate the version file with the current version in it
    """
    contents = version_build_template % (env['VERSION'].toString())
    fd = open(target[0].path, 'w')
    fd.write(contents)
    fd.close()
    return 0

build_version = env.Command('version.build.cpp', [], Action(version_action))
env.AlwaysBuild(build_version)
...