1:首先是Makefile.def:

————————————————————————————————————————

在所有驱动的makefile中有!INCLUDE $(_MAKEENVROOT)\makefile.def

找到(_MAKEENVROOT)\makefile.def所在地方C:\WINCE500\PUBLIC\COMMON\OAK\MISC(这个路径下真是很多wince的精华所在,sysgen菜单的批处理文件就在这里了)

现在来看看这个makefile.def是什么东西。我觉得这个是真的makefile的前奏。

makefile.def非常庞大,不过都是一些环境变量的判断等,比如RELEASETYPE 的判断等,如果没有设置就是默认的。

在它的最后有

!IF EXIST(.\makefile.inc)
!  IFDEF WINCETARGETFILES
!    INCLUDE .\makefile.inc
!  ELSE IFDEF WINCETARGETFILE0
!    INCLUDE .\makefile.inc
!  ELSE IF "$(SPECIAL_IRC_DEPENDENT)" != "0" && "$(SPECIAL_IRC_DEPENDENT)" != ""
#
# Added for internationalization
#
!    INCLUDE .\makefile.inc
!  ENDIF
!ENDIF

!IF EXIST($(_PROJECTROOT)\oak\misc\makefilepost.inc)
!  INCLUDE $(_PROJECTROOT)\oak\misc\makefilepost.inc
!ENDIF

!IF "$(BSP_TW8816_KEY)"=="1"

CDEFINES=$(CDEFINES) -DBSP_TW8816_KEY

!ENDIF

——————从这个可以看出,他结束之后到makefile了:真的好复杂啊。

++++++++++++++++++++++++++++++继续.................

makefile.def: Including C:\WINCE500\public\common\oak\misc\sources.ReleaseType_DEFAULT
Creating appropriate directories and deleting COMMON.LOC
Copying base resources to C:\WINCE500\public\common\oak\lib\ARMV4I\retail\0409
 mkdir C:\WINCE500\public\common\oak\lib\ARMV4I\retail\0409 > nul 2>&1
 xcopy /I C:\WINCE500\public\common\oak\lib\ARMV4I\retail\*.res C:\WINCE500\public\common\oak\lib\ARMV4I\retail\0409

把一些资源文件拷贝到下面这个路径(拷贝之前创建)

C:\WINCE500\PUBLIC\COMMON\OAK\LIB\ARMV4I\RETAIL\0409

+++++++++++++++++++++++++++++++继续..................

现在以2410 SDHC的DLL是如何生成的为例子在build.log找到相应信息。

BUILD_MARKER:LINK_DLL_END
 nmake  /NOLOGO C:\WINCE500\PBWorkspaces\KITL\WINCE500\smdk2440a_ARMV4I\cesysgen\oak\target\ARMV4I\retail\sdhc_sc2410.dll
makefile.def: Invoked with predefined settings:
TARGETNAME: sdhc_sc2410
TARGETTYPE: DYNLINK
RELEASETYPE: OAK
TARGETLIBS: C:\WINCE500\public\common\oak\lib\ARMV4I\retail\sdhc_sc2410_lib.lib C:\WINCE500\PBWorkspaces\KITL\WINCE500\smdk2440a_ARMV4I\cesysgen\oak\lib\ARMV4I\retail\ceddk.lib C:\WINCE500\PBWorkspaces\KITL\WINCE500\smdk2440a_ARMV4I\cesysgen\oak\lib\ARMV4I\retail\sdcardlib.lib C:\WINCE500\PBWorkspaces\KITL\WINCE500\smdk2440a_ARMV4I\cesysgen\oak\lib\ARMV4I\retail\sdhclib.lib C:\WINCE500\PBWorkspaces\KITL\WINCE500\smdk2440a_ARMV4I\cesysgen\oak\lib\ARMV4I\retail\sdbus.lib C:\WINCE500\PBWorkspaces\KITL\WINCE500\smdk2440a_ARMV4I\cesysgen\sdk\lib\ARMV4I\retail\coredll.lib
SOURCELIBS: 
DEFFILE: C:\WINCE500\public\common\oak\lib\ARMV4I\retail\sdhc_sc2410.def
EXEENTRY: WinMain
DLLENTRY: DllEntry
makefile.def: BUILDROOT is C:\WINCE500\public\common\cesysgen
0 Please add _COMMONPUBROOT and __PROJROOT to your tree''s cesysgen\sources file.
Directory: C:\WINCE500\PUBLIC\COMMON\CESYSGEN
TARGETNAME: sdhc_sc2410
makefile.def: Including C:\WINCE500\public\common\oak\misc\sources.ReleaseType_OAK//没有设置ReleaseType即默认OAK了
BUILD_MARKER:LINK_DLL_START Linking C:\WINCE500\PBWorkspaces\KITL\WINCE500\smdk2440a_ARMV4I\cesysgen\oak\lib\ARMV4I\retail\sdhc_sc2410.lib
 link -lib -out:C:\WINCE500\PBWorkspaces\KITL\WINCE500\smdk2440a_ARMV4I\cesysgen\oak\lib\ARMV4I\retail\sdhc_sc2410.lib -def:C:\WINCE500\public\common\oak\lib\ARMV4I\retail\sdhc_sc2410.def -machine:thumb @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\nm16D.tmp

————现在知道这个wince下自带的驱动是如何生成的了。哈哈。

——————————————————————————————————————————

——————————————————————————————————————————

现在再来看BSP下的驱动是如何生成的DLL的。

Linking \WINCE500\PLATFORM\SMDK2440A\Src\Drivers\camera\ directory.
BUILD: [00:0000000746:PROG  ] ''NMAKE.EXE   -i -c BUILDMSG=Stop.  LINKONLY=1 NOPASS0=1 MAKEDLL=1''
BUILD: [01:0000000747:INFO  ] makefile.def: BUILDROOT is C:\WINCE500\PLATFORM\SMDK2440A

BUILD: [01:0000000748:INFO  ] makefile.def: Including C:\WINCE500\PLATFORM\SMDK2440A\sources.cmn

BUILD: [01:0000000749:INFO  ] Directory: C:\WINCE500\PLATFORM\SMDK2440A\Src\Drivers\camera

BUILD: [01:0000000750:INFO  ] TARGETNAME: camera

BUILD: [01:0000000751:INFO  ] makefile.def: Including C:\WINCE500\public\common\oak\misc\sources.ReleaseType_PLATFORM

BUILD: [01:0000000752:PROGC ] Linking C:\WINCE500\platform\smdk2440a\lib\ARMV4I\retail\camera.lib

BUILD: [01:0000000753:INFO  ]  link -lib -out:C:\WINCE500\platform\smdk2440a\lib\ARMV4I\retail\camera.lib -def:camera.def -machine:thumb @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\nm91C.tmp

BUILD: [01:0000000754:INFO  ] Microsoft (R) Library Manager Version 7.10.4017

BUILD: [01:0000000755:INFO  ] Copyright (C) Microsoft Corporation.  All rights reserved.

BUILD: [01:0000000756:INFO  ]

BUILD: [01:0000000757:INFO  ] -nodefaultlib

BUILD: [01:0000000758:INFO  ] -ignore:4001

BUILD: [01:0000000759:INFO  ] -subsystem:windowsce,5.00

BUILD: [01:0000000760:INFO  ] obj\ARMV4I\retail\camera.obj

BUILD: [01:0000000761:INFO  ] C:\WINCE500\platform\smdk2440a\lib\ARMV4I\retail\ceddk.lib

BUILD: [01:0000000762:INFO  ]    Creating library C:\WINCE500\platform\smdk2440a\lib\ARMV4I\retail\camera.lib and object C:\WINCE500\platform\smdk2440a\lib\ARMV4I\retail\camera.exp

BUILD: [01:0000000763:INFO  ]  set LIB=C:\WINCE500\sdk\CE\lib

BUILD: [01:0000000764:PROGC ] Linking C:\WINCE500\platform\smdk2440a\target\ARMV4I\retail\camera.dll

BUILD: [01:0000000765:INFO  ]  link /LARGEADDRESSAWARE -out:C:\WINCE500\platform\smdk2440a\target\ARMV4I\retail\camera.dll

—————从这个camera驱动可以看出,BSP和微软自带的驱动生成DLL几乎是一致的,只是第一次生成的lib位置不同而已。

看了build.log文件
已经得出答案:我们选sysgen没有编译微软的源代码,我们装上PB的时候他的源代码的lib已经存在他规定的路径了。
我们实现的过程就是把他的lib拷贝到工程的相应的路径下,makefile再把他转换成DLL——最后打包
注意虽然BSP下的直接规定生成DLL,但是首先也是生成lib的,最后也和微软自带驱动一样,生成DLL

2:source

A、SOURCES文件的结构:

首先我们来看一个SOURCES文件,如下所示,SOURCES主要包括了一些用户的宏定义,这些宏会被MAKEFILE和NMAKE使用,来编译项目的源代码。

!if "$(BSP_NOHSMMC_CH0)"=="1" ##如果SMDK6410.BAT中SET BSP_NOHSMMC_CH0=1那么这个项目将不被编译。
SKIPBUILD=1
!endif

SYNCHRONIZE_DRAIN=1 
RELEASETYPE=PLATFORM##生成文件存放的位置

TARGETDEFNAME=s3c6410_hsmmc
DEFFILE=$(TARGETDEFNAME).def##指定DLL文件导出接口函数

TARGETNAME=s3c6410_hsmmc0 ##DLL文件名称
TARGETTYPE=DYNLINK ##表示生成DLL文件

DLLENTRY=DllEntry ##DLL入口地址

##以下是源文件里用的到宏的定义

CDEFINES=$(CDEFINES) # -D_SMDK6410_CH0_EXTCD_ # -D_SMDK6410_CH0_WP_

##以下是头文件的路径列表

INCLUDES=$(INCLUDES);..\s3c6410_hsmmc_lib

##以下是要动态链接的库文件

TARGETLIBS= \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\ceddk.lib    \
    $(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib    \
    $(_TARGETPLATROOT)\lib\$(_CPUINDPATH)\DriverLib.lib

##以下是要静态链接到目标文件中的库文件列表

SOURCELIBS=    \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\sdcardlib.lib    \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\sdbus2.lib    \
    $(_TARGETPLATROOT)\lib\$(_CPUINDPATH)\s3c6410_hsmmc0_lib.lib

SOURCES=s3c6410_hsmmc.cpp##要编译的源文件。

B、SOURCES文件调用的流程:

在要被构建的目录中,如果该目录中包含SOURCES文件,那么在相同的目录下一定还有MAKEFILE文件,通常MAKEFILE只包含一行内容:!INCLUDE $(_MAKEENVROOT)\makefile.def

其中_MAKEENVROOT = E:\E600\PUBLIC\COMMON\OAK\MISC (用SET命令查看),其中WINCE600\PUBLIC\COMMON\OAK\MISC\makefile.def 文件大概有3000行,是补所有WINCE 项目共享的公用MAKEFILE模板,在中间可以找到:

!INCLUDE $(MAKEDIR)\sources

这样makefile.def就包含了本地的SOURCES文件。因此,当构建系统在某个目录中调用NMAKE时,NMAKE会去使用该目录中的MAKEFILE,然后MAKEFILE把makefile.def展开到本地,makefile.def还会把本地的SOURCES文件包含进来,这样本地SOURCES文件中定义的宏与makefile.def中的宏共同起作用,就形成了一份完整的可被NMAKE使用的MAKEFILE。

c:Sources文件(告诉编译器和连接器如何编译及连接本驱动程序)
TARGETNAME=SPI //驱动动态库名字
RELEASETYPE=PLATFORM //发布类型,BSP包中的一个驱动
TARGETTYPE=DYNLINK //目标类型为动态库
TARGETLIBS=$(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib //需要连接的库
DEFFILE=SPI.def //.def文件名称
DLLENTRY=DllEntry//动态入口函数名称 :DllEntry
SOURCES=SPI.c//要编译的源代码

3、SOURCES.CMN文件的调用:

sources.cmn文件调用流程也同SOURCES文件一样的。从WINCE600\PUBLIC\COMMON\OAK\MISC\makefile.def 文件中如下代码可以看出:

!IF EXIST($(BUILDROOT)\sources.cmn)
!  MESSAGE makefile.def: Including $(BUILDROOT)\sources.cmn
!  INCLUDE $(BUILDROOT)\sources.cmn
!ENDIF

技巧:

尽量将驱动中用到的宏,放到PLATFORM\sources.cmn里面来定义,这样有一个好处,就是宏定义直观,方便查看,修改快捷。

sources.cmn是Common Source文件,BSP内所有的源代码编译都会用到该文件。里面定义一些比较常用的名词或环境变量或路径
source文件是针对特定目录的,只对当前目录有效。是针对当前目录的一些编译单位的环境变量或指定如何编译DLL等(将哪些文件或库编译进去)

wince下sources\sources.cmn\Makefile.def的相关作用相关推荐

  1. WinCE中sources文件中targetlibs与sourcelibs的作用与区别

    在WinCE里面,编译和链接的必备文件sources,做过WinCE BSP开发的一定都很熟悉,其中有2个关键字,targetlibs和sourcelibs,一直让我对其中的区别很感兴趣,故查阅了一些 ...

  2. wince下shell 的定制

    网上下载,看着还不错,转载给大家学习一下 wince下shell 的定制 http://blog.csdn.net/fanyw/archive/2009/11/12/4804547.aspx 首先我们 ...

  3. WinCE下光电编码器的驱动程序设计

    原文:http://article.ednchina.com/Embedded/20071209103917.htm 来源:中电网 | 作者:杨振坤 甘朝晖 蒋旻 引言 近年来,嵌入式技术发展迅速,嵌 ...

  4. maven下载不到源码:Cannot download sources Sources not found for:

    记录下记录下,很神奇的问题,也不去深究了,解决就行,侧重点不在这,就把方法记录下了 文章目录 问题 问题排查 方案一 Maven的镜像换一换试一试 方案二 删掉工程下的缓存和IDE配置文件 方案三 找 ...

  5. IDEA 下载依赖包源码报错 Cannot download sources Sources not found for:XXX

    场景: IDEA 在使用某些类方法想看下源码具体是啥时,由于只有 class 反编译的类文件,没有原始 Java 文件,因此想要将源码下载下来,却报了一个错误 Cannot download sour ...

  6. idea maven 下载源码出现:Cannot download sources Sources not found for: xxx

    15:47    Cannot download sources             Sources not found for:             org.springframework. ...

  7. Wince下usb驱动详细总结(史无前例的详细)

    0,前言: 1, 本篇文章只讲wince下的usb host驱动,并深入解析HID驱动.本博客的目的并不是只是为了讲怎么写驱动, 更重要的是: 1,了解wince驱动的架构. 2,学习微软的写作方法, ...

  8. 详解linux下auto工具制作Makefile源码包(制作篇)

    2019独角兽企业重金招聘Python工程师标准>>> 详解linux下auto工具制作Makefile源码包(制作篇) 水木杨 一.     概述 为了更好的制作configure ...

  9. WinCE下串口虚拟软件

    前段时间,介绍了一个WinCE下的串口调试软件Serial Splitter Mobile 3.2.它的主要功能是将一个物理串口克隆成N个,供不同的应用程序使用,以监视物理串口收发的数据.今天介绍一个 ...

最新文章

  1. firedac的TFDStoredProc动态创建并调用存储过程
  2. simulink中from与goto模块的使用
  3. OpenCASCADE绘制测试线束:几何命令之近似值
  4. 前端真的能做到彻底权限控制吗?
  5. AJPFX关于多态的应用
  6. 【英语学习】【Level 08】U03 My Choice L2 All-time favorite character
  7. MySQL高级-SQL优化步骤
  8. 全面拥抱云原生应用研发的拐点已经到来
  9. 你与30W奖金只差一个 Apache Flink 极客挑战赛的报名
  10. Jupyter Notebook激活conda对应的环境2
  11. Pyspark:电影推荐
  12. Jmeter录制脚本时消息体数据乱码
  13. html css 书签,CSS实现书签图案的效果
  14. Android 创建服务器 NanoHttpd
  15. Java经典全套面试汇总(二十万字)
  16. 手机模型真机图片的制作——UI出图
  17. 基于echarts 24种数据可视化展示,填充数据就可用,动手能力强的还可以DIY(演示地址+下载地址)
  18. Redis用来干嘛的?
  19. 【C#】KPM算法解决字符串匹配问题
  20. 垃圾回收算法——复制算法 以及eden和survivor

热门文章

  1. spring 可以有多个ioc容器吗
  2. 数字身份的一些应用和方案
  3. python unix时间戳转换成时间_关于python:将unix时间戳字符串转换为可读日期
  4. 需要使用新应用以打开此steam链接_steam社区界面打不开怎么办?完美解决方法看这里...
  5. Java高并发编程:使用JDK5中同步技术的3个面试题
  6. OCP12C题库,71sql的使用
  7. python list去掉引号_最新的python面试题集170之三(基础性学习)
  8. 动态规划——入门(1)
  9. 面试中Spring常见问题
  10. python中文件分类_Python中的类是否在不同的文件中?