sasha75 (sasha75) wrote in programmer_il,
sasha75
sasha75
programmer_il

Version management

Добрый день! Помогите в решении непростой проблемы:
Код проекта, который я "поддерживаю" состоит из кода под Linux и кода для микроконтроллеров, который компилируется в двух кросс-компиляторах под Windows. Дерево директориев общее, все проекты используют общий файл version.h с определением текущей версии. Проблема в том, что кросс-компиляторы запускают скрипты (bash) для создания разных версий бинарников, создают директории и пр., при этом используют переменную окружения (environment variable) SOFTWARE_VERSION, которую надо определять в каждой среде вручную :(. Как можно свести управление версиями только к изменению version.h? Есть 2 идеи:
- определять SOFTWARE_VERSION в version.h и добавлять ее в environment variables - не нашел как это делается, возможно ли это вообще?
- парсить version.h в скрипте и извлекать оттуда SOFTWARE_VERSION - понятия не имею, как это делать
Есть профессиональные варианты решения проблемы? Всем спасибо заранее.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 14 comments

snark_

September 1 2016, 10:11:36 UTC 1 year ago Edited:  September 1 2016, 10:12:16 UTC

А нельзя эту переменную определять не в средах, а в скрипте, который запускает компиляторы?
Нет такого скрипта. Bash скрипт, про который я написал, делает post-build для каждого проекта в workspace. Допустим, я его напишу, но что делать с компиляцией в Linux? Очень хотелось бы обойтись одним version.h на все под-проекты.

Deleted comment

если можно, поподробнее
Так чем же запускаются кросс-компиляторы? Если "make", то для Linux/Unix Makefile:
SOFTWARE_VERSION := $(shell grep SOFTWARE_VERSION version.h | awk '{print NF}')
а потом использыйте $(SOFTWARE_VERSION) там, где надо, в Makefile-е.
Среда создает makefile за кулисами и запускает его в Windows, уж не знаю как. Если я правильно понял, это вариант 2: парсить version.h и извлекать из него SOFTWARE_VERSION?
Да, вариант 2. Т.к. непонятно, что есть "среда".
ок, спасибо. "Среда" -это LPCXpresso и еще одна более экзотическая

pesec

September 4 2016, 18:16:51 UTC 1 year ago Edited:  September 4 2016, 18:17:43 UTC

LPCXpresso для меня достаточно экзотическая.

Если не Unix/Linux, то парсить можно средствами cmd в Windows.

version.h:
/* version file start */
#define SOFTWARE_VERSION 0x12345
/* version file end */

version.bat:
@echo off
for /f "tokens=3" %%i in ('FINDSTR "SOFTWARE_VERSION" version.h') do set myver=%%i
echo myver=%myver%

cmd /c version.bat:
myver=0x12345
Спасибо
Если будет скрипт, определяющий environment variable MYVAR, который вызывает make, то в Makefile-e нужно прописать что-то типа:
CFLAGS += -DMYVAR_XXX=$(MYVAR)
или вызывать "make MYVAR_XXX=$MYVAR", а в version.h определить:
#define SOFTWARE_VERSION MYVAR_XXX
Это делает обратное - позволяет из .h файла "увидеть" переменные окружения. Такие примеры я нашел, но это менее удобно, так как придется делать много дополнительной работы: добавить pre-build скрипт в Linux и в Windows.
> парсить version.h в скрипте и извлекать оттуда SOFTWARE_VERSION - понятия не имею, как это делать

Либо sed'ом, либо на понятном человеку языке как-нибудь так:
(Warning: untested code)
#!/usr/bin/env python
ver = None
with open("version.h") as f:
    for line in f:
        tokens = line.split()
		if len(tokens) == 3 and tokens[0] == "#define" and tokens[1] == "SOFTWARE_VERSION":
			ver = tokens[2]
			break
			
			
Спасибо, попробую
Такие вещи обычно решаются на этапах до собственно билда. Если у вас кросс-платформ, то это наверняка cmake. В cmake это делается командой configure_file.