char* chaz_SharedLib_no_version_filename(chaz_SharedLib *lib) { const char *prefix = S_get_prefix(); const char *shlib_ext = chaz_OS_shared_lib_ext(); return chaz_Util_join("", prefix, lib->name, shlib_ext, NULL); }
void chaz_CFlags_hide_symbols(chaz_CFlags *flags) { if (flags->style == CHAZ_CFLAGS_STYLE_GNU && strcmp(chaz_OS_shared_lib_ext(), ".dll") != 0) { chaz_CFlags_append(flags, "-fvisibility=hidden"); } }
char* chaz_SharedLib_filename(chaz_SharedLib *lib) { const char *shlib_ext = chaz_OS_shared_lib_ext(); if (strcmp(shlib_ext, ".dll") == 0) { return S_build_filename(lib, lib->major_version, shlib_ext); } else { return S_build_filename(lib, lib->version, shlib_ext); } }
void chaz_CFlags_set_shared_library_version(chaz_CFlags *flags, chaz_SharedLib *lib) { const char *shlib_ext = chaz_OS_shared_lib_ext(); char *string; if (flags->style != CHAZ_CFLAGS_STYLE_GNU || strcmp(shlib_ext, ".dll") == 0) { return; } if (strcmp(chaz_OS_shared_lib_ext(), ".dylib") == 0) { const char *version = chaz_SharedLib_get_version(lib); string = chaz_Util_join(" ", "-current_version", version, NULL); } else { char *soname = chaz_SharedLib_major_version_filename(lib); string = chaz_Util_join("", "-Wl,-soname,", soname, NULL); free(soname); } chaz_CFlags_append(flags, string); free(string); }
static char* S_build_filename(chaz_SharedLib *lib, const char *version, const char *ext) { const char *prefix = S_get_prefix(); const char *shlib_ext = chaz_OS_shared_lib_ext(); if (strcmp(shlib_ext, ".dll") == 0) { return chaz_Util_join("", prefix, lib->name, "-", version, ext, NULL); } else if (strcmp(shlib_ext, ".dylib") == 0) { return chaz_Util_join("", prefix, lib->name, ".", version, ext, NULL); } else { return chaz_Util_join("", prefix, lib->name, ext, ".", version, NULL); } }
void chaz_CFlags_compile_shared_library(chaz_CFlags *flags) { const char *string; if (flags->style != CHAZ_CFLAGS_STYLE_GNU || strcmp(chaz_OS_shared_lib_ext(), ".dll") == 0 ) { return; } if (chaz_OS_is_darwin()) { string = "-fno-common"; } else { string = "-fPIC"; } chaz_CFlags_append(flags, string); }
void chaz_CFlags_link_shared_library(chaz_CFlags *flags) { const char *string; if (flags->style == CHAZ_CFLAGS_STYLE_MSVC) { string = "/DLL"; } else if (flags->style == CHAZ_CFLAGS_STYLE_GNU) { if (strcmp(chaz_OS_shared_lib_ext(), ".dylib") == 0) { string = "-dynamiclib"; } else { string = "-shared"; } } else { chaz_Util_die("Don't know how to link a shared library with '%s'", chaz_CC_get_cc()); } chaz_CFlags_append(flags, string); }
char* chaz_SharedLib_major_version_filename(chaz_SharedLib *lib) { const char *shlib_ext = chaz_OS_shared_lib_ext(); return S_build_filename(lib, lib->major_version, shlib_ext); }