这个脚本也是闲着没事儿准备以后用的,应用场景:“在Linux下开发C++项目的时候,有时候需要临时创建一个简单的C++工程来尝试一些用法,但是全新编写一个带有makefile的hello world还是需要几分钟时间的,也是个反复的活儿,要是有个命令能够一下子生成一个目录,里边含有main.cc和makefile就好了。”
如果你也会经常遇到这种场景,到可以试试ok2makefile.sh脚本,很爽的哦!
建议用法:
Step 1: 拷贝这个ok2makefile.sh脚本到目录"~/bin"。
Step 2: 创建一个命令以备后用,当然得放在"~/.bashrc"中。
Step 3: 使用这个命令创建一个简易C++工程。
全部操作如下:
xiwang@ubuntu:~/Dev/ok2makefile$ mkdir -p ~/bin
xiwang@ubuntu:~/Dev/ok2makefile$ cp ok2makefile.sh ~/bin
xiwang@ubuntu:~/Dev/ok2makefile$ echo 'alias ok2makefile="~/bin/ok2makefile.sh"' >>~/.bashrc
xiwang@ubuntu:~/Dev/ok2makefile$ . ~/.bashrc
xiwang@ubuntu:~/Dev/ok2makefile$ ok2makefile -n mydemo
mydemo created.
# 尝试使用
xiwang@ubuntu:~/Dev$ ok2makefile -n mydemo
mydemo created.
xiwang@ubuntu:~/Dev$ cd mydemo/
xiwang@ubuntu:~/Dev/mydemo$ ls
main.cc makefile
xiwang@ubuntu:~/Dev/mydemo$ make
g++ -Wall -I. -D_DEBUG -c main.cc -o main.cc.o
g++ -D_DEBUG -L. main.cc.o -o mydemo -lpthread
xiwang@ubuntu:~/Dev/mydemo$ ./mydemo
Hello World!
下边就是ok2makefile.sh脚本内容:
#!/bin/bash
# ok2makefile.sh, 2012-06-23 T1110
# Generate a very simple project with makefile for c/c++, java, etc.
#
# OPTIONS
# -n name | --name name
# Name of demo, default "MyTEST"
WORKDIR=$PWD
while [ $# -ne 0 ]; do
case "$1" in
-n|--name)
ARG_NAME="$2"; export ARG_NAME
shift; shift;
;;
-h|--help)
echo "ok2makefile -n name"
shift;
exit 0
;;
*)
echo "error, see by <$0 -h>"
shift;
exit 0
;;
esac
done
# $1 => name
confirm_name() {
test ! -z "$1" || {
ARG_NAME="MyTEST"; export ARG_NAME
}
test ! -d "$1" || {
echo "option <-n name> is required incorrectly."
exit 1
}
}
confirm_name "$ARG_NAME"
# mkdir $NAME
mkdir -p $ARG_NAME
cd $ARG_NAME
touch makefile
touch main.cc
# create makefile
cat <<EOF >makefile
# Makefile, 2012-06-23 T1110
# TODO
# ----------------------------------
NAME = $(echo $ARG_NAME | tr '[:upper:]' '[:lower:]')
VERSION = 1.0.0
RELEASE = 01
# ----------------------------------
BIN = \$(NAME)
OBJS = \$(patsubst %.cpp,%.cpp.o,\$(wildcard \$(SRC_DIR)/*.cpp))
OBJS += \$(patsubst %.cc,%.cc.o,\$(wildcard \$(SRC_DIR)/*.cc))
OBJS += \$(patsubst %.C,%.C.o,\$(wildcard \$(SRC_DIR)/*.C))
# TODO
# BEGIN ----------------------------------
# Folders
SRC_DIR = .
# Flags
CXXFLAGS = -Wall
CXXFLAGS += -I\$(SRC_DIR)
CPPFLAGS = -D_DEBUG
LDFLAGS = -L\$(SRC_DIR)
LIBS = -lpthread
# END ----------------------------------
.PHONY: all clean
all: \$(BIN)
\$(BIN): \$(OBJS)
\$(CXX) \$(CPPFLAGS) \$(LDFLAGS) \$^ -o \$@ \$(LIBS)
# source files
%.cpp.o: %.cpp
\$(CXX) \$(CXXFLAGS) \$(CPPFLAGS) -c \$^ -o \$@
%.cc.o: %.cc
\$(CXX) \$(CXXFLAGS) \$(CPPFLAGS) -c \$^ -o \$@
%.C.o: %.C
\$(CXX) \$(CXXFLAGS) \$(CPPFLAGS) -c \$^ -o \$@
clean:
\$(RM) \$(BIN) \$(OBJS)
EOF
# END create makefile
# create main.cc
cat <<EOF >main.cc
#include <iostream>
int main(int argc, char **argv) {
std::cout << "Hello World!" << std::endl;
return 0;
}
EOF
# END create main.cc
echo "$ARG_NAME created."
exit 0