$ git clone http://tcclient.ion.nu/tc_client.git
commit 84413b92a72d623b906d4c605d4db2351a99a34c
Author: Alicia <...>
Date:   Sat May 23 18:10:59 2015 +0200

    Added an 'install' make target, adjusted utilities to run tc_client from PATH unless they were run from the build directory (i.e. './<executable>')

diff --git a/ChangeLog b/ChangeLog
index 3cc21f3..2420b4b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,5 @@
 0.32:
+Added an 'install' make target, adjusted utilities to run tc_client from PATH unless they were run from the build directory (i.e. './<executable>')
 irchack: send passwords by pipe, not argument.
 tc_client-gtk: ignore anything after the offset in /mbs commands.
 0.31:
diff --git a/Makefile b/Makefile
index ad075f4..af9513d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,7 @@
 VERSION=0.32pre
 CFLAGS=-g3 -Wall $(shell curl-config --cflags)
 LIBS=-g3 $(shell curl-config --libs)
+PREFIX=/usr/local
 ifneq ($(wildcard config.mk),)
   include config.mk
 endif
@@ -17,6 +18,7 @@ ifdef AVUTIL_LIBS
 ifdef SWSCALE_LIBS
   UTILS+=camviewer tc_client-gtk
   CFLAGS+=$(GTK_CFLAGS) $(AVCODEC_CFLAGS) $(AVUTIL_CFLAGS) $(SWSCALE_CFLAGS)
+  INSTALLDEPS+=tc_client-gtk gtkgui.glade
   ifdef AO_LIBS
     ifdef AVRESAMPLE_LIBS
       CFLAGS+=-DHAVE_AVRESAMPLE=1 $(AVRESAMPLE_CFLAGS) $(AO_CFLAGS)
@@ -36,8 +38,11 @@ ifdef CURSES_LIBS
 ifdef READLINE_LIBS
   UTILS+=cursedchat
   CFLAGS+=$(CURSES_CFLAGS) $(READLINE_CFLAGS)
+  INSTALLDEPS+=cursedchat
 endif
 endif
+CFLAGS+=-DPREFIX=\"$(PREFIX)\"
+INSTALLDEPS=tc_client
 
 tc_client: $(OBJ)
  $(CC) $(LDFLAGS) $^ $(LIBS) -o $@
@@ -71,3 +76,21 @@ SOURCES+=utilities/gtk/camviewer.c utilities/gtk/userlist.c utilities/gtk/media.
 SOURCES+=utilities/compat.c utilities/compat.h utilities/list.c utilities/list.h utilities/stringutils.c utilities/stringutils.h
 tarball:
  tar -cJf tc_client-$(VERSION).tar.xz --transform='s|^|tc_client-$(VERSION)/|' $(SOURCES)
+
+install: $(INSTALLDEPS)
+ install -m 755 -D tc_client "$(PREFIX)/bin/tc_client"
+ifdef GTK_LIBS
+ifdef AVCODEC_LIBS
+ifdef AVUTIL_LIBS
+ifdef SWSCALE_LIBS
+ install -m 755 -D tc_client-gtk "$(PREFIX)/bin/tc_client-gtk"
+ install -D gtkgui.glade "$(PREFIX)/share/tc_client/gtkgui.glade"
+endif
+endif
+endif
+endif
+ifdef CURSES_LIBS
+ifdef READLINE_LIBS
+ install -m 755 -D cursedchat "$(PREFIX)/bin/tc_client-cursedchat"
+endif
+endif
diff --git a/configure b/configure
index 6d37dbf..7d21e90 100755
--- a/configure
+++ b/configure
@@ -6,6 +6,7 @@ host=''
 while [ "$#" -gt 0 ]; do
   case "$1" in
   --host=*) host="`echo "$1" | sed -e 's/--host=//'`";;
+  --prefix=*) echo "$1" | sed -e 's/--prefix=/PREFIX=/' >> config.mk;;
   esac
   shift
 done
diff --git a/utilities/camviewer/camviewer.c b/utilities/camviewer/camviewer.c
index 1d83ca9..ac52f75 100644
--- a/utilities/camviewer/camviewer.c
+++ b/utilities/camviewer/camviewer.c
@@ -505,8 +505,8 @@ int main(int argc, char** argv)
     close(tc_client_in[1]);
     dup2(tc_client[1], 1);
     dup2(tc_client_in[0], 0);
-    argv[0]="./tc_client";
-    execv("./tc_client", argv);
+    argv[0]=(strncmp(argv[0], "./", 2)?"tc_client":"./tc_client");
+    execvp(argv[0], argv);
   }
   close(tc_client_in[0]);
   GIOChannel* tcchannel=g_io_channel_unix_new(tc_client[0]);
diff --git a/utilities/cursedchat/cursedchat.c b/utilities/cursedchat/cursedchat.c
index 60ddc5e..dd3ad67 100644
--- a/utilities/cursedchat/cursedchat.c
+++ b/utilities/cursedchat/cursedchat.c
@@ -331,7 +331,7 @@ char* completenicks(const char* text, int state)
 
 int main(int argc, char** argv)
 {
-  if(argc<3){execv("./tc_client", argv); return 1;}
+  if(argc<3){execvp(strncmp(argv[0], "./", 2)?"tc_client":"./tc_client", argv); return 1;}
   setlocale(LC_ALL, "");
   WINDOW* w=initscr();
   signal(SIGWINCH, resizechat);
@@ -373,8 +373,8 @@ int main(int argc, char** argv)
     close(app_out[0]);
     dup2(app_in[0],0);
     dup2(app_out[1],1);
-    argv[0]="./tc_client";
-    execv("./tc_client", argv);
+    argv[0]=(strncmp(argv[0], "./", 2)?"tc_client":"./tc_client");
+    execvp(argv[0], argv);
     _exit(1);
   }
   close(app_in[0]);
diff --git a/utilities/gtk/camviewer.c b/utilities/gtk/camviewer.c
index 82aa5cc..4990b21 100644
--- a/utilities/gtk/camviewer.c
+++ b/utilities/gtk/camviewer.c
@@ -76,6 +76,8 @@ int tc_client_in[2];
 const char* channel=0;
 const char* mycolor=0;
 char* nickname=0;
+char frombuild=0; // Running from the build directory
+#define TC_CLIENT (frombuild?"./tc_client":"tc_client")
 
 void updatescaling(struct viddata* data, unsigned int width, unsigned int height)
 {
@@ -720,9 +722,9 @@ void startsession(GtkButton* button, struct viddata* data)
     dup2(tc_client_in[0], 0);
     if(acc_user[0])
     {
-      execl("./tc_client", "./tc_client", "-u", acc_user, channel, nick, chanpass, (char*)0);
+      execlp(TC_CLIENT, TC_CLIENT, "-u", acc_user, channel, nick, chanpass, (char*)0);
     }else{
-      execl("./tc_client", "./tc_client", channel, nick, chanpass, (char*)0);
+      execlp(TC_CLIENT, TC_CLIENT, channel, nick, chanpass, (char*)0);
     }
   }
   if(acc_user[0]){dprintf(tc_client_in[1], "%s\n", acc_pass);}
@@ -766,6 +768,7 @@ void startsession(GtkButton* button, struct viddata* data)
 
 int main(int argc, char** argv)
 {
+  if(!strncmp(argv[0], "./", 2)){frombuild=1;}
   struct viddata data={0,0,0,0,0};
   avcodec_register_all();
   data.vdecoder=avcodec_find_decoder(AV_CODEC_ID_FLV1);
@@ -801,7 +804,13 @@ int main(int argc, char** argv)
 #endif
 
   gtk_init(&argc, &argv);
-  GtkBuilder* gui=gtk_builder_new_from_file("gtkgui.glade");
+  GtkBuilder* gui;
+  if(frombuild)
+  {
+    gui=gtk_builder_new_from_file("gtkgui.glade");
+  }else{
+    gui=gtk_builder_new_from_file(PREFIX "/share/tc_client/gtkgui.glade");
+  }
   gtk_builder_connect_signals(gui, 0);
   data.gui=gui;
 
diff --git a/utilities/irchack/irchack.c b/utilities/irchack/irchack.c
index 516d746..e50835b 100644
--- a/utilities/irchack/irchack.c
+++ b/utilities/irchack/irchack.c
@@ -46,6 +46,8 @@ struct color colortable[]={
   {"35;1", "\x03""13"},
   {"35;1", "\x03""13"}
 };
+char frombuild=0; // Running from the source directory
+#define TC_CLIENT (frombuild?"./tc_client":"tc_client")
 
 const char* findcolor_irc(const char* ansi)
 {
@@ -189,9 +191,9 @@ char session(int sock, const char* nick, const char* channel, const char* pass,
     dup2(tc_out[1], 1);
     if(acc_user && acc_pass)
     {
-      execl("./tc_client", "./tc_client", "-u", acc_user, channel, nick, pass, (char*)0);
+      execlp(TC_CLIENT, TC_CLIENT, "-u", acc_user, channel, nick, pass, (char*)0);
     }else{
-      execl("./tc_client", "./tc_client", channel, nick, pass, (char*)0);
+      execlp(TC_CLIENT, TC_CLIENT, channel, nick, pass, (char*)0);
     }
     perror("Failed to exec tc_client");
     _exit(1);
diff --git a/utilities/modbot/modbot.c b/utilities/modbot/modbot.c
index 4f02146..1b8a9d9 100644
--- a/utilities/modbot/modbot.c
+++ b/utilities/modbot/modbot.c
@@ -224,7 +224,7 @@ int main(int argc, char** argv)
              "-l/--log <file> = log output into <file>\n"
              "-v/--verbose    = print/log all incoming messages\n"
              "\n");
-      execv("./tc_client", argv);
+      execvp(strncmp(argv[0], "./", 2)?"tc_client":"./tc_client", argv);
       return 1;
     }
   }
@@ -238,7 +238,7 @@ int main(int argc, char** argv)
     close(out[0]);
     dup2(in[0], 0);
     dup2(out[1], 1);
-    execv("./tc_client", argv);
+    execvp(strncmp(argv[0], "./", 2)?"tc_client":"./tc_client", argv);
     _exit(1);
   }
   close(in[0]);