2010-11-15 1 views
3

GNU Hello - пример проекта GNU для лучших практик, стандартов кодирования, интернационализации, автоматизации конфигурации и т. Д.Есть ли проект «Hello, World», подобный GNU, для библиотек?

Есть ли аналогичный проект, предназначенный для библиотек? Я понимаю, что GNU Hello можно использовать таким образом, но не хватало бы некоторых методов, связанных с библиотекой?

Я также искал хорошие учебники по этой теме, и Program Library HOWTO представляется наиболее подходящим. Есть ли у вас другие предложения?

+4

Мое предложение, чтобы избежать (как чумы) стиль кодирования GNU. Это не только раздражает писать, но особенно неприятно встречаться в дикой природе. К счастью, в серьезном коде это не очень много. – jer

+0

Да, это выглядит ужасно, но я полагаю, что козыри последовательности выглядят здесь, если вы делаете проект для самой GNU. Тем не менее, я больше ищу «плиту котла autoconf» и тому подобное. –

+1

Действительно, держитесь подальше от стиля кодирования GNU, если вы не пишете код, для которого вы планируете назначать авторские права на FSF в качестве официальной части «GNU». Это худший стиль кодирования, и практика GNU для использования autoconf и т. Д. Тоже довольно ужасна (многократные вложенные уровни скриптов configure запускаются * после того, как * вы закончите выполнение основной настройки и введите 'make'? Gimme a break ..) Я бы посмотрел на другие места для лучших практик. –

ответ

1

Существует проект под названием libabc: shared library skeleton созданный Поттеринг:

Чтобы сделать все, мы собрали примерную библиотеку скелета, которую мы назвали libabc, чей файл README содержит все наши точки в краткой форме.

http://0pointer.de/blog/projects/libabc.html

1

Ниже приведены некоторые рекомендации, которые я регулярно выношу. Я не совсем уверен, насколько полезными они будут:

http://en.wikipedia.org/wiki/Indent_style

http://www.python.org/dev/peps/pep-0007/

В противном случае, я просто пытаюсь соответствовать тому, что я вижу. Рассмотрение приведенных выше руководств по стилю должно дать вам хорошее представление о том, какие последовательности искать и пытаться сопоставить в коде.

Edit:

я должен уточнить, вышеуказанные руководства не являются специфическими для GNU, но может помочь вам найти консистенцию, такие как именования схемы или вкладки/распорных направляющих.

0

Я прочитал в руководстве GNU и нашел короткий пример, который я думаю, что бы заставить вас хороший старт:

Straight from the manual:

/* hello.c -- print a greeting message and exit. 

    Copyright (C) 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 
    2005, 2006, 2007 Free Software Foundation, Inc. 

    This program is free software; you can redistribute it and/or modify 
    it under the terms of the GNU General Public License as published by 
    the Free Software Foundation; either version 3, or (at your option) 
    any later version. 

    This program is distributed in the hope that it will be useful, 
    but WITHOUT ANY WARRANTY; without even the implied warranty of 
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
    GNU General Public License for more details. 

    You should have received a copy of the GNU General Public License 
    along with this program; if not, write to the Free Software Foundation, 
    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 

#include <config.h> 
#include "system.h" 

/* String containing name the program is called with. */ 
const char *program_name; 

static const struct option longopts[] = 
{ 
    { "greeting", required_argument, NULL, 'g' }, 
    { "help", no_argument, NULL, 'h' }, 
    { "next-generation", no_argument, NULL, 'n' }, 
    { "traditional", no_argument, NULL, 't' }, 
    { "version", no_argument, NULL, 'v' }, 
    { NULL, 0, NULL, 0 } 
}; 

static void print_help (void); 
static void print_version (void); 

int 
main (int argc, char *argv[]) 
{ 
    int optc; 
    int t = 0, n = 0, lose = 0; 
    const char *greeting = NULL; 

    program_name = argv[0]; 

    /* Set locale via LC_ALL. */ 
    setlocale (LC_ALL, ""); 

#if ENABLE_NLS 
    /* Set the text message domain. */ 
    bindtextdomain (PACKAGE, LOCALEDIR); 
    textdomain (PACKAGE); 
#endif 

    /* Even exiting has subtleties. The /dev/full device on GNU/Linux 
     can be used for testing whether writes are checked properly. For 
     instance, hello >/dev/full should exit unsuccessfully. On exit, 
     if any writes failed, change the exit status. This is 
     implemented in the Gnulib module "closeout". */ 
    atexit (close_stdout); 

    while ((optc = getopt_long (argc, argv, "g:hntv", longopts, NULL)) != -1) 
    switch (optc) 
     { 
     /* One goal here is having --help and --version exit immediately, 
      per GNU coding standards. */ 
     case 'v': 
     print_version(); 
     exit (EXIT_SUCCESS); 
     break; 
     case 'g': 
     greeting = optarg; 
     break; 
     case 'h': 
     print_help(); 
     exit (EXIT_SUCCESS); 
     break; 
     case 'n': 
     n = 1; 
     break; 
     case 't': 
     t = 1; 
     break; 
     default: 
     lose = 1; 
     break; 
     } 

    if (lose || optind < argc) 
    { 
     /* Print error message and exit. */ 
     if (optind < argc) 
     fprintf (stderr, _("%s: extra operand: %s\n"), 
     program_name, argv[optind]); 
     fprintf (stderr, _("Try `%s --help' for more information.\n"), 
       program_name); 
     exit (EXIT_FAILURE); 
    } 

    /* Print greeting message and exit. */ 
    if (t) 
    printf (_("hello, world\n")); 

    else if (n) 
    /* TRANSLATORS: Use box drawing characters or other fancy stuff 
     if your encoding (e.g., UTF-8) allows it. If done so add the 
     following note, please: 

     [Note: For best viewing results use a UTF-8 locale, please.] 
    */ 
    printf (_("\ 
+---------------+\n\ 
| Hello, world! |\n\ 
+---------------+\n\ 
")); 

    else 
    { 
     if (!greeting) 
     greeting = _("Hello, world!"); 
     puts (greeting); 
    } 

    exit (EXIT_SUCCESS); 
} 


    
/* Print help info. This long message is split into 
    several pieces to help translators be able to align different 
    blocks and identify the various pieces. */ 

static void 
print_help (void) 
{ 
    /* TRANSLATORS: --help output 1 (synopsis) 
     no-wrap */ 
     printf (_("\ 
Usage: %s [OPTION]...\n"), program_name); 

    /* TRANSLATORS: --help output 2 (brief description) 
     no-wrap */ 
    fputs (_("\ 
Print a friendly, customizable greeting.\n"), stdout); 

    puts (""); 
    /* TRANSLATORS: --help output 3: options 1/2 
     no-wrap */ 
    fputs (_("\ 
    -h, --help   display this help and exit\n\ 
    -v, --version  display version information and exit\n"), stdout); 

    puts (""); 
    /* TRANSLATORS: --help output 4: options 2/2 
     no-wrap */ 
    fputs (_("\ 
    -t, --traditional  use traditional greeting format\n\ 
    -n, --next-generation use next-generation greeting format\n\ 
    -g, --greeting=TEXT  use TEXT as the greeting message\n"), stdout); 

    printf ("\n"); 
    /* TRANSLATORS: --help output 5 (end) 
     TRANSLATORS: the placeholder indicates the bug-reporting address 
     for this application. Please add _another line_ with the 
     address for translation bugs. 
     no-wrap */ 
    printf (_("\ 
Report bugs to <%s>.\n"), PACKAGE_BUGREPORT); 
} 


    
/* Print version and copyright information. */ 

static void 
print_version (void) 
{ 
    printf ("hello (GNU %s) %s\n", PACKAGE, VERSION); 
    /* xgettext: no-wrap */ 
    puts (""); 

    /* It is important to separate the year from the rest of the message, 
     as done here, to avoid having to retranslate the message when a new 
     year comes around. */ 
    printf (_("\ 
Copyright (C) %s Free Software Foundation, Inc.\n\ 
License GPLv3+: GNU GPL version 3 or later\ 
<http://gnu.org/licenses/gpl.html>\n\ 
This is free software: you are free to change and redistribute it.\n\ 
There is NO WARRANTY, to the extent permitted by law.\n"), 
       "2007"); 
} 
+0

OP хочет аналогичный пример для * библиотек * –