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 - понятия не имею, как это делать
Есть профессиональные варианты решения проблемы? Всем спасибо заранее.
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

  • 14 comments

snark_

September 1 2016, 10:11:36 UTC 7 months 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 7 months 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.