162 lines
8.5 KiB
C
162 lines
8.5 KiB
C
#define NL "\n"
|
|
|
|
/* main.c */
|
|
extern int no_autodetect_sys; /* set this to 1 to suppress system and cross detection */
|
|
extern int no_save_cache; /* set this to 1 to avoid saving config.cache */
|
|
|
|
/* lib_try.c: try to compile and run a test code; save results under prefix, if worked */
|
|
/* include, compile-flags, link-flags;
|
|
NULL includes, cflags, *ldflags means don't put anything in the db; cflags
|
|
and ldflags may be prefixed with "+" to include standard flags;
|
|
the test code has to print "OK" if it worked. If prefix is NULL, do not
|
|
modify the db or announce the output, silently return 0 or 1.
|
|
Returns 1 if worked, 0 if not */
|
|
int try_icl(int logdepth, const char *prefix, const char *test_c_in, const char *includes, const char *cflags,
|
|
const char *ldflags);
|
|
|
|
/* same as try_icl(), but does not execute the code, only compiles. Useful
|
|
for test programs with undesirable side effects (e.g. gtk: would open a window) */
|
|
int try_icl_norun(int logdepth, const char *prefix, const char *test_c_in, const char *includes, const char *cflags,
|
|
const char *ldflags);
|
|
|
|
/* same as try_icl, but also insert flags picked up from deps (if not NULL);
|
|
useful for detecting features that depend on other detected features.
|
|
If run is 0, do not run the test program, compile only */
|
|
int try_icl_with_deps(int logdepth, const char *prefix, const char *test_c_in, const char *includes, const char *cflags, const char *ldflags, const char *dep_includes, const char *dep_cflags, const char *dep_ldflags, int run);
|
|
|
|
/* Low level function for the same, giving more control to the caller */
|
|
int try_icl_(int logdepth, const char *prefix, const char *test_c_in, const char *includes, const char *cflags, const char *ldflags, int run, int (*accept_res)(char *stdout_str));
|
|
|
|
/* use try_icl() on a list of packages found by pkg-config. Stick to the version
|
|
required if reqver is non-NULL, else try them in the order pkg-config returned
|
|
them. */
|
|
int try_icl_pkg_config(int logdepth, const char *prefix, const char *test_c, char *includes, const char *pkgpat,
|
|
const char *reqver);
|
|
|
|
/* call this when failed to find the feature (after multiple try_*() calls);
|
|
always returns 1 (so that return try_fail() does the Right Thing) */
|
|
int try_fail(int logdepth, const char *prefix);
|
|
|
|
/* Import an argument for controlling try_icl() */
|
|
int import_icl(const char *key, const char *fn);
|
|
|
|
/* Determine the sizeof() of a struct field; works the same way as icl() but
|
|
also sets prefix/sizeof */
|
|
int try_icl_sfield(int logdepth, const char *prefix, const char *structn, const char *fieldn, const char *includes, const char *cflags, const char *ldflags);
|
|
int try_icl_sfields(int logdepth, const char *prefix, const char *structn, const char **fields, const char *includes, const char *cflags, const char *ldflags, int silent_exit_first_fail);
|
|
|
|
|
|
/* lib_compile.c */
|
|
extern int cross_blind; /* 1 if crosscompiling is blind (no emulator to test with) */
|
|
|
|
char *shell_escape_dup(const char *in); /* strdup in and escape any special char for the shell */
|
|
|
|
int compile_file(int logdepth, const char *fn_input, char **fn_output, const char *cc, const char *cflags, const char *ldflags);
|
|
int compile_code(int logdepth, const char *testcode, char **fn_output, const char *cc, const char *cflags, const char *ldflags);
|
|
|
|
/* same as above, but do not add cc/cflags and cc/ldfags */
|
|
int compile_file_raw(int logdepth, const char *fn_input, char **fn_output, const char *cc, const char *cflags, const char *ldflags);
|
|
int compile_code_raw(int logdepth, const char *testcode, char **fn_output, const char *cc, const char *cflags, const char *ldflags);
|
|
|
|
int run(int logdepth, const char *cmd_, char **stdout_saved);
|
|
int run_shell(int logdepth, const char *cmd_, char **stdout_saved);
|
|
int compile_run(int logdepth, const char *testcode, const char *cc, const char *cflags, const char *ldflags,
|
|
char **stdout_saved);
|
|
int run_script(int logdepth, const char *interpreter, const char *script, const char *suffix, char **out);
|
|
|
|
/* lib_file.c */
|
|
int file_size(const char *name);
|
|
char *tempdir_new(int logdepth, const char *suffix);
|
|
char *tempfile_new(const char *suffix);
|
|
char *tempfile_dump(const char *testcode, const char *suffix);
|
|
char *load_file(const char *name);
|
|
int is_dir(const char *path);
|
|
int is_file(const char *path);
|
|
int exists(const char *path);
|
|
int exists_in(const char *dir, const char *file);
|
|
char *file_name(const char *path); /* returns malloc'd buffer */
|
|
char *dir_name(const char *path); /* returns malloc'd buffer */
|
|
char *tempfile_new_noabort(const char *suffix); /* for internal use - returns NULL instead of aborting when temp file can not be created */
|
|
int touch_file(const char *path);
|
|
|
|
/* lib_filelist.c */
|
|
void filelist(int logdepth, const char *dir, int *argc, char ***argv);
|
|
void filelist_free(int *argc, char ***argv);
|
|
|
|
/* lib_pkg_config.c */
|
|
|
|
/** run pkg config on @pkgname:
|
|
- with `--cflags` if cflags is not NULL, storing the result in cflags (malloc()'d)
|
|
- with `--libs` if ldflags is not NULL, storing the result in ldflags (malloc()'d)
|
|
Returns 0 on success.
|
|
*/
|
|
int run_pkg_config(int logdepth, const char *pkgname, char **cflags, char **ldflags);
|
|
|
|
/** same as run_pkg_config(), but runs a generic config tool (e.g. gdconfig)
|
|
passed in confname */
|
|
int run_gen_config(int logdepth, const char *confname, const char *pkgname, char **cflags, char **ldflags);
|
|
|
|
int run_pkg_config_modversion(int logdepth, const char *pkgname, char **modversion);
|
|
int run_pkg_config_modversion_db(int logdepth, const char *node, const char *pkgname);
|
|
|
|
/** run pkg-config --list-all and keep lines matching regex pkgpat.
|
|
|
|
argc/argv is a filelist output, each item pair is package name returned by
|
|
pkg_config (odd items are full package names, even items are suffixes:
|
|
pkgpath match removed)
|
|
*/
|
|
void run_pkg_config_lst(int logdepth, const char *pkgpat, int *argc, char ***argv);
|
|
|
|
|
|
/* lib_uniqinc.c */
|
|
char **uniq_inc_arr(const char *includes, int indirect, const char *sep, int *numlines); /* split includes by sep; includes is a list of nodes to get() if indirect is non-zero; return a NULL-terminated array of unique include strings and set *numlines if numlines is not NULL */
|
|
void uniq_inc_free(char **arr); /* free an array returned by uniq_inc_arr() */
|
|
char *uniq_inc_str(const char *includes, const char *isep, const char *osep, int sort, int eren, char **eres); /* take a long list of includes separated by isep and emit an uniq list separated by osep */
|
|
char *order_inc_str(const char *includes, const char *isep, const char *word1, int dir, const char *word2); /* take a long list of includes separated by isep and emit a new list where word1 is moved before/after of word2 if dir < 0 or dir > 0 */
|
|
|
|
/* find_types.c */
|
|
int find_types_something_t(const char *name, int logdepth, int fatal, const char* prefix, const char *typ, const char* define, const char *try_include);
|
|
|
|
/* str.c */
|
|
char *strclone(const char *str);
|
|
char *trim_left(char *str);
|
|
char *trim_right(char *str);
|
|
char *strip(char *str);
|
|
char *str_chr(char *str, char c);
|
|
char *str_rchr(char *str, char c);
|
|
char *str_subsn(const char *str); /* advanced strdup that also interprets \n */
|
|
char *str_concat(const char *sep, ...); /* concat a list of strings into a newly allocated buffer, putting sep between them */
|
|
char *esc_interpret(const char *str);
|
|
int chr_inset(char c, const char *set); /* returns whether c is in set */
|
|
|
|
/* srctree.c */
|
|
|
|
/* Run svn info on dir and extract the value for key;
|
|
key is case sensitive. The first match is returned or NULL if not found
|
|
or on error. */
|
|
char *svn_info(int logdepth, const char *dir, const char *key);
|
|
|
|
#define isblind(root) ((strncmp((root), "/target", 7) == 0) && cross_blind)
|
|
#define istarget(root) (strncmp((root), "/target", 7) == 0)
|
|
|
|
#define target_emu_fail(out) ((isblind(db_cwd)) && (out == NULL))
|
|
|
|
#define safeNULL(s) ((s) == NULL ? "(NULL)" : (s))
|
|
#define str_null(s) ((s) == NULL ? "" : (s))
|
|
|
|
/* Test program helper: generate code that ensures a given FUNCT exists
|
|
and is a function; can be turned off by defining SCCONFIG_ACCEPT_IMPLICIT
|
|
on scconfig compilation time */
|
|
/* Both FUNCT1 and FUNCT2 argument *must* be used exactly once! In some
|
|
cases FUNCT1 and FUNCT2 is a format string parameter. We expect, however,
|
|
both arguments will substituted to the same value. */
|
|
#ifdef SCCONFIG_ACCEPT_IMPLICIT
|
|
# define no_implicit(RET_TYPE, FUNCT1, FUNCT2) \
|
|
"/* accept implicit (" FUNCT1 ", " FUNCT2 ") */\n"
|
|
#else
|
|
# define no_implicit(RET_TYPE, FUNCT1, FUNCT2) \
|
|
"#ifndef " FUNCT1 "\n" \
|
|
"{ " #RET_TYPE " (*tmp)() = " FUNCT2 "; if (tmp) {}}\n" \
|
|
"#endif\n"
|
|
#endif
|