From a9cfe4a0639462e3834adee3d6136c3d41c5dce3 Mon Sep 17 00:00:00 2001 From: midipix Date: Sat, 21 May 2016 00:35:59 -0400 Subject: link mode: slbt_create_library_wrapper(): initial implementation. --- src/internal/slibtool_libmeta_impl.c | 147 +++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 src/internal/slibtool_libmeta_impl.c (limited to 'src/internal/slibtool_libmeta_impl.c') diff --git a/src/internal/slibtool_libmeta_impl.c b/src/internal/slibtool_libmeta_impl.c new file mode 100644 index 0000000..f08aa94 --- /dev/null +++ b/src/internal/slibtool_libmeta_impl.c @@ -0,0 +1,147 @@ +/*******************************************************************/ +/* 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_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 -1; + + /* 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) + ? -1 : 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); +} -- cgit v1.2.3