Как я могу заставить свой код C автоматически распечатывать свой хеш версии Мерзавца?

нет никакого простого способа узнать емкость памяти объекта Python . Одна из проблем, которые можно найти, - то, что Python возражает - как списки, и dicts - может иметь ссылки на другие объекты Python (в этом случае, каков размер был бы? Размер, содержащий размер каждого объекта или нет?). Существуют некоторые указатели служебные и внутренние структуры, связанные с типами объектов и сборкой "мусора". Наконец, некоторые объекты Python имеют неочевидные поведения. Например, списки резервируют пространство для большего количества объектов, чем они имеют большую часть времени; dicts еще более сложны, так как они могут работать по-разному (у них есть различная реализация для небольшого количества ключей, и иногда они выделяют записи).

существует большой блок кода обновил большой блок кода ) там, чтобы попытаться лучше всего приблизить размер объекта Python в памяти.

можно также хотеть проверить [приблизительно 112] старое описание о PyObject (внутренняя структура C, которая представляет фактически все объекты Python).

76
задан AndyL 10 November 2009 в 00:30
поделиться

7 ответов

В моей программе я храню номер версии git и дату сборки в отдельном файле с именем version.c , который выглядит так:

#include "version.h"
const char * build_date = "2009-11-10 11:09";
const char * build_git_sha = "6b54ea36e92d4907aba8b3fade7f2d58a921b6cd";

Существует также файл заголовка, который выглядит так:

#ifndef VERSION_H
#define VERSION_H
extern const char * build_date; /* 2009-11-10 11:09 */
extern const char * build_git_sha; /* 6b54ea36e92d4907aba8b3fade7f2d58a921b6cd */
#endif /* VERSION_H */

И файл заголовка, и файл C генерируются сценарием Perl, который выглядит следующим образом:

my $git_sha = `git rev-parse HEAD`;
$git_sha =~ s/\s+//g;
# This contains all the build variables.
my %build;
$build{date} = make_date_time ();
$build{git_sha} = $git_sha;

hash_to_c_file ("version.c", \%build, "build_");

Здесь hash_to_c_file выполняет всю работу по созданию version.c и version.h , а make_date_time создает строку, как показано.

В основной программе у меня есть подпрограмма

#include "version.h"

// The name of this program.
const char * program_name = "magikruiser";
// The version of this program.
const char * version = "0.010";

/* Print an ID stamp for the program. */

static void _program_id_stamp (FILE * output)
{
    fprintf (output, "%s / %s / %s / %s\n",
             program_name, version,
             build_date, build_git_sha);
}

Я плохо разбираюсь в git, поэтому

38
ответ дан 24 November 2019 в 11:07
поделиться

There are two things that you can do:

  • You can make Git to embed some version information in the file for you.

    The simpler way is to use ident attribute, which means putting (for example)

    *.yaml ident
    

    in .gitattributes file, and $Id$ in the appropriate place. It would be automatically expanded to SHA-1 identifier of the contents of the file (blob id): this is NOT file version, or the last commit.

    Git does support $Id$ keyword in this way to avoid touching files which were not changed during branch switching, rewinding branch etc. If you really want Git to put commit (version) identifier or description in the file, you can (ab)use filter attribute, using clean/ smudge filter to expand some keyword (e.g. $Revision$) on checkout, and clean it up for commit.

  • You can make build process to do that for you, like Linux kernel or Git itself does.

    Take a look at GIT-VERSION-GEN script and its use in Git Makefile, or for example how this Makefile embeds version information during generation / configuration of gitweb/gitweb.cgi file.

    GIT-VERSION-GEN uses git describe to generate version description. It needs to work better that you tag (using signed / annotated tags) releases / milestones of your project.

7
ответ дан 24 November 2019 в 11:07
поделиться

Ваша программа может выполнять оболочку git describe либо во время выполнения, либо как часть процесса сборки.

9
ответ дан 24 November 2019 в 11:07
поделиться

Когда мне нужно это сделать, я использую тег , например RELEASE_1_23 . Я могу решить, что это за тег, не зная SHA-1. Я фиксирую и помечаю. Вы можете сохранить этот тег в своей программе в любом случае.

4
ответ дан 24 November 2019 в 11:07
поделиться

Что вам нужно сделать, так это сгенерировать файл заголовка (например, используя echo из строки cmd) примерно так:

#define GIT_HASH \
"098709a0b098c098d0e"

Чтобы сгенерировать его, используйте что-то вроде этого:

echo #define GIT_HASH \ > file.h
echo " > file.h
echo git status <whatever cmd to get the hash> > file.h
echo " > file.h

Может потребоваться немного поиграйте с кавычками и обратными косыми чертами, чтобы заставить его скомпилировать, но вы поняли идею.

2
ответ дан 24 November 2019 в 11:07
поделиться

Вы можете увидеть, как я сделал это для memcached, в исходной фиксации .

В основном, иногда помечайте теги и убедитесь, что то, что вы доставляете, исходит от make dist или аналогичный.

0
ответ дан 24 November 2019 в 11:07
поделиться

I ended up using something very similar to @Kinopiko's answer, but I used awk instead of perl. This is useful if your stuck on windows machines which have awk installed by nature of mingw, but not perl. Here's how it works.

My makefile has a line in it that invokes git, date, and awk to create a c file:

$(MyLibs)/version.c: FORCE 
    $(GIT) rev-parse HEAD | awk ' BEGIN {print "#include \"version.h\""} {print "const char * build_git_sha = \"" $$0"\";"} END {}' > $(MyLibs)/version.c
    date | awk 'BEGIN {} {print "const char * build_git_time = \""$$0"\";"} END {} ' >> $(MyLibs)/version.c 

Everytime I compile my code, the awk command generates a version.c file that looks like this:

/* version.c */
#include "version.h"
const char * build_git_sha = "ac5bffc90f0034df9e091a7b3aa12d150df26a0e";
const char * build_git_time = "Thu Dec  3 18:03:58 EST 2009";

I have a static version.h file that looks like this:

/*version.h*/
#ifndef VERSION_H_
#define VERSION_H_

extern const char * build_git_time;
extern const char * build_git_sha;


#endif /* VERSION_H_ */

The rest of my code can now access the build-time and the git hash by simply including the version.h header. To wrap it all up, I tell git to ignore version.c by adding a line to my .gitignore file. This way git isn't constantly giving me merge conflicts. Hope this helps!

11
ответ дан 24 November 2019 в 11:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: