/*******************************************************************/
/* slibtool: a skinny libtool implementation, written in C */
/* Copyright (C) 2016 Z. Gilboa */
/* Released under the Standard MIT License; see COPYING.SLIBTOOL. */
/*******************************************************************/
#include <stdio.h>
#include <stdbool.h>
#include <slibtool/slibtool.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 -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);
}