/*******************************************************************/ /* slibtool: a skinny libtool implementation, written in C */ /* Copyright (C) 2016 Z. Gilboa */ /* Released under the Standard MIT License; see COPYING.SLIBTOOL. */ /*******************************************************************/ #include #include #include #include "slibtool_errinfo_impl.h" #include "slibtool_metafile_impl.h" static int slbt_create_default_library_wrapper( const struct slbt_driver_ctx * dctx, struct slbt_exec_ctx * ectx, char * arname, char * soname, char * soxyz, char * solnk) { int ret; FILE * fout; const char * header; const char * base; bool fnover; bool fvernum; int current; int revision; int age; const struct slbt_source_version * verinfo; (void)ectx; /* create */ if (!(fout = fopen(dctx->cctx->output,"w"))) return SLBT_SYSTEM_ERROR(dctx); /* version info */ current = 0; age = 0; revision = 0; if (dctx->cctx->verinfo.verinfo) sscanf(dctx->cctx->verinfo.verinfo,"%d:%d:%d", ¤t,&revision,&age); fnover = !!(dctx->cctx->drvflags & SLBT_DRIVER_AVOID_VERSION); fvernum = !!(dctx->cctx->verinfo.vernumber); verinfo = slbt_source_version(); /* wrapper header */ header = "libtool compatible library wrapper\n"; base = ""; /* wrapper content */ ret = fprintf(fout, "# %s%s" "# Generated by %s (slibtool %d.%d.%d)\n" "# [commit reference: %s]\n\n" "dlname='%s'\n" "library_names='%s %s %s'\n" "old_library='%s'\n\n" "inherited_linker_flags='%s'\n" "dependency_libs='%s'\n" "weak_library_names='%s'\n\n" "current=%d\n" "age=%d\n" "revision=%d\n\n" "installed=%s\n" "shouldnotlink=%s\n\n" "dlopen='%s'\n" "dlpreopen='%s'\n\n" "libdir='%s'\n", /* wrapper header */ base,header, /* nickname, verinfo */ dctx->program, verinfo->major,verinfo->minor,verinfo->revision, verinfo->commit, /* dlname */ fnover ? solnk : soxyz, /* library_names */ fnover ? solnk : soxyz, fnover ? solnk : soname, solnk, /* old_library */ arname, /* inherited_linker_flags, dependency_libs, weak_library_names */ "","","", /* current, age, revision */ fvernum ? dctx->cctx->verinfo.major : current, fvernum ? dctx->cctx->verinfo.minor : age, fvernum ? dctx->cctx->verinfo.major : revision, /* installed, shouldnotlink */ "no","no", /* dlopen, dlpreopen */ "","", /* libdir */ dctx->cctx->rpath ? dctx->cctx->rpath : ""); return (ret <= 0) || fclose(fout) ? SLBT_SYSTEM_ERROR(dctx) : 0; } static int slbt_create_compatible_library_wrapper( const struct slbt_driver_ctx * dctx, struct slbt_exec_ctx * ectx, char * arname, char * soname, char * soxyz, char * solnk) { /* awaiting submission */ return slbt_create_default_library_wrapper( dctx,ectx,arname,soxyz,soname,solnk); } int slbt_create_library_wrapper( const struct slbt_driver_ctx * dctx, struct slbt_exec_ctx * ectx, char * arname, char * soname, char * soxyz, char * solnk) { if (dctx->cctx->drvflags & SLBT_DRIVER_LEGABITS) return slbt_create_compatible_library_wrapper( dctx,ectx,arname,soxyz,soname,solnk); else return slbt_create_default_library_wrapper( dctx,ectx,arname,soxyz,soname,solnk); }