LINUX.ORG.RU

Номер версии без «умножения сущностей»

 , ,


0

1

Иногда требуются отдельные числа номера версии, иногда номер версии в виде строки.

Чтоб задавать его один раз сделал так:

#define VER_1 0
#define VER_2 0
#define VER_3 1
#define VER_S dev

#define QUOTE(x) #x

#define VERSION_(A,B,C,S) QUOTE(A.B.C.S)
#define VERSION VERSION_(VER_1,VER_2,VER_3,VER_S)

int main()
{
	puts(VERSION);
	return 0;
}
Получается вместо VERSION будет «0.0.1.dev».

Но меня терзают смутные сомнения — может можно как-то проще?

Я прохожу массивы сейчас, и сделал бы в нем, если потребовалось подобное. И вызывать удобно

minakov ★★★★★
()

#define QUOTE(x) #x
#define VERSION_(A,B,C,S) QUOTE(A.B.C.S)

Красиво.

pacify ★★★★★
()
Ответ на: комментарий от cdshines

А по факту подсказать ТС, да и мне заодно? Соседей обсирать-то много ума не надо, сам понимаешь, а вот интеллектуально конкурировать - занятие посложнее.

minakov ★★★★★
()
Ответ на: комментарий от minakov

А когда до структур дойдешь, будешь структуры предлагать? Тут вкаком-то соседнем треде недавно был срач на тему того, что нельзя советовать книжку, которую не прочел. Я думаю, так же не стоит советовать и в области, которой владеешь на уровне «прохожу массивы». Если бы не прошел массивы, советовал бы интами забивать просто, да?

cdshines ★★★★★
()

По-моему, вполне нормально. Единственное, ненужный больше нигде макрос QUOTE так и будет болтаться по коду. Так что имя ему нужно соответствующее.

А вообще, нельзя это сделать из системы сборки?

undet
()
Ответ на: комментарий от cdshines

Да! Первоначально так и хотел посоветовать. Однако вредный совет лучше отсутствия оных, если в голове работает отделитель зерен от плевел. Зато ты мне головомойку устроил и смотри сколько положительного - ТС увидит, что так как я делать нельзя, и мне опыт хороший. Так что спасибо за толчок от ямы, правда попрекать вебдевелопментом было несколько грубо :3

minakov ★★★★★
()

В общем подумал и решил сделать так. В файле version:

0.0.1 dev
В Makefile:
main: main.o version.o
	gcc $+ -o $@

main.o: main.c version.h
	gcc $< -c -o $@

version.o: version.c version.h version
	gcc $< -c \
-DVERSION="\"`cat version`\"" \
-DVER_1=`cut -d. -f1 version` \
-DVER_2=`cut -d. -f2 version` \
-DVER_3=`cut -d. -f3 version | cut -d' ' -f1` \
-DVER_S="\"`cut -d' ' -f2 version`\"" -o $@
В файле version.h:
#ifndef VERSION_H_INCLUDED
#define VERSION_H_INCLUDED

extern unsigned
	ver_1,
	ver_2,
	ver_3;

extern char
	*ver_s,
	*version;

#endif /* VERSION_H_INCLUDED */
В файле version.c:
#include "version.h"

unsigned
	ver_1=VER_1,
	ver_2=VER_2,
	ver_3=VER_3;

char
	*ver_s=VER_S,
	*version=VERSION;
В main.c:
#include <stdio.h>

#include "version.h"

int main()
{
	puts(version);

	printf("Или %u тчк %u тчк %u статус %s\n", ver_1, ver_2, ver_3, ver_s);

	return 0;
}
Вот в чём плюсы такого решения:

  • версия наглядно задаётся в одном месте
  • при изменении версии перекомпилируется только version.o, а не все кто заинклюдил version.h

Всем спасибо, а особенно undet, за идею использовать систему сборки.

LinuxUser ★★★
() автор топика

Да вполне нормально. А cmake может эти самые VER_X определять

Eddy_Em ☆☆☆☆☆
()

#define VERSION «$Revision»

пусть CVS (или что там сейчас в моде?) за тебя версии ставит.

beastie ★★★★★
()

у меня в specfile стоит __VERSION__ и его выставляет сборочный скрипт sed'ом

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от undet

нельзя препроцессором проверять

Они не для этой цели. Пока проверка препроцессором версии не требуется. И вроде и не будет требоваться в данном конкретном проекте.

LinuxUser ★★★
() автор топика

Я вытаскиваю текущую версию из ${CMAKE_SOURCE_DIR}/debian/changelog, а потом компиляю всё с -DVERSION=version

Сущность получается одна.

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.