⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jlibtool.c

📁 Apache官方在今天放出产品系列2.2的最新版本2.2.11的源码包 最流行的HTTP服务器软件之一
💻 C
📖 第 1 页 / 共 4 页
字号:
#ifndef LINKER_FLAG_NO_EQUALS    strcat(tmp, "=");#endif    strcat(tmp, path);    push_count_chars(cc, tmp);}void add_rpath_file(count_chars *cc, const char *arg){    const char *path;    path = load_install_path(arg);    if (path) {        add_rpath(cc, path);    }}void add_rpath_noinstall(count_chars *cc, const char *arg, int pathlen){    const char *path;    path = load_noinstall_path(arg, pathlen);    if (path) {        add_rpath(cc, path);    }}#endif#ifdef DYNAMIC_LINK_NO_INSTALLvoid add_dylink_noinstall(count_chars *cc, const char *arg, int pathlen,                          int extlen){    const char *install_path, *current_path, *name;    char *exp_argument;    int i_p_len, c_p_len, name_len, dyext_len, cur_len;    install_path = load_install_path(arg);    current_path = load_noinstall_path(arg, pathlen);    if (!install_path || !current_path) {        return;    }    push_count_chars(cc, DYNAMIC_LINK_NO_INSTALL);    i_p_len = strlen(install_path);    c_p_len = strlen(current_path);    name = arg+pathlen;    name_len = extlen-pathlen;    dyext_len = sizeof(DYNAMIC_LIB_EXT) - 1;    /* No, we need to replace the extension. */    exp_argument = (char *)malloc(i_p_len + c_p_len + (name_len*2) +                                  (dyext_len*2) + 2);    cur_len = 0;    strcpy(exp_argument, install_path);    cur_len += i_p_len;    exp_argument[cur_len++] = '/';    strncpy(exp_argument+cur_len, name, extlen-pathlen);    cur_len += name_len;    strcpy(exp_argument+cur_len, DYNAMIC_LIB_EXT);    cur_len += dyext_len;    exp_argument[cur_len++] = ':';    strcpy(exp_argument+cur_len, current_path);    cur_len += c_p_len;    exp_argument[cur_len++] = '/';    strncpy(exp_argument+cur_len, name, extlen-pathlen);    cur_len += name_len;    strcpy(exp_argument+cur_len, DYNAMIC_LIB_EXT);    cur_len += dyext_len;    push_count_chars(cc, exp_argument);}#endif/* use -L -llibname to allow to use installed libraries */void add_minus_l(count_chars *cc, const char *arg){    char *newarg;    char *name = strrchr(arg, '/');    char *file = strrchr(arg, '.');    char *lib  = strstr(name, "lib");    if (name !=NULL && file != NULL && lib == name+1) {        *name = '\0';        *file = '\0';        file = name;        file = file+4;        push_count_chars(cc, "-L");        push_count_chars(cc, arg);        /* we need one argument like -lapr-1 */        newarg = malloc(strlen(file) + 3);        strcpy(newarg, "-l");        strcat(newarg, file);        push_count_chars(cc, newarg);    } else {        push_count_chars(cc, arg);    }}void add_linker_flag_prefix(count_chars *cc, const char *arg){#ifndef LINKER_FLAG_PREFIX    push_count_chars(cc, arg);#else    char *newarg;    newarg = (char*)malloc(strlen(arg) + sizeof(LINKER_FLAG_PREFIX) + 1);    strcpy(newarg, LINKER_FLAG_PREFIX);    strcat(newarg, arg);    push_count_chars(cc, newarg);#endif}/* returns just a file's name without the path */const char *jlibtool_basename(const char *fullpath){    const char *name = strrchr(fullpath, '/');    if (name == NULL) {        name = strrchr(fullpath, '\\');    }    if (name == NULL) {        name = fullpath;    } else {        name++;    }    return name;}/* returns just a file's name without path or extension */const char *nameof(const char *fullpath){    const char *name;    const char *ext;    name = jlibtool_basename(fullpath);    ext = strrchr(name, '.');    if (ext) {        char *trimmed;        trimmed = malloc(ext - name + 1);        strncpy(trimmed, name, ext - name);        trimmed[ext-name] = 0;        return trimmed;    }    return name;}int explode_static_lib(command_t *cmd_data, const char *lib){    count_chars tmpdir_cc, libname_cc;    const char *tmpdir, *libname;    char savewd[PATH_MAX];    const char *name;    DIR *dir;    struct dirent *entry;    const char *lib_args[4];    /* Bah! */    if (cmd_data->options.dry_run) {        return 0;    }    name = jlibtool_basename(lib);    init_count_chars(&tmpdir_cc);    push_count_chars(&tmpdir_cc, ".libs/");    push_count_chars(&tmpdir_cc, name);    push_count_chars(&tmpdir_cc, ".exploded/");    tmpdir = flatten_count_chars(&tmpdir_cc, 0);    if (!cmd_data->options.silent) {        printf("Making: %s\n", tmpdir);    }    safe_mkdir(tmpdir);    push_count_chars(cmd_data->tmp_dirs, tmpdir);    getcwd(savewd, sizeof(savewd));    if (chdir(tmpdir) != 0) {        if (!cmd_data->options.silent) {            printf("Warning: could not explode %s\n", lib);        }        return 1;    }    if (lib[0] == '/') {        libname = lib;    }    else {        init_count_chars(&libname_cc);        push_count_chars(&libname_cc, "../../");        push_count_chars(&libname_cc, lib);        libname = flatten_count_chars(&libname_cc, 0);    }    lib_args[0] = LIBRARIAN;    lib_args[1] = "x";    lib_args[2] = libname;    lib_args[3] = NULL;    external_spawn(cmd_data, LIBRARIAN, lib_args);    chdir(savewd);    dir = opendir(tmpdir);    while ((entry = readdir(dir)) != NULL) {#if defined(__APPLE__) && defined(RANLIB)        /* Apple inserts __.SYMDEF which isn't needed.         * Leopard (10.5+) can also add '__.SYMDEF SORTED' which isn't         * much fun either.  Just skip them.         */        if (strstr(entry->d_name, "__.SYMDEF") != NULL) {            continue;        }#endif        if (entry->d_name[0] != '.') {            push_count_chars(&tmpdir_cc, entry->d_name);            name = flatten_count_chars(&tmpdir_cc, 0);            if (!cmd_data->options.silent) {                printf("Adding: %s\n", name);            }            push_count_chars(cmd_data->obj_files, name);            pop_count_chars(&tmpdir_cc);        }    }    closedir(dir);    return 0;}int parse_input_file_name(char *arg, command_t *cmd_data){    char *ext = strrchr(arg, '.');    char *name = strrchr(arg, '/');    int pathlen;    enum lib_type libtype;    char *newarg;    if (!ext) {        return 0;    }    ext++;    if (name == NULL) {        name = strrchr(arg, '\\');        if (name == NULL) {            name = arg;        } else {            name++;        }    } else {        name++;    }    pathlen = name - arg;    if (strcmp(ext, "lo") == 0) {        newarg = check_object_exists(cmd_data, arg, ext - arg);        if (!newarg) {            printf("Can not find suitable object file for %s\n", arg);            exit(1);        }        if (cmd_data->mode != mLink) {            push_count_chars(cmd_data->arglist, newarg);        }        else {            push_count_chars(cmd_data->obj_files, newarg);        }        return 1;    }    if (strcmp(ext, "la") == 0) {        switch (cmd_data->mode) {        case mLink:            /* Try the .libs dir first! */            newarg = check_library_exists(cmd_data, arg, pathlen, 1, &libtype);            if (!newarg) {                /* Try the normal dir next. */                newarg = check_library_exists(cmd_data, arg, pathlen, 0, &libtype);                if (!newarg) {                    printf("Can not find suitable library for %s\n", arg);                    exit(1);                }            }            /* It is not ok to just add the file: a library may added with:               1 - -L path library_name. (For *.so in Linux).               2 - library_name.             */#ifdef ADD_MINUS_L            if (libtype == type_DYNAMIC_LIB) {                 add_minus_l(cmd_data->shared_opts.dependencies, newarg);            } else if (cmd_data->output == otLibrary &&                       libtype == type_STATIC_LIB) {                explode_static_lib(cmd_data, newarg);            } else {                 push_count_chars(cmd_data->shared_opts.dependencies, newarg);            }#else            if (cmd_data->output == otLibrary && libtype == type_STATIC_LIB) {                explode_static_lib(cmd_data, newarg);            }            else {                push_count_chars(cmd_data->shared_opts.dependencies, newarg);            }#endif            if (libtype == type_DYNAMIC_LIB) {                if (cmd_data->options.no_install) {#ifdef RPATH                    add_rpath_noinstall(cmd_data->shared_opts.dependencies,                                        arg, pathlen);#endif#ifdef DYNAMIC_LINK_NO_INSTALL                    /*                     * This doesn't work as Darwin's linker has no way to                     * override at link-time the search paths for a                     * non-installed library.                     */                    /*                    add_dylink_noinstall(cmd_data->shared_opts.dependencies,                                         arg, pathlen, ext - arg);                    */#endif                }                else {#ifdef RPATH                    add_rpath_file(cmd_data->shared_opts.dependencies, arg);#endif                }            }            break;        case mInstall:            /* If we've already recorded a library to install, we're most             * likely getting the .la file that we want to install as.             * The problem is that we need to add it as the directory,             * not the .la file itself.  Otherwise, we'll do odd things.             */            if (cmd_data->output == otLibrary) {                arg[pathlen] = '\0';                push_count_chars(cmd_data->arglist, arg);            }            else {                cmd_data->output = otLibrary;                cmd_data->output_name = arg;                cmd_data->static_name.install = gen_install_name(arg, 0);                cmd_data->shared_name.install = gen_install_name(arg, 1);                cmd_data->module_name.install = gen_install_name(arg, 2);            }            break;        default:            break;        }        return 1;    }    if (strcmp(ext, "c") == 0) {        /* If we don't already have an idea what our output name will be. */        if (cmd_data->basename == NULL) {            cmd_data->basename = (char *)malloc(strlen(arg) + 4);            strcpy(cmd_data->basename, arg);            strcpy(strrchr(cmd_data->basename, '.') + 1, "lo");            cmd_data->fake_output_name = strrchr(cmd_data->basename, '/');            if (cmd_data->fake_output_name) {                cmd_data->fake_output_name++;            }            else {                cmd_data->fake_output_name = cmd_data->basename;            }        }    }    return 0;}int parse_output_file_name(char *arg, command_t *cmd_data){    char *name = strrchr(arg, '/');    char *ext = strrchr(arg, '.');    char *newarg = NULL;    int pathlen;    cmd_data->fake_output_name = arg;    if (name) {        name++;    }    else {        name = strrchr(arg, '\\');        if (name == NULL) {            name = arg;        }        else {            name++;        }    }#ifdef EXE_EXT    if (!ext || strcmp(ext, EXE_EXT) == 0) {#else    if (!ext) {#endif        cmd_data->basename = arg;        cmd_data->output = otProgram;#if defined(_OSD_POSIX)        cmd_data->options.pic_mode = pic_AVOID;#endif        newarg = (char *)malloc(strlen(arg) + 5);        strcpy(newarg, arg);#ifdef EXE_EXT	if (!ext) {        strcat(newarg, EXE_EXT);	}#endif        cmd_data->output_name = newarg;        return 1;    }    ext++;    pathlen = name - arg;    if (strcmp(ext, "la") == 0) {        assert(cmd_data->mode == mLink);        cmd_data->basename = arg;        cmd_data->static_name.normal = gen_library_name(arg, 0);        cmd_data->shared_name.normal = gen_library_name(arg, 1);        cmd_data->module_name.normal = gen_library_name(arg, 2);        cmd_data->static_name.install = gen_install_name(arg, 0);        cmd_data->shared_name.install = gen_install_name(arg, 1);        cmd_data->module_name.install = gen_install_name(arg, 2);#ifdef TRUNCATE_DLL_NAME        if (shared) {          arg = truncate_dll_name(arg);        }#endif        cmd_data->output_name = arg;        return 1;    }    if (strcmp(ext, "lo") == 0) {        cmd_data->basename = arg;        cmd_data->output = otObject;        newarg = (char *)malloc(strlen(arg) + 2);        strcpy(newarg, arg);        ext = strrchr(newarg, '.') + 1;        strcpy(ext, OBJECT_EXT);        cmd_data->output_name = newarg;        return 1;    }    return 0;}void parse_args(int argc, char *argv[], command_t *cmd_data){    int a;    char *arg;    int argused;    for (a = 1; a < argc; a++) {        arg = argv[a];        argused = 1;        if (arg[0] == '-') {            if (arg[1] == '-') {                argused = parse_long_opt(arg + 2, cmd_data);            }            else {                argused = parse_short_opt(arg + 1, cmd_data);            }            /* We haven't done anything with it yet, try some of the             * more complicated short opts... */            if (argused == 0 && a + 1 < argc) {                if (arg[1] == 'o' && !arg[2]) {                    arg = argv[++a];                    argused = parse_output_file_name(arg, cmd_data);                } else if (strcmp(arg+1, "MT") == 0) {                    if (!cmd_data->options.silent) {                        printf("Adding: %s\n", arg);                    }                    push_count_chars(cmd_data->arglist, arg);                    arg = argv[++a];                    if (!cmd_data->options.silent) {                        printf(" %s\n", arg);                    }                    push_count_chars(cmd_data->arglist, arg);                    argused = 1;                } else if (strcmp(arg+1, "rpath") == 0) {                    /* Aha, we should try to link both! */                    cmd_data->install_path = argv[++a];                    argused = 1;                } else if (strcmp(arg+1, "version-info") == 0) {                    /* Store for later deciphering */                    cmd_data->version_info = argv[++a];                    argused = 1;                } else if (strcmp(arg+1, "export-symbols-regex") == 0) {                    /* Skip the argument. */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -