您的位置:首页 > 运维架构 > Shell

BASH脚本(ok2makefile):生成带有makefile的C++ "Hello world"程序

2012-06-24 21:07 549 查看
这个脚本也是闲着没事儿准备以后用的,应用场景:“在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


大家也参与讨论一下,是不是你也在Linux下工作的时候有一些突发奇想的需求呢?围绕“如果有一个脚本可以XXX就好了。”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: