一、前言

最近有个想法,想把 ineedle 整体架构从头自己编写代码来实现一下,来加深对iNeedle系统的理解,同时加强Linux + C相关知识。由于iNeedle系统的庞大,只能是先把框架搭起来,根据某些功能再往里边添加东西。首先遇到的问题就是每写一部分代码都要进行调试,既不想使用gcc独立的命令来进行调试,这样代码多了或路径复杂就难以控制;又不想使用iNeedle原版的编译文件,于是自己按照旧版本抽取出需要编译iNeedle系统的脚本代码来。这个脚本用来编译iNeedle项目,主要是利用了bakefile工具。bakefile是一个跨平台的自动生成makefile的开源工具,需要在项目中的每个子目录中指定***.bkl配置文件(该配置文件指定需要编译哪些文件,指定头文件等),bakefile利用每个子目录中bkl文件来生成相应的makefile文件;然后在主目录(编译文件所在目录)中生成主makefile文件,由主makefile直接进行系统编译,生成可执行程序。

1、如果CentOS系统安装:

yum install bakefile -y

2、如果debian或ubuntu系统:
需要源码安装,可以到官网下载bakefile-0.2.9.tar.gz版本的即可:

tar -zxvf bakefile-0.2..tar.gz;
cd bakefile-0.2.;
./configure;
make;
make install

二、bakefile使用

bakefile -f gnu "$folder.bkl" -o "$folder.mk" >/dev/null >&

单独使用使用make命令进行编译:

make -f ineedle.mk install

三、bkl文件参考

 <?xml version="1.0"?>
<makefile>
<template id="posT">
<include>../include/pcap</include>
<include>../include/</include>
<include>./</include>
<sources>pos/pos_lib.c</sources>
<sources>pos/pos_var.c</sources>
<sources>pos/db_var.c</sources>
<sources>pos/pos_db.c</sources>
<sources>pos/hk.c</sources>
<sources>pos/hashfunctions.c</sources>
<sources>pos/md5.c</sources>
<sources>pos/ios_time.c</sources>
<sources>pos/pos_ut.c</sources>
<sources>pos/ios_sparse.c</sources>
<sources>pos/pos_lock.c</sources>
<sources>pos/iweb_api.c</sources>
<sources>pos/db_clean.c</sources>
<sources>pos/pos_mem.c</sources>
</template>
<exe id="pos_obj" template="posT"></exe>
</makefile>

四、iNeedle系统编译脚本

#!/bin/bash
#
# 这个编译文件是从老版本compile.dat中提取出来单独编译ineedle的,目的是用来调试ineedle使用的。
#
project_name="ineedle"
project_modl="root shell pos cfg ilog session sha timer traf filter istat lex monitor cron http report diskdb dll alarm snmp persist system"
project_shuc="nd"
project_targ="ineedle"
project_cmpa="-L../lib/linux -lpcap -lmysqlclient -lhasp_linux_96828 -rdynamic -ldl -lnetsnmp"
project_macr="DBG DBG2 INEEDLE_ROOT NCURSES _INEEDLE_AMON _INEEDLE_USTAT _INEEDLE_URL _INEEDLE_CIP _INEEDLE_WEBDELAY _INEEDLE_AMON_ABN _INEEDLE_ALARM _INEEDLE_ELOG _INEEDLE_POST _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE _LARGEFILE64_SOURCE " compileFlag="debug"
splitter="------------------------------------------------------"
SECFLAG=`expr ` function show_copyright()
{
tput clear
tput smso
echo $splitter
echo " iNeedle Compiler &copyright dztec.cn "
echo $splitter
echo
tput rmso
} function loopmodules()
{
modules=$project_modl
echo $spiltter
echo "generating module files......"
echo $spiltter for folder in $modules;do
#echo $folder
folder=`expr $folder | tr -d ' '`
filepath="$folder/$folder.bkl"
#echo $filepath
if [ ! -r "$filepath" ];then
echo -n -e "file: '$filepath' doesnot exit!"
tput blink
echo -e "\tPlz check the file"
tput sgr0
SECFLAG=`expr `
continue
fi cd "$folder"
folderlen=`expr length $folder`
if [ $folderlen -lt ];then
echo -n -e "generating $folder.mk ...... \t\t\t\t"
else
echo -n -e "generating $folder.mk ...... \t\t\t"
fi if ! bakefile -f gnu "$folder.bkl" -o "$folder.mk" >/dev/null >& ;then
tput smso
tput smul
echo "[FAILED]"
cd "../"
tput rmso
tput sgr0
SECFLAG=`expr `
continue
fi
tput blink
tput smul
echo "[OK]"
tput sgr0
cd "../"
done
} function genemake()
{
target=ineedle
compileMacro=$project_macr
targetMakeFile="ineedle.mk"
modules=$project_modl
compile_arg=$project_cmpa
if [ $compileFlag == "debug" ];then
CFLAGS="CFLAGS=-g"
release="-g"
for flg in $compileMacro
do
CFLAGS="$CFLAGS -D$flg"
done
fi
rm $targetMakeFile >/dev/null >&
echo "TARGET = $target" >> $targetMakeFile
echo "$CFLAGS" >> $targetMakeFile
HEAD="" for folder in $modules
do
FOLD=`expr $folder | tr a-z A-Z`
HEAD="$HEAD \$("$FOLD"_OBJ_OBJECTS)"
echo "include $folder/$folder.mk" >> $targetMakeFile
done echo >> $targetMakeFile
echo "install:$target">>$targetMakeFile
echo >> $targetMakeFile
echo "$target:$HEAD">>$targetMakeFile
echo -e -n "\t\$(CC)$HEAD $release -o $target $compile_arg" >>$targetMakeFile } function parseerror()
{
echo $splitter
warnings=`cat .temp | grep -E "warning" | wc -l`
tput smso
echo -n "WARNINGS: "
tput rmso
echo $warnings
tput smso
echo -n "ERRORS: "
echo "--"
tput rmso
echo
cat .temp | grep -E -i "cannot|multiple|undefined|Error|Stop" | sed 's/.*\/\(.*\/.*\)/\1/'
echo $splitter
} function move_compile_files()
{
target="ineedle"
mv *.o ../obj >/dev/null >&
mv *.d ../obj >/dev/null >&
mv ./$target ../release/ >/dev/null >&
chmod u+s ../release/$target
chmod g+s ../release/$target
} function compile()
{
target=ineedle
targetMakeFile=ineedle.mk
if make -f $targetMakeFile install >.temp >& ;then
echo $splitter
tput smso
echo "Compiled successfully!"
tput rmso
echo $splitter
echo
else
parseerror
tput smso
echo "Compiling failed!"
tput rmso
echo $spiltter
fi
cat .temp | grep -V ".mk\|gcc -c -o" >.warning
} function run()
{
pnn="ineedle" tput smso
echo $splitter
tput rmso
tput smso
echo "compiling $pnn......"
tput rmso
tput smso
echo $splitter
tput rmso loopmodules if [ $SECFLAG == ]; then
echo $splitter
tput smso
echo "error happened"
tput rmso
echo $splitter
exit
fi genemake
compile
move_compile_files
} function load_header_file()
{
if [ -r "./ineedle-linux.h" ];then
cp ineedle-linux.h ineedle.h
fi
} load_header_file
show_copyright
run

使用bakefile编译C工程代码的更多相关文章

  1. VS2010每次编译都重新编译整个工程的解决方案

      在使用VS2010编译C++程序的时候,每次修改工程中的某一个文件,点击“生成-仅用于项目-仅生成**”时,往往都是整个工程都需要重新编译一遍.由于这个工程代码量太大,每次编译完成都需要将近10分 ...

  2. 在VS13上编译通过的代码放在12上编译-错误:l __dtoui3 referenced in function _event_debug_map_HT_GROW

    在VS13上编译通过的代码放在12上编译 遇到错误:l __dtoui3 referenced in function _event_debug_map_HT_GROW 1>------ 已启动 ...

  3. KEIL MDK编译后的代码量和RAM使用详解

    一般 MCU 包含的存储空间有:片内 Flash 与片内 RAM,RAM 相当于内存,Flash 相当于硬盘.编译器会将一个程序分为好几个部分,分别存储在 MCU 不同的存储区.Keil 工程在编译完 ...

  4. 使用Jenkins + git submodule 实现自动化编译,解决代码安全性问题

    道哥的第 030 篇原创 目录 一.一个真实的代码泄漏故事 二.Jenkins 的基本使用 1. Jenkins 是什么? 2. 安装 JDK8 3. 安装 Jenkins 4. 在浏览器中配置 Je ...

  5. 反编译.NET工程

    工具:       1.  .Net Reflector       2.   远程桌面 步骤: 1. 远程桌面连接到服务器 IP,port,user,pwd 2. 打开 IIS 这里面就是所部属的网 ...

  6. apt 根据注解,编译时生成代码

    apt: @Retention后面的值,设置的为CLASS,说明就是编译时动态处理的.一般这类注解会在编译的时候,根据注解标识,动态生成一些类或者生成一些xml都可以,在运行时期,这类注解是没有的~~ ...

  7. 转:Android开发实践:用脚本编译Android工程

    转自: http://ticktick.blog.51cto.com/823160/1365947 一般情况下,我们都是使用Eclipse+ADT插件或者Android studio软件来编译Andr ...

  8. 如何在编译Xcode-Plugin工程的时候增加Cocoapods依赖

    关于如何在编译Xcode-Plugin工程的时候增加Cocoapods依赖 以及在Mac App上使用Cocoapods的时候遇到Library not found for -lPods时的解决办法 ...

  9. C#动态编译、执行代码

    在开始之前,先熟悉几个类及部分属性.方法:CSharpCodeProvider.ICodeCompiler.CompilerParameters.CompilerResults.Assembly. 一 ...

随机推荐

  1. spring3.0结合Redis在项目中的运用

    推荐一个程序员的论坛网站:http://ourcoders.com/home/ 以下内容使用到的技术有:Redis缓存.SpringMVC.Maven.项目中使用了redis缓存,目的是在业务场景中, ...

  2. Scalaz(27)- Inference & Unapply :类型的推导和匹配

    经过一段时间的摸索,用scala进行函数式编程的过程对我来说就好像是想着法儿如何将函数的款式对齐以及如何正确地匹配类型,真正是一种全新的体验,但好像有点太偏重学术型了. 本来不想花什么功夫在scala ...

  3. Verilog学习笔记设计和验证篇(五)...............层次化事件队列

    详细的了解层次化事件队列有助于理解Verilog的阻塞赋值和非阻塞赋值功能.所谓层次化事件队列指的是用于调度仿真时间的不同Verilog事件队列.在IEEE的5.3节中定义了层次化事件队列在逻辑上分为 ...

  4. 通过Google身份验证器加强Linux帐户安全

    下载Google的身份验证模块: # wget https://google-authenticator.googlecode.com/files/libpam-google-authenticato ...

  5. C# 泛型的协变和逆变

    1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量.协变和逆变是两个相互对立的概念: 如 ...

  6. PhotoSwipe - 移动开发必备的 iOS 风格相册

    PhotoSwipe 是一个专门针对移动设备的图像画廊,它的灵感来自 iOS 的图片浏览器和谷歌移动端图像. PhotoSwipe 提供您的访客熟悉和直观的界面,使他们能够与您的移动网站上的图像进行交 ...

  7. Web 前沿——HTML5 Form Data 对象的使用

    XMLHttpRequest Level 2 添加了一个新的接口——FormData.利用 FormData 对象,我们可以通过 JavaScript 用一些键值对来模拟一系列表单控件,我们还可以使用 ...

  8. 推荐25款很棒的 HTML5 开发框架和开发工具【上篇】

    HTML5 在不同的领域让网页设计更强大的.快速,安全,响应式,互动和美丽,这些优点吸引更多的 Web 开发人员使用 HTML5.HTML5 有许多新的特性功能,允许开发人员和设计师创建应用程序和网站 ...

  9. #8.12.16总结#background transition、animation、transform

    background-origin 设置元素背景图片的原始起始位置.必须保证背景是background-repeat为no-repeat此属性才会生效. background-origin :bord ...

  10. 【转】ES6 手册

    目录 var 和 let/const 的比较 用块级作用域代替 IIFES 箭头函数 字符串 解构 模块 参数 类 Classes Symbols Maps WeakMaps Promises Gen ...