mail-notification

Fork of Jean-Yves Lefort's mail-notification, a tray icon to notify of new mail
git clone https://code.djc.id.au/git/mail-notification/

jbsrc/lib/src/core/jb-main.c (8449B) - raw

      1 /*
      2  * JB, the Jean-Yves Lefort's Build System
      3  * Copyright (C) 2008 Jean-Yves Lefort <jylefort@brutele.be>
      4  *
      5  * This program is free software; you can redistribute it and/or modify
      6  * it under the terms of the GNU General Public License as published by
      7  * the Free Software Foundation; either version 3 of the License, or
      8  * (at your option) any later version.
      9  *
     10  * This program is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  * GNU General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU General Public License along
     16  * with this program; if not, write to the Free Software Foundation, Inc.,
     17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
     18  */
     19 
     20 #include <locale.h>
     21 #include <string.h>
     22 #include "jb-action.h"
     23 #include "jb-feature.h"
     24 #include "jb-util.h"
     25 #include "jb-variable.h"
     26 #include "jb-compile-options.h"
     27 
     28 char *jb_topsrcdir = NULL;
     29 
     30 static gboolean
     31 parse_variable (const char *pair, char **name, char **value)
     32 {
     33   char *p;
     34   char *_name = NULL;
     35 
     36   p = strchr(pair, '=');
     37   if (! p)
     38     return FALSE;
     39 
     40   _name = g_strndup(pair, p - pair);
     41   if (*_name == '\0')
     42     return FALSE;
     43 
     44   *name = _name;
     45   *value = g_strdup(p + 1);
     46 
     47   return TRUE;
     48 }
     49 
     50 static void
     51 handle_variable (const char *pair)
     52 {
     53   char *name;
     54   char *value;
     55   JBVariable *variable;
     56   GError *err = NULL;
     57 
     58   if (! parse_variable(pair, &name, &value))
     59     jb_error("invalid variable specification \"%s\"", pair);
     60 
     61   variable = jb_variable_get_variable(name);
     62   if (variable == NULL || (variable->flags & JB_VARIABLE_USER_SETTABLE) == 0)
     63     jb_error("unknown variable \"%s\"", name);
     64 
     65   if (! jb_variable_set_from_string(variable, value, &err))
     66     jb_error("invalid value \"%s\" for %s variable \"%s\": %s",
     67 	     value,
     68 	     variable->type->name,
     69 	     name,
     70 	     err->message);
     71 
     72   variable->user_set = TRUE;
     73 }
     74 
     75 static GSList *
     76 parse_group_args (int argc, char **argv)
     77 {
     78   GSList *group_names = NULL;
     79   int i;
     80 
     81   for (i = 0; i < argc; i++)
     82     group_names = g_slist_append(group_names, g_strdup(argv[i]));
     83 
     84   return group_names;
     85 }
     86 
     87 static void
     88 parse_args (int argc, char **argv)
     89 {
     90   GSList *group_names;
     91   int i = 1;
     92 
     93   if (argc >= 2)
     94     {
     95       if (! strcmp(argv[1], "help")
     96 	  || ! strcmp(argv[1], "--help")
     97 	  || ! strcmp(argv[1], "-h")
     98 	  || ! strcmp(argv[1], "-?"))
     99 	{
    100 	  if (argc != 2)
    101 	    jb_error("too many arguments for \"help\" action; run \"./jb help\" for an usage summary");
    102 
    103 	  jb_action_help();
    104 	}
    105       else if (! strcmp(argv[1], "configure"))
    106 	{
    107 	  for (i++; i < argc; i++)
    108 	    handle_variable(argv[i]);
    109 
    110 	  jb_action_configure();
    111 	}
    112       else if (! strcmp(argv[1], "build"))
    113 	{
    114 	  group_names = parse_group_args(argc - 2, argv + 2);
    115 	  jb_action_build(group_names);
    116 	}
    117       else if (! strcmp(argv[1], "install"))
    118 	{
    119 	  group_names = parse_group_args(argc - 2, argv + 2);
    120 	  jb_action_install(group_names);
    121 	}
    122       else if (! strcmp(argv[1], "makedist"))
    123 	{
    124 	  if (argc != 2)
    125 	    jb_error("too many arguments for \"makedist\" action; run \"./jb help\" for an usage summary");
    126 
    127 	  jb_action_makedist();
    128 	}
    129       else if (! strcmp(argv[1], "clean"))
    130 	{
    131 	  group_names = parse_group_args(argc - 2, argv + 2);
    132 	  jb_action_clean(group_names);
    133 	}
    134       else if (! strcmp(argv[1], "distclean"))
    135 	{
    136 	  group_names = parse_group_args(argc - 2, argv + 2);
    137 	  jb_action_distclean(group_names);
    138 	}
    139       else if (! strcmp(argv[1], "maintainerclean"))
    140 	{
    141 	  group_names = parse_group_args(argc - 2, argv + 2);
    142 	  jb_action_maintainerclean(group_names);
    143 	}
    144       else
    145 	jb_error("unknown action \"%s\"; run \"./jb help\" for an usage summary", argv[1]);
    146     }
    147   else
    148     jb_error("not enough arguments; run \"./jb help\" for an usage summary");
    149 }
    150 
    151 void
    152 jb_main (int argc,
    153 	 char **argv,
    154 	 const char *package,
    155 	 const char *version,
    156 	 const char *human_package,
    157 	 const JBFeature **features,
    158 	 int num_features)
    159 {
    160   setlocale(LC_ALL, "");
    161 
    162   g_log_set_fatal_mask(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL);
    163 
    164   g_type_init();
    165 
    166   jb_topsrcdir = g_get_current_dir();
    167 
    168   jb_set_log_file("build/jb.log");
    169 
    170   jb_variable_init();
    171 
    172   jb_compile_options = jb_compile_options_new("package");
    173 
    174   jb_feature_set_list(features, num_features);
    175 
    176   /* these flags are needed by the JB GOB2 build mechanism */
    177   jb_compile_options_add_gob2flags(jb_compile_options, "--always-private-header --no-touch");
    178 
    179   jb_variable_set_string("package", package);
    180   jb_variable_set_string("version", version);
    181   jb_variable_set_string("human-package", human_package);
    182 
    183   jb_variable_add_string("cc",
    184 			 "C compiler command",
    185 			 jb_variable_group_compiler_options,
    186 			 0,
    187 			 "cc");
    188   jb_variable_add_string("cflags",
    189 			 "C compiler flags",
    190 			 jb_variable_group_compiler_options,
    191 			 0,
    192 			 "-O2");
    193   jb_variable_add_string("cppflags",
    194 			 "C preprocessor flags",
    195 			 jb_variable_group_compiler_options,
    196 			 0,
    197 			 NULL);
    198   jb_variable_add_string("ldflags",
    199 			 "C linker flags",
    200 			 jb_variable_group_compiler_options,
    201 			 0,
    202 			 NULL);
    203   jb_variable_add_string("libs",
    204 			 "C -l flags",
    205 			 jb_variable_group_compiler_options,
    206 			 0,
    207 			 NULL);
    208   jb_variable_add_bool("cc-dependency-tracking",
    209 		       "enable C compiler dependency tracking",
    210 		       jb_variable_group_compiler_options,
    211 		       0,
    212 		       TRUE);
    213 
    214   jb_variable_add_string("destdir",
    215 			 "destination directory",
    216 			 jb_variable_group_installation_options,
    217 			 0,
    218 			 NULL);
    219   jb_variable_add_string("prefix",
    220 			 "installation prefix",
    221 			 jb_variable_group_installation_options,
    222 			 0,
    223 			 "/usr/local");
    224 
    225   jb_variable_add_string("bindir",
    226 			 "user executables directory",
    227 			 jb_variable_group_installation_options,
    228 			 0,
    229 			 "$prefix/bin");
    230   jb_variable_add_string("libdir",
    231 			 "shared libraries directory",
    232 			 jb_variable_group_installation_options,
    233 			 0,
    234 			 "$prefix/lib");
    235   jb_variable_add_string("libexecdir",
    236 			 "private executables directory",
    237 			 jb_variable_group_installation_options,
    238 			 0,
    239 			 "$prefix/libexec");
    240   jb_variable_add_string("datadir",
    241 			 "read-only architecture-independent data directory",
    242 			 jb_variable_group_installation_options,
    243 			 0,
    244 			 "$prefix/share");
    245   jb_variable_add_string("sysconfdir",
    246 			 "per-machine configuration directory",
    247 			 jb_variable_group_installation_options,
    248 			 0,
    249 			 "$prefix/etc");
    250   jb_variable_add_string("localstatedir",
    251 			 "per-machine state directory",
    252 			 jb_variable_group_installation_options,
    253 			 0,
    254 			 "$prefix/var");
    255 
    256   jb_variable_set_string("pkglibdir", "$libdir/$package");
    257   jb_variable_set_string("pkgdatadir", "$datadir/$package");
    258   jb_variable_set_string("pkgsysconfdir", "$sysconfdir/$package");
    259 
    260   jb_variable_add_mode("data-mode",
    261 		       "data file permissions (octal)",
    262 		       jb_variable_group_installation_options,
    263 		       0,
    264 		       0644);
    265   jb_variable_add_string("data-owner",
    266 			 "data file owner",
    267 			 jb_variable_group_installation_options,
    268 			 0,
    269 			 NULL);
    270   jb_variable_add_string("data-group",
    271 			 "data file group",
    272 			 jb_variable_group_installation_options,
    273 			 0,
    274 			 NULL);
    275   jb_variable_add_mode("program-mode",
    276 		       "program file permissions (octal)",
    277 		       jb_variable_group_installation_options,
    278 		       0,
    279 		       0755);
    280   jb_variable_add_string("program-owner",
    281 			 "program file owner",
    282 			 jb_variable_group_installation_options,
    283 			 0,
    284 			 NULL);
    285   jb_variable_add_string("program-group",
    286 			 "program file group",
    287 			 jb_variable_group_installation_options,
    288 			 0,
    289 			 NULL);
    290   jb_variable_add_mode("library-mode",
    291 		       "library file permissions (octal)",
    292 		       jb_variable_group_installation_options,
    293 		       0,
    294 		       0644);
    295   jb_variable_add_string("library-owner",
    296 			 "library file owner",
    297 			 jb_variable_group_installation_options,
    298 			 0,
    299 			 NULL);
    300   jb_variable_add_string("library-group",
    301 			 "library file group",
    302 			 jb_variable_group_installation_options,
    303 			 0,
    304 			 NULL);
    305 
    306   jb_feature_init();
    307   jb_package_init();
    308 
    309   parse_args(argc, argv);
    310 }
    311 
    312 void
    313 jb_set_prefix_from_program (const char *name)
    314 {
    315   char *program;
    316 
    317   g_return_if_fail(name != NULL);
    318 
    319   program = g_find_program_in_path(name);
    320   if (program != NULL)
    321     {
    322       char *parent;
    323       char *prefix;
    324 
    325       parent = g_path_get_dirname(program);
    326       g_free(program);
    327 
    328       prefix = g_path_get_dirname(parent);
    329       g_free(parent);
    330 
    331       jb_variable_set_string("prefix", prefix);
    332       g_free(prefix);
    333     }
    334 }