summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--project/common.mk1
-rw-r--r--src/driver/slbt_amain.c172
-rw-r--r--src/slibtool.c169
3 files changed, 173 insertions, 169 deletions
diff --git a/project/common.mk b/project/common.mk
index 27d8d9f..5b34286 100644
--- a/project/common.mk
+++ b/project/common.mk
@@ -2,6 +2,7 @@ COMMON_SRCS = \
src/internal/slibtool_libmeta_impl.c \
src/internal/slibtool_objmeta_impl.c \
src/internal/slibtool_symlink_impl.c \
+ src/driver/slbt_amain.c \
src/driver/slbt_driver_ctx.c \
src/driver/slbt_unit_ctx.c \
src/helper/slbt_archive_import.c \
diff --git a/src/driver/slbt_amain.c b/src/driver/slbt_amain.c
new file mode 100644
index 0000000..073f540
--- /dev/null
+++ b/src/driver/slbt_amain.c
@@ -0,0 +1,172 @@
+/*******************************************************************/
+/* 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 <unistd.h>
+#include <string.h>
+#include <slibtool/slibtool.h>
+#include "slibtool_driver_impl.h"
+
+#ifndef SLBT_DRIVER_FLAGS
+#define SLBT_DRIVER_FLAGS SLBT_DRIVER_VERBOSITY_ERRORS \
+ | SLBT_DRIVER_VERBOSITY_USAGE
+#endif
+
+static const char vermsg[] = "%s%s%s (git://midipix.org/slibtool): "
+ "version %s%d.%d.%d%s.\n"
+ "%s%s%s%s%s\n";
+
+static const char * const slbt_ver_color[6] = {
+ "\x1b[1m\x1b[35m","\x1b[0m",
+ "\x1b[1m\x1b[32m","\x1b[0m",
+ "\x1b[1m\x1b[34m","\x1b[0m"
+};
+
+static const char * const slbt_ver_plain[6] = {
+ "","",
+ "","",
+ "",""
+};
+
+static ssize_t slbt_version(struct slbt_driver_ctx * dctx)
+{
+ const struct slbt_source_version * verinfo;
+ const char * const * verclr;
+ bool gitver;
+
+ verinfo = slbt_source_version();
+ verclr = isatty(STDOUT_FILENO) ? slbt_ver_color : slbt_ver_plain;
+ gitver = strcmp(verinfo->commit,"unknown");
+
+ return fprintf(stdout,vermsg,
+ verclr[0],dctx->program,verclr[1],
+ verclr[2],verinfo->major,verinfo->minor,
+ verinfo->revision,verclr[3],
+ gitver ? "[commit reference: " : "",
+ verclr[4],gitver ? verinfo->commit : "",
+ verclr[5],gitver ? "]" : "");
+}
+
+static void slbt_perform_driver_actions(struct slbt_driver_ctx * dctx)
+{
+ if (dctx->cctx->drvflags & SLBT_DRIVER_CONFIG)
+ dctx->nerrors += (slbt_output_config(dctx) < 0);
+
+ if (dctx->cctx->mode == SLBT_MODE_COMPILE)
+ dctx->nerrors += (slbt_exec_compile(dctx,0) < 0);
+
+ if (dctx->cctx->mode == SLBT_MODE_EXECUTE)
+ dctx->nerrors += (slbt_exec_execute(dctx,0) < 0);
+
+ if (dctx->cctx->mode == SLBT_MODE_INSTALL)
+ dctx->nerrors += (slbt_exec_install(dctx,0) < 0);
+
+ if (dctx->cctx->mode == SLBT_MODE_LINK)
+ dctx->nerrors += (slbt_exec_link(dctx,0) < 0);
+}
+
+static void slbt_perform_unit_actions(struct slbt_unit_ctx * uctx)
+{
+ (void)uctx;
+}
+
+static int slbt_exit(struct slbt_driver_ctx * dctx, int nerrors)
+{
+ if (nerrors && errno)
+ strerror(errno);
+
+ slbt_free_driver_ctx(dctx);
+ return nerrors ? 2 : 0;
+}
+
+int slbt_main(int argc, char ** argv, char ** envp)
+{
+ int ret;
+ uint64_t flags;
+ struct slbt_driver_ctx * dctx;
+ struct slbt_unit_ctx * uctx;
+ const char ** unit;
+ char * program;
+ char * dash;
+ char * sargv[5];
+
+ /* --version only? */
+ if ((argc == 2) && (!strcmp(argv[1],"--version")
+ || !strcmp(argv[1],"--help-all")
+ || !strcmp(argv[1],"--help")
+ || !strcmp(argv[1],"-h"))) {
+ sargv[0] = argv[0];
+ sargv[1] = argv[1];
+ sargv[2] = "--mode=compile";
+ sargv[3] = "<compiler>";
+ sargv[4] = 0;
+
+ return (slbt_get_driver_ctx(sargv,envp,SLBT_DRIVER_FLAGS,&dctx))
+ ? 2 : (slbt_version(dctx) < 0)
+ ? slbt_exit(dctx,2)
+ : slbt_exit(dctx,0);
+ }
+
+ /* program */
+ if ((program = strrchr(argv[0],'/')))
+ program++;
+ else
+ program = argv[0];
+
+ /* dash */
+ if ((dash = strrchr(program,'-')))
+ dash++;
+
+ /* flags */
+ if (dash == 0)
+ flags = SLBT_DRIVER_FLAGS;
+
+ else if (!(strcmp(dash,"shared")))
+ flags = SLBT_DRIVER_FLAGS | SLBT_DRIVER_DISABLE_STATIC;
+
+ else if (!(strcmp(dash,"static")))
+ flags = SLBT_DRIVER_FLAGS | SLBT_DRIVER_DISABLE_SHARED;
+
+ else
+ flags = SLBT_DRIVER_FLAGS;
+
+ /* debug */
+ if (!(strcmp(program,"dlibtool")))
+ flags |= SLBT_DRIVER_DEBUG;
+
+ else if (!(strncmp(program,"dlibtool",8)))
+ if ((program[8] == '-') || (program[8] == '.'))
+ flags |= SLBT_DRIVER_DEBUG;
+
+ /* legabits */
+ if (!(strcmp(program,"clibtool")))
+ flags |= SLBT_DRIVER_LEGABITS;
+
+ else if (!(strncmp(program,"clibtool",8)))
+ if ((program[8] == '-') || (program[8] == '.'))
+ flags |= SLBT_DRIVER_LEGABITS;
+
+ /* driver context */
+ if ((ret = slbt_get_driver_ctx(argv,envp,flags,&dctx)))
+ return (ret == SLBT_USAGE) ? !--argc : 2;
+
+ if (dctx->cctx->drvflags & SLBT_DRIVER_VERSION)
+ if ((slbt_version(dctx)) < 0)
+ return slbt_exit(dctx,2);
+
+ slbt_perform_driver_actions(dctx);
+ ret += dctx->nerrors;
+
+ for (unit=dctx->units; *unit; unit++) {
+ if (!(slbt_get_unit_ctx(dctx,*unit,&uctx))) {
+ slbt_perform_unit_actions(uctx);
+ ret += uctx->nerrors;
+ slbt_free_unit_ctx(uctx);
+ }
+ }
+
+ return slbt_exit(dctx,ret);
+}
diff --git a/src/slibtool.c b/src/slibtool.c
index 63b570c..9b97705 100644
--- a/src/slibtool.c
+++ b/src/slibtool.c
@@ -4,178 +4,9 @@
/* Released under the Standard MIT License; see COPYING.SLIBTOOL. */
/*******************************************************************/
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
#include <slibtool/slibtool.h>
-#include "slibtool_driver_impl.h"
-
-#ifndef SLBT_DRIVER_FLAGS
-#define SLBT_DRIVER_FLAGS SLBT_DRIVER_VERBOSITY_ERRORS \
- | SLBT_DRIVER_VERBOSITY_USAGE
-#endif
-
-static const char vermsg[] = "%s%s%s (git://midipix.org/slibtool): "
- "version %s%d.%d.%d%s.\n"
- "%s%s%s%s%s\n";
-
-static const char * const slbt_ver_color[6] = {
- "\x1b[1m\x1b[35m","\x1b[0m",
- "\x1b[1m\x1b[32m","\x1b[0m",
- "\x1b[1m\x1b[34m","\x1b[0m"
-};
-
-static const char * const slbt_ver_plain[6] = {
- "","",
- "","",
- "",""
-};
-
-static ssize_t slbt_version(struct slbt_driver_ctx * dctx)
-{
- const struct slbt_source_version * verinfo;
- const char * const * verclr;
- bool gitver;
-
- verinfo = slbt_source_version();
- verclr = isatty(STDOUT_FILENO) ? slbt_ver_color : slbt_ver_plain;
- gitver = strcmp(verinfo->commit,"unknown");
-
- return fprintf(stdout,vermsg,
- verclr[0],dctx->program,verclr[1],
- verclr[2],verinfo->major,verinfo->minor,
- verinfo->revision,verclr[3],
- gitver ? "[commit reference: " : "",
- verclr[4],gitver ? verinfo->commit : "",
- verclr[5],gitver ? "]" : "");
-}
-
-static void slbt_perform_driver_actions(struct slbt_driver_ctx * dctx)
-{
- if (dctx->cctx->drvflags & SLBT_DRIVER_CONFIG)
- dctx->nerrors += (slbt_output_config(dctx) < 0);
-
- if (dctx->cctx->mode == SLBT_MODE_COMPILE)
- dctx->nerrors += (slbt_exec_compile(dctx,0) < 0);
-
- if (dctx->cctx->mode == SLBT_MODE_EXECUTE)
- dctx->nerrors += (slbt_exec_execute(dctx,0) < 0);
-
- if (dctx->cctx->mode == SLBT_MODE_INSTALL)
- dctx->nerrors += (slbt_exec_install(dctx,0) < 0);
-
- if (dctx->cctx->mode == SLBT_MODE_LINK)
- dctx->nerrors += (slbt_exec_link(dctx,0) < 0);
-}
-
-static void slbt_perform_unit_actions(struct slbt_unit_ctx * uctx)
-{
- (void)uctx;
-}
-
-static int slbt_exit(struct slbt_driver_ctx * dctx, int nerrors)
-{
- if (nerrors && errno)
- strerror(errno);
-
- slbt_free_driver_ctx(dctx);
- return nerrors ? 2 : 0;
-}
-
-int slbt_main(int argc, char ** argv, char ** envp)
-{
- int ret;
- uint64_t flags;
- struct slbt_driver_ctx * dctx;
- struct slbt_unit_ctx * uctx;
- const char ** unit;
- char * program;
- char * dash;
- char * sargv[5];
-
- /* --version only? */
- if ((argc == 2) && (!strcmp(argv[1],"--version")
- || !strcmp(argv[1],"--help-all")
- || !strcmp(argv[1],"--help")
- || !strcmp(argv[1],"-h"))) {
- sargv[0] = argv[0];
- sargv[1] = argv[1];
- sargv[2] = "--mode=compile";
- sargv[3] = "<compiler>";
- sargv[4] = 0;
-
- return (slbt_get_driver_ctx(sargv,envp,SLBT_DRIVER_FLAGS,&dctx))
- ? 2 : (slbt_version(dctx) < 0)
- ? slbt_exit(dctx,2)
- : slbt_exit(dctx,0);
- }
-
- /* program */
- if ((program = strrchr(argv[0],'/')))
- program++;
- else
- program = argv[0];
-
- /* dash */
- if ((dash = strrchr(program,'-')))
- dash++;
-
- /* flags */
- if (dash == 0)
- flags = SLBT_DRIVER_FLAGS;
-
- else if (!(strcmp(dash,"shared")))
- flags = SLBT_DRIVER_FLAGS | SLBT_DRIVER_DISABLE_STATIC;
-
- else if (!(strcmp(dash,"static")))
- flags = SLBT_DRIVER_FLAGS | SLBT_DRIVER_DISABLE_SHARED;
-
- else
- flags = SLBT_DRIVER_FLAGS;
-
- /* debug */
- if (!(strcmp(program,"dlibtool")))
- flags |= SLBT_DRIVER_DEBUG;
-
- else if (!(strncmp(program,"dlibtool",8)))
- if ((program[8] == '-') || (program[8] == '.'))
- flags |= SLBT_DRIVER_DEBUG;
-
- /* legabits */
- if (!(strcmp(program,"clibtool")))
- flags |= SLBT_DRIVER_LEGABITS;
-
- else if (!(strncmp(program,"clibtool",8)))
- if ((program[8] == '-') || (program[8] == '.'))
- flags |= SLBT_DRIVER_LEGABITS;
-
- /* driver context */
- if ((ret = slbt_get_driver_ctx(argv,envp,flags,&dctx)))
- return (ret == SLBT_USAGE) ? !--argc : 2;
-
- if (dctx->cctx->drvflags & SLBT_DRIVER_VERSION)
- if ((slbt_version(dctx)) < 0)
- return slbt_exit(dctx,2);
-
- slbt_perform_driver_actions(dctx);
- ret += dctx->nerrors;
-
- for (unit=dctx->units; *unit; unit++) {
- if (!(slbt_get_unit_ctx(dctx,*unit,&uctx))) {
- slbt_perform_unit_actions(uctx);
- ret += uctx->nerrors;
- slbt_free_unit_ctx(uctx);
- }
- }
-
- return slbt_exit(dctx,ret);
-}
-
-#ifndef SLIBTOOL_IN_A_BOX
int main(int argc, char ** argv, char ** envp)
{
return slbt_main(argc,argv,envp);
}
-
-#endif