#!/bin/bash # # automake / autoconf build environmet generator for c++ # # usage ./cpp_skelton.sh [project name] # if [ $# -lt 1 ]; then echo "usage:" echo "./cpp_skelton.sh [project name]" exit 1 fi PROJECT_NAME=${1} SRC_DIR="src" PROGRAM_PREFIX="cpp" HEADER_PREFIX="hpp" LIB_NAME=${SRC_DIR}/lib${PROJECT_NAME}.${HEADER_PREFIX} LIB_SRC_NAME=${SRC_DIR}/lib${PROJECT_NAME}.${PROGRAM_PREFIX} RUN_NAME=${SRC_DIR}/${PROJECT_NAME}.${PROGRAM_PREFIX} TEST_NAME=${SRC_DIR}/${PROJECT_NAME}_test.${PROGRAM_PREFIX} INIT_VERSION=0.1 EMAIL=hogehoge@hogehoge.hoge if [ -d $1 ]; then echo "[error] The directory $1 already exist." exit 1 fi mkdir ${PROJECT_NAME} cd ${PROJECT_NAME} touch AUTHORS COPYING ChangeLog INSTALL NEWS README Makefile.am mkdir ${SRC_DIR} # create library file: lib#{PROJECT_NAME}.${HEADER_PREFIX} touch ${LIB_NAME} echo "#include namespace ${PROJECT_NAME} { class ${PROJECT_NAME} { public: ${PROJECT_NAME}() { std::cout << \"create ${PROJECT_NAME}\" << std::endl; } ~${PROJECT_NAME}() { std::cout << \"delete ${PROJECT_NAME}\" << std::endl; } }; } " >> ${LIB_NAME} # create library source file: lib${PROJECT_NAME}.${PROGRAM_PREFIX} touch ${LIB_SRC_NAME} ${RUN_NAME} ${TEST_NAME} echo "#include \"lib${PROJECT_NAME}.${HEADER_PREFIX}\" namespace ${PROJECT_NAME} { } " >> ${LIB_SRC_NAME} # create run file: ${PROJECT_NAME}.${PROGRAM_PREFIX} touch ${RUN_NAME} ${TEST_NAME} echo "#include \"lib${PROJECT_NAME}.${HEADER_PREFIX}\" namespace ${PROJECT_NAME} { } int main(int argc, char** argv) { std::cout << \"start ${PROJECT_NAME}\" << std::endl; ${PROJECT_NAME}::${PROJECT_NAME} ${PROJECT_NAME}; } " >> ${RUN_NAME} # create test program: ${PROJECT_NAME}_test.${PROGRAM_PREFIX} touch ${TEST_NAME} echo "#include \"lib${PROJECT_NAME}.${HEADER_PREFIX}\" namespace ${PROJECT_NAME} { void runTest() { ${PROJECT_NAME}::${PROJECT_NAME}(); } } int main(int argc, char** argv) { ${PROJECT_NAME}::runTest(); } " >> ${TEST_NAME} # edit Makefile.am echo "SUBDIRS = src" >> Makefile.am autoscan # edit configure.in AC_INIT_REGEX="AC_INIT(\[FULL-PACKAGE-NAME\], \[VERSION\], \[BUG-REPORT-ADDRESS\])" AC_INIT_AFTER="AC_INIT(\[${PROJECT_NAME}\], \[${INIT_VERSION}\], \[${EMAIL}\])" AM_INIT_AFTER="AM_INIT_AUTOMAKE(${PROJECT_NAME}, ${INIT_VERSION})" cp configure.scan configure.in sed -e "s/${AC_INIT_REGEX}/${AC_INIT_AFTER}\n${AM_INIT_AFTER}/" configure.in > configure.tmp mv configure.tmp configure.in sed -e "s/\# Checks for programs./\# Checks for programs.\nAC_LANG(C++)\nAC_PROG_LIBTOOL/" configure.in > configure.tmp mv configure.tmp configure.in sed -e "s/AC_CONFIG_FILES(\[Makefile\])/AC_CONFIG_FILES(\[Makefile src\/Makefile\])/" configure.in > configure.tmp mv configure.tmp configure.in # edit src/Makefile.am echo "lib_LTLIBRARIES = lib${PROJECT_NAME}.la lib${PROJECT_NAME}_la_CPPFLAGS = -Wall lib${PROJECT_NAME}_la_LDFLAGS = lib${PROJECT_NAME}_la_SOURCES = lib${PROJECT_NAME}.${HEADER_PREFIX} lib${PROJECT_NAME}.${PROGRAM_PREFIX} pkginclude_HEADERS = lib${PROJECT_NAME}.${HEADER_PREFIX} bin_PROGRAMS = ${PROJECT_NAME} ${PROJECT_NAME}_test ${PROJECT_NAME}_CPPFLAGS = -Wall ${PROJECT_NAME}_LDADD = lib${PROJECT_NAME}.la ${PROJECT_NAME}_SOURCES = ${PROJECT_NAME}.${PROGRAM_PREFIX} ${PROJECT_NAME}_test_CPPFLAGS = -Wall ${PROJECT_NAME}_test_LDADD = lib${PROJECT_NAME}.la ${PROJECT_NAME}_test_SOURCES = ${PROJECT_NAME}_test.${PROGRAM_PREFIX} TESTS = ${PROJECT_NAME}_test" > ${SRC_DIR}/Makefile.am # run autoreconf / create Makefile.in autoreconf -vfi