#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