diff options
Diffstat (limited to 'git/new-c-proj')
-rwxr-xr-x | git/new-c-proj | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/git/new-c-proj b/git/new-c-proj new file mode 100755 index 0000000..ce04f39 --- /dev/null +++ b/git/new-c-proj @@ -0,0 +1,222 @@ +#!/bin/sh + +set -e + +if ! test $# = 1; then + printf 'usage %s: proj-name\n' "$0" >&2 + exit 1 +fi + +if printf '%s\n' "$1" | grep / >/dev/null 2>/dev/null; then + printf 'project name cannot contain a slash\n' "$0" >&2 + exit 1 +fi + +mkdir -- "$1" +cd -- "$1" +git init . + +cat > LICENSE <<EOF +ISC License + +© $(date +%Y) Mattias Andrée <maandree@kth.se> + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +EOF + +cat > .gitignore <<EOF +*\#* +*~ +*.o +*.a +*.lo +*.su +*.so +*.so.* +*.dll +*.dylib +*.gch +*.gcov +*.gcno +*.gcda +EOF + +printf '_*\n' >> .git/info/exclude + +if printf '%s\n' "$1" | grep '^lib' >/dev/null 2>/dev/null; then + UPPERCASE="$(printf '%s\n' "$1" | tr '[a-z-]' '[A-Z_]')" + LIBNAME="$(printf '%s\n' "$1" | sed 's/^lib//')" + + printf '%s\n' >> "$1".h \ + '/* See LICENSE file for copyright and license details. */' \ + "#ifndef ${UPPERCASE}_H" \ + "#define ${UPPERCASE}_H" \ + '' \ + '#endif' + + mkdir -p -- mk + + cat <<-EOF | sed 's/x\t/\t/g' > Makefile + .POSIX: + + CONFIGFILE = config.mk + include \$(CONFIGFILE) + + OS = linux + # Linux: linux + # Mac OS: macos + # Windows: windows + include mk/\$(OS).mk + + + LIB_MAJOR = 1 + LIB_MINOR = 0 + LIB_VERSION = \$(LIB_MAJOR).\$(LIB_MINOR) + LIB_NAME = ${LIBNAME} + + + OBJ = + + HDR =\\ + x $1.h + + LOBJ = \$(OBJ:.o=.lo) + + + all: $1.a $1.\$(LIBEXT) + \$(OBJ): \$(HDR) + \$(LOBJ): \$(HDR) + + .c.o: + x \$(CC) -c -o \$@ \$< \$(CFLAGS) \$(CPPFLAGS) + + .c.lo: + x \$(CC) -fPIC -c -o \$@ \$< \$(CFLAGS) \$(CPPFLAGS) + + $1.a: \$(OBJ) + x @rm -f -- \$@ + x \$(AR) rc \$@ \$(OBJ) + x \$(AR) ts \$@ > /dev/null + + $1.\$(LIBEXT): \$(LOBJ) + x \$(CC) \$(LIBFLAGS) -o \$@ \$(LOBJ) \$(LDFLAGS) + + install: $1.a $1.\$(LIBEXT) + x mkdir -p -- "\$(DESTDIR)\$(PREFIX)/lib" + x mkdir -p -- "\$(DESTDIR)\$(PREFIX)/include" + x cp -- $1.a "\$(DESTDIR)\$(PREFIX)/lib/" + x cp -- $1.\$(LIBEXT) "\$(DESTDIR)\$(PREFIX)/lib/$1.\$(LIBMINOREXT)" + x \$(FIX_INSTALL_NAME) "\$(DESTDIR)\$(PREFIX)/lib/$1.\$(LIBMINOREXT)" + x ln -sf -- $1.\$(LIBMINOREXT) "\$(DESTDIR)\$(PREFIX)/lib/$1.\$(LIBMAJOREXT)" + x ln -sf -- $1.\$(LIBMAJOREXT) "\$(DESTDIR)\$(PREFIX)/lib/$1.\$(LIBEXT)" + x cp -- $1.h "\$(DESTDIR)\$(PREFIX)/include/" + + uninstall: + x -rm -f -- "\$(DESTDIR)\$(PREFIX)/lib/$1.a" + x -rm -f -- "\$(DESTDIR)\$(PREFIX)/lib/$1.\$(LIBMAJOREXT)" + x -rm -f -- "\$(DESTDIR)\$(PREFIX)/lib/$1.\$(LIBMINOREXT)" + x -rm -f -- "\$(DESTDIR)\$(PREFIX)/lib/$1.\$(LIBEXT)" + x -rm -f -- "\$(DESTDIR)\$(PREFIX)/include/$1.h" + + clean: + x -rm -f -- *.o *.a *.lo *.su *.so *.so.* *.dll *.dylib + x -rm -f -- *.gch *.gcov *.gcno *.gcda *.\$(LIBEXT) + + .SUFFIXES: + .SUFFIXES: .lo .o .c + + .PHONY: all install uninstall clean + EOF + + cat <<-EOF | sed 's/x\t/\t/g' > mk/linux.mk + LIBEXT = so + LIBFLAGS = -shared -Wl,-soname,lib\$(LIB_NAME).\$(LIBEXT).\$(LIB_MAJOR) + LIBMAJOREXT = \$(LIBEXT).\$(LIB_MAJOR) + LIBMINOREXT = \$(LIBEXT).\$(LIB_VERSION) + + FIX_INSTALL_NAME = : + EOF + + cat <<-EOF | sed 's/x\t/\t/g' > mk/macos.mk + LIBEXT = dylib + LIBFLAGS = -dynamiclib -Wl,-compatibility_version,\$(LIB_MAJOR) -Wl,-current_version,\$(LIB_VERSION) + LIBMAJOREXT = \$(LIB_MAJOR).\$(LIBEXT) + LIBMINOREXT = \$(LIB_VERSION).\$(LIBEXT) + + FIX_INSTALL_NAME = install_name_tool -id "\$(PREFIX)/lib/$1.\$(LIBMAJOREXT)" + EOF + + cat <<-EOF | sed 's/x\t/\t/g' > mk/windows.mk + LIBEXT = dll + LIBFLAGS = -shared + LIBMAJOREXT = \$(LIB_MAJOR).\$(LIBEXT) + LIBMINOREXT = \$(LIB_VERSION).\$(LIBEXT) + + FIX_INSTALL_NAME = : + EOF +else + printf '%s\n' "/$1" >> .gitignore + + printf '%s\n' '/* See LICENSE file for copyright and license details. */' >> "$1".c + + cat <<-EOF | sed 's/x\t/\t/g' > Makefile + .POSIX: + + CONFIGFILE = config.mk + include \$(CONFIGFILE) + + OBJ =\\ + x $1.o + + HDR = + + all: $1 + \$(OBJ): \$(HDR) + + .c.o: + x \$(CC) -c -o \$@ \$< \$(CFLAGS) \$(CPPFLAGS) + + $1: \$(OBJ) + x \$(CC) -o \$@ \$(OBJ) \$(LDFLAGS) + + install: $1 + x mkdir -p -- "\$(DESTDIR)\$(PREFIX)/bin" + x mkdir -p -- "\$(DESTDIR)\$(MANPREFIX)/man1/" + x cp -- $1 "\$(DESTDIR)\$(PREFIX)/bin/" + x cp -- $1.1 "\$(DESTDIR)\$(MANPREFIX)/man1/" + + uninstall: + x -rm -f -- "\$(DESTDIR)\$(PREFIX)/bin/$1" + x -rm -f -- "\$(DESTDIR)\$(MANPREFIX)/man1/$1.1" + + clean: + x -rm -f -- *.o *.a *.lo *.su *.so *.so.* *.gch *.gcov *.gcno *.gcda + x -rm -f -- $1 + + .SUFFIXES: + .SUFFIXES: .o .c + + .PHONY: all install uninstall clean + EOF +fi + +cat > config.mk <<-EOF + PREFIX = /usr + MANPREFIX = \$(PREFIX)/share/man + + CC = c99 + + CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_GNU_SOURCE + CFLAGS = + LDFLAGS = +EOF |