2005-07-14 13:05:34 +00:00
/*
2005-07-14 13:05:14 +00:00
* Copyright ( C ) 2001 , 2002 Red Hat Inc .
2005-07-14 13:05:34 +00:00
*
2005-07-14 13:05:14 +00:00
* 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 2 of the
* License , 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 .
2005-07-14 13:05:34 +00:00
*
2005-07-14 13:05:14 +00:00
* 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 . , 59 Temple Place - Suite 330 , Boston , MA
* 02111 - 1307 , USA .
*/
2005-07-14 13:04:01 +00:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "pkg.h"
# include "parse.h"
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
# include <stdio.h>
2005-07-14 13:04:37 +00:00
# ifdef G_OS_WIN32
# define STRICT
# include <windows.h>
# undef STRICT
# endif
2005-07-14 13:04:01 +00:00
static int want_debug_spew = 0 ;
static int want_verbose_errors = 0 ;
2005-07-14 13:04:10 +00:00
static int want_stdout_errors = 0 ;
2008-01-16 23:10:25 +01:00
char * pcsysrootdir = NULL ;
2012-05-18 08:40:38 -07:00
char * pkg_config_pc_path = NULL ;
2005-07-14 13:04:01 +00:00
void
debug_spew ( const char * format , . . . )
{
va_list args ;
gchar * str ;
2005-07-14 13:04:10 +00:00
FILE * stream ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
g_return_if_fail ( format ! = NULL ) ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
if ( ! want_debug_spew )
return ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
va_start ( args , format ) ;
str = g_strdup_vprintf ( format , args ) ;
va_end ( args ) ;
2005-07-14 13:04:10 +00:00
if ( want_stdout_errors )
stream = stdout ;
else
stream = stderr ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:10 +00:00
fputs ( str , stream ) ;
fflush ( stream ) ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
g_free ( str ) ;
}
void
verbose_error ( const char * format , . . . )
{
va_list args ;
gchar * str ;
2005-07-14 13:05:41 +00:00
FILE * stream ;
2005-07-14 13:04:01 +00:00
g_return_if_fail ( format ! = NULL ) ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
if ( ! want_verbose_errors )
return ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
va_start ( args , format ) ;
str = g_strdup_vprintf ( format , args ) ;
va_end ( args ) ;
2005-07-14 13:05:41 +00:00
if ( want_stdout_errors )
stream = stdout ;
else
stream = stderr ;
fputs ( str , stream ) ;
fflush ( stream ) ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
g_free ( str ) ;
}
2010-06-17 08:38:46 -07:00
static gboolean
define_variable_cb ( const char * opt , const char * arg , gpointer data ,
GError * * error )
2005-07-14 13:04:01 +00:00
{
2010-06-17 08:38:46 -07:00
char * varname ;
char * varval ;
char * tmp ;
2005-07-14 13:04:01 +00:00
2010-06-17 08:38:46 -07:00
tmp = g_strdup ( arg ) ;
2005-07-14 13:04:01 +00:00
2010-06-17 08:38:46 -07:00
varname = tmp ;
while ( * varname & & isspace ( ( guchar ) * varname ) )
+ + varname ;
2005-07-14 13:04:01 +00:00
2010-06-17 08:38:46 -07:00
varval = varname ;
while ( * varval & & * varval ! = ' = ' & & * varval ! = ' ' )
+ + varval ;
2005-07-14 13:04:01 +00:00
2010-06-17 08:38:46 -07:00
while ( * varval & & ( * varval = = ' = ' | | * varval = = ' ' ) )
{
* varval = ' \0 ' ;
+ + varval ;
}
2005-07-14 13:04:01 +00:00
2010-06-17 08:38:46 -07:00
if ( * varval = = ' \0 ' )
{
fprintf ( stderr , " --define-variable argument does not have a value "
" for the variable \n " ) ;
exit ( 1 ) ;
}
2005-07-14 13:04:01 +00:00
2010-06-17 08:38:46 -07:00
define_global_variable ( varname , varval ) ;
2005-07-14 13:04:01 +00:00
2010-06-17 08:38:46 -07:00
g_free ( tmp ) ;
return TRUE ;
2005-07-14 13:04:01 +00:00
}
static gboolean
pkg_uninstalled ( Package * pkg )
{
/* See if > 0 pkgs were uninstalled */
GSList * tmp ;
if ( pkg - > uninstalled )
return TRUE ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
tmp = pkg - > requires ;
while ( tmp ! = NULL )
{
Package * pkg = tmp - > data ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
if ( pkg_uninstalled ( pkg ) )
return TRUE ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
tmp = g_slist_next ( tmp ) ;
}
return FALSE ;
}
2010-05-09 09:49:13 +02:00
void
print_hashtable_key ( gpointer key ,
gpointer value ,
gpointer user_data )
{
printf ( " %s \n " , ( gchar * ) key ) ;
}
2012-05-18 08:40:38 -07:00
static void
init_pc_path ( void )
{
# ifdef G_OS_WIN32
char * instdir , * lpath , * shpath ;
instdir = g_win32_get_package_installation_directory_of_module ( NULL ) ;
if ( instdir = = NULL )
{
/* This only happens when GetModuleFilename() fails. If it does, that
* failure should be investigated and fixed .
*/
debug_spew ( " g_win32_get_package_installation_directory_of_module failed \n " ) ;
return ;
}
lpath = g_build_filename ( instdir , " lib " , " pkgconfig " , NULL ) ;
shpath = g_build_filename ( instdir , " share " , " pkgconfig " , NULL ) ;
pkg_config_pc_path = g_strconcat ( lpath , G_SEARCHPATH_SEPARATOR_S , shpath ,
NULL ) ;
2012-05-29 17:15:34 -07:00
g_free ( instdir ) ;
g_free ( lpath ) ;
g_free ( shpath ) ;
2012-05-18 08:40:38 -07:00
# else
pkg_config_pc_path = PKG_CONFIG_PC_PATH ;
# endif
}
2005-07-14 13:05:34 +00:00
int
2005-07-14 13:04:01 +00:00
main ( int argc , char * * argv )
{
2008-03-23 17:34:33 +01:00
static int want_my_version = 0 ;
static int want_version = 0 ;
static int want_libs = 0 ;
static int want_cflags = 0 ;
static int want_l_libs = 0 ;
static int want_L_libs = 0 ;
static int want_other_libs = 0 ;
static int want_I_cflags = 0 ;
static int want_other_cflags = 0 ;
static int want_list = 0 ;
static int want_static_lib_list = ENABLE_INDIRECT_DEPS ;
static int want_short_errors = 0 ;
static int want_uninstalled = 0 ;
static char * variable_name = NULL ;
static int want_exists = 0 ;
2010-05-10 20:02:53 +02:00
static int want_provides = 0 ;
static int want_requires = 0 ;
static int want_requires_private = 0 ;
2008-03-23 17:34:33 +01:00
static char * required_atleast_version = NULL ;
static char * required_exact_version = NULL ;
static char * required_max_version = NULL ;
static char * required_pkgconfig_version = NULL ;
static int want_silence_errors = 0 ;
2010-05-09 09:49:13 +02:00
static int want_variable_list = 0 ;
2005-07-14 13:04:01 +00:00
GString * str ;
GSList * packages = NULL ;
2012-10-16 20:44:16 -07:00
FlagType flags = 0 ;
2005-07-14 13:04:01 +00:00
char * search_path ;
char * pcbuilddir ;
gboolean need_newline ;
2008-04-28 20:58:36 +02:00
FILE * log = NULL ;
2010-06-17 08:38:46 -07:00
GError * error = NULL ;
GOptionContext * opt_context ;
GOptionEntry options_table [ ] = {
{ " version " , 0 , 0 , G_OPTION_ARG_NONE , & want_my_version ,
" output version of pkg-config " , NULL } ,
{ " modversion " , 0 , 0 , G_OPTION_ARG_NONE , & want_version ,
" output version for package " , NULL } ,
{ " atleast-pkgconfig-version " , 0 , 0 , G_OPTION_ARG_STRING ,
& required_pkgconfig_version ,
2005-07-14 13:04:01 +00:00
" require given version of pkg-config " , " VERSION " } ,
2010-06-17 08:38:46 -07:00
{ " libs " , 0 , 0 , G_OPTION_ARG_NONE , & want_libs ,
" output all linker flags " , NULL } ,
{ " static " , 0 , 0 , G_OPTION_ARG_NONE , & want_static_lib_list ,
" output linker flags for static linking " , NULL } ,
{ " short-errors " , 0 , 0 , G_OPTION_ARG_NONE , & want_short_errors ,
" print short errors " , NULL } ,
{ " libs-only-l " , 0 , 0 , G_OPTION_ARG_NONE , & want_l_libs ,
" output -l flags " , NULL } ,
{ " libs-only-other " , 0 , 0 , G_OPTION_ARG_NONE , & want_other_libs ,
" output other libs (e.g. -pthread) " , NULL } ,
{ " libs-only-L " , 0 , 0 , G_OPTION_ARG_NONE , & want_L_libs ,
" output -L flags " , NULL } ,
{ " cflags " , 0 , 0 , G_OPTION_ARG_NONE , & want_cflags ,
" output all pre-processor and compiler flags " , NULL } ,
{ " cflags-only-I " , 0 , 0 , G_OPTION_ARG_NONE , & want_I_cflags ,
" output -I flags " , NULL } ,
{ " cflags-only-other " , 0 , 0 , G_OPTION_ARG_NONE , & want_other_cflags ,
" output cflags not covered by the cflags-only-I option " , NULL } ,
{ " variable " , 0 , 0 , G_OPTION_ARG_STRING , & variable_name ,
2009-12-06 22:28:08 +01:00
" get the value of variable named NAME " , " NAME " } ,
2010-06-17 08:38:46 -07:00
{ " define-variable " , 0 , 0 , G_OPTION_ARG_CALLBACK , & define_variable_cb ,
2009-12-06 22:28:08 +01:00
" set variable NAME to VALUE " , " NAME=VALUE " } ,
2010-06-17 08:38:46 -07:00
{ " exists " , 0 , 0 , G_OPTION_ARG_NONE , & want_exists ,
" return 0 if the module(s) exist " , NULL } ,
{ " print-variables " , 0 , 0 , G_OPTION_ARG_NONE , & want_variable_list ,
" output list of variables defined by the module " , NULL } ,
{ " uninstalled " , 0 , 0 , G_OPTION_ARG_NONE , & want_uninstalled ,
" return 0 if the uninstalled version of one or more module(s) "
" or their dependencies will be used " , NULL } ,
{ " atleast-version " , 0 , 0 , G_OPTION_ARG_STRING , & required_atleast_version ,
2005-07-14 13:04:01 +00:00
" return 0 if the module is at least version VERSION " , " VERSION " } ,
2010-06-17 08:38:46 -07:00
{ " exact-version " , 0 , 0 , G_OPTION_ARG_STRING , & required_exact_version ,
2005-07-14 13:04:01 +00:00
" return 0 if the module is at exactly version VERSION " , " VERSION " } ,
2010-06-17 08:38:46 -07:00
{ " max-version " , 0 , 0 , G_OPTION_ARG_STRING , & required_max_version ,
2005-07-14 13:04:01 +00:00
" return 0 if the module is at no newer than version VERSION " , " VERSION " } ,
2010-06-17 08:38:46 -07:00
{ " list-all " , 0 , 0 , G_OPTION_ARG_NONE , & want_list ,
" list all known packages " , NULL } ,
{ " debug " , 0 , 0 , G_OPTION_ARG_NONE , & want_debug_spew ,
" show verbose debug information " , NULL } ,
{ " print-errors " , 0 , 0 , G_OPTION_ARG_NONE , & want_verbose_errors ,
2009-12-06 22:28:30 +01:00
" show verbose information about missing or conflicting packages, "
2010-06-17 08:38:46 -07:00
" default if --cflags or --libs given on the command line " , NULL } ,
{ " silence-errors " , 0 , 0 , G_OPTION_ARG_NONE , & want_silence_errors ,
2009-12-06 22:28:30 +01:00
" be silent about errors (default unless --cflags or --libs "
2010-06-17 08:38:46 -07:00
" given on the command line) " , NULL } ,
{ " errors-to-stdout " , 0 , 0 , G_OPTION_ARG_NONE , & want_stdout_errors ,
" print errors from --print-errors to stdout not stderr " , NULL } ,
{ " print-provides " , 0 , 0 , G_OPTION_ARG_NONE , & want_provides ,
" print which packages the package provides " , NULL } ,
{ " print-requires " , 0 , 0 , G_OPTION_ARG_NONE , & want_requires ,
" print which packages the package requires " , NULL } ,
{ " print-requires-private " , 0 , 0 , G_OPTION_ARG_NONE , & want_requires_private ,
" print which packages the package requires for static linking " , NULL } ,
2005-07-14 13:04:31 +00:00
# ifdef G_OS_WIN32
2010-06-17 08:38:46 -07:00
{ " dont-define-prefix " , 0 , 0 , G_OPTION_ARG_NONE , & dont_define_prefix ,
2005-07-14 13:04:37 +00:00
" don't try to override the value of prefix for each .pc file found with "
2010-06-17 08:38:46 -07:00
" a guesstimated value based on the location of the .pc file " , NULL } ,
{ " prefix-variable " , 0 , 0 , G_OPTION_ARG_STRING , & prefix_variable ,
" set the name of the variable that pkg-config automatically sets " ,
" PREFIX " } ,
{ " msvc-syntax " , 0 , 0 , G_OPTION_ARG_NONE , & msvc_syntax ,
" output -l and -L flags for the Microsoft compiler (cl) " , NULL } ,
2005-07-14 13:04:31 +00:00
# endif
2010-06-17 08:38:46 -07:00
{ NULL , 0 , 0 , 0 , NULL , NULL , NULL }
2005-07-14 13:04:01 +00:00
} ;
/* This is here so that we get debug spew from the start,
* during arg parsing
*/
if ( getenv ( " PKG_CONFIG_DEBUG_SPEW " ) )
{
want_debug_spew = TRUE ;
want_verbose_errors = TRUE ;
want_silence_errors = FALSE ;
2005-07-14 13:04:19 +00:00
debug_spew ( " PKG_CONFIG_DEBUG_SPEW variable enabling debug spew \n " ) ;
2005-07-14 13:04:01 +00:00
}
2005-07-14 13:05:34 +00:00
2012-05-18 08:40:38 -07:00
/* Get the built-in search path */
init_pc_path ( ) ;
if ( pkg_config_pc_path = = NULL )
{
/* Even when we override the built-in search path, we still use it later
* to add pc_path to the virtual pkg - config package .
*/
verbose_error ( " Failed to get default search path \n " ) ;
exit ( 1 ) ;
}
2006-08-16 19:57:14 +02:00
search_path = getenv ( " PKG_CONFIG_PATH " ) ;
if ( search_path )
{
add_search_dirs ( search_path , G_SEARCHPATH_SEPARATOR_S ) ;
}
2005-07-14 13:07:11 +00:00
if ( getenv ( " PKG_CONFIG_LIBDIR " ) ! = NULL )
2005-07-14 13:04:01 +00:00
{
2005-07-14 13:07:11 +00:00
add_search_dirs ( getenv ( " PKG_CONFIG_LIBDIR " ) , G_SEARCHPATH_SEPARATOR_S ) ;
}
else
{
2012-05-18 08:40:38 -07:00
add_search_dirs ( pkg_config_pc_path , G_SEARCHPATH_SEPARATOR_S ) ;
2005-07-14 13:04:01 +00:00
}
2005-07-14 13:06:23 +00:00
2008-01-16 23:10:25 +01:00
pcsysrootdir = getenv ( " PKG_CONFIG_SYSROOT_DIR " ) ;
if ( pcsysrootdir )
{
define_global_variable ( " pc_sysrootdir " , pcsysrootdir ) ;
}
else
{
define_global_variable ( " pc_sysrootdir " , " / " ) ;
}
2005-07-14 13:04:01 +00:00
pcbuilddir = getenv ( " PKG_CONFIG_TOP_BUILD_DIR " ) ;
if ( pcbuilddir )
{
define_global_variable ( " pc_top_builddir " , pcbuilddir ) ;
}
else
{
/* Default appropriate for automake */
define_global_variable ( " pc_top_builddir " , " $(top_builddir) " ) ;
}
if ( getenv ( " PKG_CONFIG_DISABLE_UNINSTALLED " ) )
{
debug_spew ( " disabling auto-preference for uninstalled packages \n " ) ;
disable_uninstalled = TRUE ;
}
2005-07-14 13:05:34 +00:00
2010-06-17 08:38:46 -07:00
/* Parse options */
opt_context = g_option_context_new ( NULL ) ;
g_option_context_add_main_entries ( opt_context , options_table , NULL ) ;
if ( ! g_option_context_parse ( opt_context , & argc , & argv , & error ) )
2005-07-14 13:04:01 +00:00
{
2010-06-17 08:38:46 -07:00
fprintf ( stderr , " %s \n " , error - > message ) ;
2005-07-14 13:04:01 +00:00
return 1 ;
}
2012-10-16 20:44:16 -07:00
/* construct Libs/Cflags mask */
if ( want_cflags )
flags | = CFLAGS_ANY ;
if ( want_I_cflags )
flags | = CFLAGS_I ;
if ( want_other_cflags )
flags | = CFLAGS_OTHER ;
if ( want_libs )
flags | = LIBS_ANY ;
if ( want_l_libs )
flags | = LIBS_l ;
if ( want_L_libs )
flags | = LIBS_L ;
if ( want_other_libs )
flags | = LIBS_OTHER ;
2005-07-14 13:04:01 +00:00
/* Error printing is determined as follows:
* - for - - cflags , - - libs , etc . it ' s on by default
* and - - silence - errors can turn it off
* - for - - exists , - - max - version , etc . and no options
* at all , it ' s off by default and - - print - errors
* will turn it on
*/
if ( want_my_version | |
want_version | |
want_libs | |
want_cflags | |
want_l_libs | |
want_L_libs | |
2005-07-14 13:05:34 +00:00
want_other_libs | |
2005-07-14 13:04:01 +00:00
want_I_cflags | |
2005-07-14 13:05:34 +00:00
want_other_cflags | |
2010-05-09 09:49:13 +02:00
want_list | |
want_variable_list )
2005-07-14 13:04:01 +00:00
{
2005-07-14 13:05:34 +00:00
debug_spew ( " Error printing enabled by default due to use of --version, --libs, --cflags, --libs-only-l, --libs-only-L, --libs-only-other, --cflags-only-I, --cflags-only-other or --list. Value of --silence-errors: %d \n " , want_silence_errors ) ;
2005-07-14 13:04:19 +00:00
2005-07-14 13:04:01 +00:00
if ( want_silence_errors & & getenv ( " PKG_CONFIG_DEBUG_SPEW " ) = = NULL )
want_verbose_errors = FALSE ;
else
want_verbose_errors = TRUE ;
}
else
{
2005-07-14 13:04:19 +00:00
debug_spew ( " Error printing disabled by default, value of --print-errors: %d \n " ,
want_verbose_errors ) ;
2005-07-14 13:04:01 +00:00
/* Leave want_verbose_errors unchanged, reflecting --print-errors */
2005-07-14 13:04:19 +00:00
}
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:19 +00:00
if ( want_verbose_errors )
debug_spew ( " Error printing enabled \n " ) ;
else
debug_spew ( " Error printing disabled \n " ) ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:07:18 +00:00
if ( want_static_lib_list )
enable_private_libs ( ) ;
else
disable_private_libs ( ) ;
2009-03-30 20:40:53 +02:00
/* honor Requires.private if any Cflags are requested or any static
* libs are requested */
if ( want_I_cflags | | want_other_cflags | | want_cflags | |
2012-06-07 05:51:59 -07:00
want_requires_private | | want_exists | |
2009-03-30 20:40:53 +02:00
( want_static_lib_list & & ( want_libs | | want_l_libs | | want_L_libs ) ) )
enable_requires_private ( ) ;
2009-03-30 20:49:17 +02:00
/* ignore Requires if no Cflags or Libs are requested */
if ( ! want_I_cflags & & ! want_other_cflags & & ! want_cflags & &
2012-06-07 05:51:59 -07:00
! want_libs & & ! want_l_libs & & ! want_L_libs & & ! want_requires & &
! want_exists )
2009-03-30 20:49:17 +02:00
disable_requires ( ) ;
2005-07-14 13:04:01 +00:00
if ( want_my_version )
{
printf ( " %s \n " , VERSION ) ;
return 0 ;
}
if ( required_pkgconfig_version )
{
if ( compare_versions ( VERSION , required_pkgconfig_version ) > = 0 )
return 0 ;
else
return 1 ;
}
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
package_init ( ) ;
if ( want_list )
{
print_package_list ( ) ;
return 0 ;
}
2005-07-14 13:05:34 +00:00
2010-06-17 08:38:46 -07:00
/* Collect packages from remaining args */
2005-07-14 13:04:01 +00:00
str = g_string_new ( " " ) ;
2010-06-17 08:38:46 -07:00
while ( argc > 1 )
2005-07-14 13:04:01 +00:00
{
2010-06-17 08:38:46 -07:00
argc - - ;
argv + + ;
2005-07-14 13:04:01 +00:00
2010-06-17 08:38:46 -07:00
g_string_append ( str , * argv ) ;
2005-07-14 13:04:01 +00:00
g_string_append ( str , " " ) ;
}
2010-06-17 08:38:46 -07:00
g_option_context_free ( opt_context ) ;
2005-07-14 13:07:18 +00:00
2005-07-14 13:05:34 +00:00
g_strstrip ( str - > str ) ;
2008-03-23 20:51:50 +01:00
if ( getenv ( " PKG_CONFIG_LOG " ) ! = NULL )
{
log = fopen ( getenv ( " PKG_CONFIG_LOG " ) , " a " ) ;
if ( log = = NULL )
{
fprintf ( stderr , " Cannot open log file: %s \n " ,
getenv ( " PKG_CONFIG_LOG " ) ) ;
exit ( 1 ) ;
}
}
2005-07-14 13:04:01 +00:00
{
2005-10-16 18:06:02 +00:00
gboolean failed = FALSE ;
2005-07-14 13:04:01 +00:00
GSList * reqs ;
GSList * iter ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
reqs = parse_module_list ( NULL , str - > str ,
2005-07-14 13:05:34 +00:00
" (command line arguments) " ) ;
2005-07-14 13:04:01 +00:00
iter = reqs ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
while ( iter ! = NULL )
{
Package * req ;
RequiredVersion * ver = iter - > data ;
2012-04-21 11:08:12 -07:00
/* override requested versions with cmdline options */
if ( required_exact_version )
{
g_free ( ver - > version ) ;
ver - > comparison = EQUAL ;
ver - > version = g_strdup ( required_exact_version ) ;
}
else if ( required_atleast_version )
{
g_free ( ver - > version ) ;
ver - > comparison = GREATER_THAN_EQUAL ;
ver - > version = g_strdup ( required_atleast_version ) ;
}
else if ( required_max_version )
{
g_free ( ver - > version ) ;
ver - > comparison = LESS_THAN_EQUAL ;
ver - > version = g_strdup ( required_max_version ) ;
}
2005-10-16 17:31:41 +00:00
if ( want_short_errors )
req = get_package_quiet ( ver - > name ) ;
else
req = get_package ( ver - > name ) ;
2005-07-14 13:04:01 +00:00
2008-03-23 20:51:50 +01:00
if ( log ! = NULL )
{
if ( req = = NULL )
fprintf ( log , " %s NOT-FOUND " , ver - > name ) ;
else
fprintf ( log , " %s %s %s " , ver - > name ,
comparison_to_str ( ver - > comparison ) ,
( ver - > version = = NULL ) ? " (null) " : ver - > version ) ;
fprintf ( log , " \n " ) ;
}
2005-07-14 13:04:01 +00:00
if ( req = = NULL )
{
2005-10-16 18:06:02 +00:00
failed = TRUE ;
2005-07-14 13:04:01 +00:00
verbose_error ( " No package '%s' found \n " , ver - > name ) ;
2005-10-16 18:06:02 +00:00
goto nextiter ;
2005-07-14 13:04:01 +00:00
}
if ( ! version_test ( ver - > comparison , req - > version , ver - > version ) )
{
2005-10-16 18:06:02 +00:00
failed = TRUE ;
2005-07-14 13:04:01 +00:00
verbose_error ( " Requested '%s %s %s' but version of %s is %s \n " ,
ver - > name ,
comparison_to_str ( ver - > comparison ) ,
ver - > version ,
req - > name ,
req - > version ) ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:05:51 +00:00
if ( req - > url )
verbose_error ( " You may find new versions of %s at %s \n " ,
req - > name , req - > url ) ;
2005-10-16 18:06:02 +00:00
goto nextiter ;
2005-07-14 13:04:01 +00:00
}
packages = g_slist_prepend ( packages , req ) ;
2005-07-14 13:05:34 +00:00
2005-10-16 18:06:02 +00:00
nextiter :
2005-07-14 13:04:01 +00:00
iter = g_slist_next ( iter ) ;
}
2005-10-16 18:06:02 +00:00
2008-03-23 20:51:50 +01:00
if ( log ! = NULL )
{
fclose ( log ) ;
}
2005-10-16 18:06:02 +00:00
if ( failed ) {
return 1 ;
}
2012-10-30 17:34:20 -07:00
}
g_string_free ( str , TRUE ) ;
packages = g_slist_reverse ( packages ) ;
if ( packages = = NULL )
{
fprintf ( stderr , " Must specify package names on the command line \n " ) ;
exit ( 1 ) ;
}
if ( want_exists )
return 0 ; /* if we got here, all the packages existed. */
2005-10-16 18:06:02 +00:00
2010-05-09 09:49:13 +02:00
if ( want_variable_list )
{
GSList * tmp ;
tmp = packages ;
while ( tmp ! = NULL )
{
Package * pkg = tmp - > data ;
2012-10-13 09:06:18 -07:00
if ( pkg - > vars ! = NULL )
g_hash_table_foreach ( pkg - > vars ,
& print_hashtable_key ,
NULL ) ;
2010-05-09 09:49:13 +02:00
tmp = g_slist_next ( tmp ) ;
if ( tmp ) printf ( " \n " ) ;
}
need_newline = FALSE ;
}
2005-07-14 13:04:01 +00:00
if ( want_uninstalled )
{
/* See if > 0 pkgs (including dependencies recursively) were uninstalled */
GSList * tmp ;
tmp = packages ;
while ( tmp ! = NULL )
{
Package * pkg = tmp - > data ;
if ( pkg_uninstalled ( pkg ) )
return 0 ;
tmp = g_slist_next ( tmp ) ;
}
return 1 ;
}
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
if ( want_version )
{
GSList * tmp ;
tmp = packages ;
while ( tmp ! = NULL )
{
Package * pkg = tmp - > data ;
printf ( " %s \n " , pkg - > version ) ;
tmp = g_slist_next ( tmp ) ;
}
}
2010-05-10 20:02:53 +02:00
if ( want_provides )
{
GSList * tmp ;
tmp = packages ;
while ( tmp ! = NULL )
{
Package * pkg = tmp - > data ;
char * key ;
key = pkg - > key ;
while ( * key = = ' / ' )
key + + ;
if ( strlen ( key ) > 0 )
printf ( " %s = %s \n " , key , pkg - > version ) ;
tmp = g_slist_next ( tmp ) ;
}
}
if ( want_requires )
{
GSList * pkgtmp ;
for ( pkgtmp = packages ; pkgtmp ! = NULL ; pkgtmp = g_slist_next ( pkgtmp ) )
{
Package * pkg = pkgtmp - > data ;
GSList * reqtmp ;
/* process Requires: */
for ( reqtmp = pkg - > requires ; reqtmp ! = NULL ; reqtmp = g_slist_next ( reqtmp ) )
{
Package * deppkg = reqtmp - > data ;
RequiredVersion * req ;
req = g_hash_table_lookup ( pkg - > required_versions , deppkg - > key ) ;
if ( ( req = = NULL ) | | ( req - > comparison = = ALWAYS_MATCH ) )
printf ( " %s \n " , deppkg - > key ) ;
else
printf ( " %s %s %s \n " , deppkg - > key ,
comparison_to_str ( req - > comparison ) ,
req - > version ) ;
}
}
}
if ( want_requires_private )
{
GSList * pkgtmp ;
for ( pkgtmp = packages ; pkgtmp ! = NULL ; pkgtmp = g_slist_next ( pkgtmp ) )
{
Package * pkg = pkgtmp - > data ;
GSList * reqtmp ;
/* process Requires.private: */
for ( reqtmp = pkg - > requires_private ; reqtmp ! = NULL ; reqtmp = g_slist_next ( reqtmp ) )
{
Package * deppkg = reqtmp - > data ;
RequiredVersion * req ;
if ( g_slist_find ( pkg - > requires , reqtmp - > data ) )
continue ;
req = g_hash_table_lookup ( pkg - > required_versions , deppkg - > key ) ;
if ( ( req = = NULL ) | | ( req - > comparison = = ALWAYS_MATCH ) )
printf ( " %s \n " , deppkg - > key ) ;
else
printf ( " %s %s %s \n " , deppkg - > key ,
comparison_to_str ( req - > comparison ) ,
req - > version ) ;
}
}
}
2005-07-14 13:04:01 +00:00
/* Print all flags; then print a newline at the end. */
need_newline = FALSE ;
if ( variable_name )
{
char * str = packages_get_var ( packages , variable_name ) ;
printf ( " %s " , str ) ;
g_free ( str ) ;
need_newline = TRUE ;
}
2005-07-14 13:05:34 +00:00
2012-10-16 20:44:16 -07:00
if ( flags ! = 0 )
2005-07-14 13:04:01 +00:00
{
2012-10-16 20:44:16 -07:00
char * str = packages_get_flags ( packages , flags ) ;
printf ( " %s " , str ) ;
2005-07-14 13:04:01 +00:00
g_free ( str ) ;
need_newline = TRUE ;
}
if ( need_newline )
printf ( " \n " ) ;
2005-07-14 13:05:34 +00:00
2005-07-14 13:04:01 +00:00
return 0 ;
}