常见的makefile写法【转】

转自:http://blog.csdn.net/ghostyu/article/details/7755177

版权声明:本文为博主原创文章,未经博主允许不得转载。

1、目标名称,摆脱手动设置目标名称

[cpp] view plain copy

    TARGET = $(notdir $(CURDIR))
    all:$(TARGET)
        CMD....  

$(CURDIR) 表示Makfile当前目录全路径

$(notdir $(path)) 表示把path目录去掉路径名,只留当前目录名
这样就可以得到Makefile当前目录名称,用目录名作为目标程序名是一个不错的选择

2、使用include,把所有Makefile共享的设置包含进来

[cpp] view plain copy

    BASE_DIR = /root/DM36x
    include $(BASE_DIR)/Rules.make  

    XDC_PATH = $(DMAI_INSTALL_DIR)/packages  

[cpp] view plain copy

    DMAI_INSTALL_DIR在Rules.make中已经设置过,这样,需要使用DMAI_INSTALL_DIR变量的时候只要include 这个Rules.make接可以了  

3、遍历遍历所有特定的源文件

[cpp] view plain copy

    SOURCES = $(wildcard *.c)
    HEADERS = $(wildcard *.h)  

如果当前目录先有 main.c  func.c  func.h 

这样SOURCES变量就等于main.c  func.c

HEADERS变量就等于func.h

这样就每次添加源文件后 就不需要重新修改makefile了

4、替换文件名称

[cpp] view plain copy

    OBJFILES = $(SOURCES:%.c=%.o)  

如果SOURCES等与3中的main.c和func.c

这样OBJFILES就等于main.o func.o 

同样摆脱了手动修改编译的中间文件名

5、交叉编译设置

[cpp] view plain copy

    VERBOSE = @
    COMPILE.c = $(VERBOSE) $(MVTOOL_PREFIX)gcc $(C_FLAGS) $(CPP_FLAGS) -c
    LINK.c = $(VERBOSE) $(MVTOOL_PREFIX)gcc $(LD_FLAGS)  

6、编译

[cpp] view plain copy

    $(OBJFILES):    %.o: %.c $(HEADERS)   

        @echo Compiling $@ from $<..  

        $(COMPILE.c)  -o $@ $<  

7、

[cpp] view plain copy

    install:    $(if $(wildcard $(TARGET)), install_$(TARGET))
    install_$(TARGET):
        @install -d $(EXEC_DIR)
        @install $(TARGET) $(EXEC_DIR)
        @install $(TARGET).txt $(EXEC_DIR)
        @echo
        @echo Installed $(TARGET) binaries to $(EXEC_DIR)..  

先判断当前目录是否有$(TARGET),如果有,就执行伪目标install_$(TARGET),这个展开了就相当于install_app,如果$(TARGET)等于app的话

 

时间: 2024-10-23 03:49:47

常见的makefile写法【转】的相关文章

kconfig-linux内核模块N多文件Makefile写法

问题描述 linux内核模块N多文件Makefile写法 现在有一个大型的用户层驱动程序(目标文件是一个.o) 要移植到内核层,以模块的形式加载.那么问题来了,如此多的源文件还是必须按照内核模块Makefile那样: obj-m: mode.o mode.o-y: a.o b.o c.o d.o ..... 这种方式吗?那不是整个驱动的代码结构都要重构?所有的源文件里的头文件目录也有重写?这不科学啊....肯定还有其它的办法对不对?!虽对内核模块有一定的了解但实际干的事很少,所以在此向大神们虚心

常见makefile写法

原文地址:blog.csdn.net/ghostyu/article/details/7755177 1.目标名称,摆脱手动设置目标名称 [cpp] view plaincopy   TARGET = $(notdir $(CURDIR))   all:$(TARGET)       CMD....   $(CURDIR) 表示Makfile当前目录全路径 $(notdir $(path)) 表示把path目录去掉路径名,只留当前目录名这样就可以得到Makefile当前目录名称,用目录名作为目标

XHTML校验常见的错误写法

1.标签"p"不能在"span"中使用.它只能在 applet, blockquote, body, button, center, dd, del, div, fieldset, form, iframe, ins, li, map, noframes, noscript, object, td, th 中使用. [XHTML 1.0 Transitional] 2.在标签之间发现 &.请考虑使用等式实体(& a m p = '&'.&am

单例模式及常见写法分析(设计模式01)

保证一个类仅有一个实例,并提供一个该实例的全局访问点. --<设计模式> 单例模式的概念很简单,下面以C#语言为例子,列出常见单例写法的优缺点. 1.简单实现 public sealed class Singleton { static Singleton instance = null; public void Show() { Console.WriteLine( "instance function"); } private Singleton() { } publi

多个文件目录下Makefile的写法

1.前言 目前从事于linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile.关于Makefile的详细内容可以参考网上流传非常广泛的<跟我一起写Makefile>http://blog.csdn.net/haoel/article/details/2886/,作者是个大牛,非常佩服. 2.简单测试 测试程序在同一个文件中,共有func.h.func.c.main.c三个文件,Makefile写法如下所示: 1 CC = gcc 2 CFLAGS =

Makefile之大型工程项目子目录Makefile的一种通用写法【转】

转自:http://www.cnblogs.com/skyofbitbit/p/3680753.html 管理Linux环境下的C/C++大型项目,如果有一个智能的Build System会起到事半功倍的效果,本文描述Linux环境下大型工程项目子目录Makefile的一种通用写法,使用该方法,当该子目录内的文件有增删时无需对Makefile进行改动,可以说相当的智能. 下面先贴代码(为减小篇幅,一些非关键的代码被去掉,本方法的局限是用于一个C文件生成一个可执行文件的场合): ROOTDIR =

ISAPI-REWRITE伪静态规则写法以及说明_服务器其它

REWRITE伪静态 一.Apache配置: 进入/etc/httpd/conf/目录下,打开httpd.conf文件. 启用rewrite # LoadModule rewrite_module modules/mod_rewrite.so 去除前面的 # 启用.htaccess AllowOverride None 修改为: AllowOverride All ------------------------------------------------------------------

使用Autoconf检测MySQL相关的软件包

1. 本文的目标 目的:编译时,根据configure参数(如果有--with-mysql),选择性编译对应的MySQL相关的功能. 实现:使用已经写好的m4脚本:ax_lib_mysql.m4 2. 如何利用Autoconf实现 大部分你想到的事情都已经有人做过尝试了.这件事情也不例外,Autoconf中有很多脚本和指令帮你做事情.这里,需要使用ax_lib_mysql.m4来帮助我们.先把该文件放到程序/工程目录中,并在configure.ac中新增如下指令来检测MySQL库文件和版本: m

用Autoconf检测MySQL软件包的教程_Mysql

在你的程序(或者工程)中,如果编译阶段需要检测当前环境中是否存在MySQL客户端相关的库文件时,你可以使用Autoconf来帮你完成这个工作,轻盈.优雅.无痛.阅读本文需要了解简单GNU Autoconf使用.1. 本文的目标 目的:编译时,根据configure参数(如果有--with-mysql),选择性编译对应的MySQL相关的功能. 实现:使用已经写好的m4脚本:ax_lib_mysql.m42. 如何利用Autoconf实现 大部分你想到的事情都已经有人做过尝试了.这件事情也不例外,A