zoukankan      html  css  js  c++  java
  • oMT7620N httpd_new的Makefile学习

    /opt/ralink-toolchains/buildroot-gcc342/bin/mipsel-linux-uclibc-gcc -o httpd main.o httpd.o basic.o ej.o cgi_main.o cgi_object.o cgi_util.     o cgi_cmd.o cgi_dump.o cgi_upload.o -Wl,-rpath, -L/home/wudi/origin/trunk/targets/MT7620N/fs.install/lib -L/home/wudi/origin/trunk/targets     /MT7620N/fs.install/lib/private -L/home/wudi/origin/trunk/targets/MT7620N/fs.install/lib/public -lcms_dal -lcms_msg -lcms_util -lcms_boardctl -lcrypt -lutil -ldl -lcms_core -lnanoxml -ldl -lmdm -lc

    EXE = httpd

        $(EXE): $(OBJS)

            $(CC) -o $@ $^ -Wl, -rpath, $(CMS_LIB_RPATH), $(CMS_LIB_PATH), $(LIBS)

    #Include  the rule for making dependcy files.

    #The "-" in front of the second include suppresses

    #error messages when make cannot find  the .d files.

    #It will just regenerate them.

    #See Section 4.14 of Gnu make.

    include $(BUILD_DIR)/make.deprules

    -incude $(OBJS:.o=.d)

     

    .o文件的生成是在-include $(OBJS:.o=.d)这一步生成的,按上述的英文描述, 在没有.d存在的时候,

    仅仅是生成.d文件而没有报错。

    .d的规则是在make.deprules中定义的。

    1. make.common中

        (1)

        ifndef TOOLCHAIN_TOP

        TOOLCHAIN_TOP = /opt/toolchains/uclibc-crosstools-gcc-4.4.2.1

        endif

        CFLAGS = $(CMS_COMPILE_FLAGS) $(CUSTOM_CFLAGS) $(ALLOWED_INCLUDE_PATHS) $(CMS_WLAN_FLAGS)

        CFLAGS += -I$(TOOLCHAIN)/include -L$(TOOLCHAIN)/lib

        CFLAGS += $(BRCM_WERROR_CFLAGS)

        CFLAGS += DP$(PROFILE)

        (2)

        MT7620N profile中

        TOOLCHAIN_TOP_DIR="/opt/ralink-toolchains/buildroot-gcc342"

        UCLIBC=y

        (3)

        make.common中

        ifeq ($(strip $(MT7620N)), y)

        TOOLCHAIN_TOP = $(TOOLCHAIN_TOP_DIR: "%"=%)

        TOOLCHAIN = $(TOOLCHAIN_TOP)

        LIBDIR = $(TOOLCHAIN_TOP)/lib

        USRLIBDIR = $(TOOLCHAIN_TOP)/usr/lib

        EXTRALIBDIR = $(TOOLCHAIN_TOP)/LIB

        EXTRAINCDIR = $(TOOLCHAIN)/usr/lib/gcc/mips-linux-uclibc/4.4.2/include

        LIB_PATH = $(TOOLCHAIN_TOP)/lib

        LIBCDIR = $(TOOLCHAIN_TOP)/lib

        export BRCM_WERROR_CFLAGS :=

        BRCM_COMMON_FLAGS :=

         export BRCM_APP_CFLAGS := $(BRCM_COMMON_FLAGS)

        export BRCM_SO_CFLAGS := $(BRCM_COMMON_FLAGS)

        CROSS_COMPILE = $(TOOLCHAIN)/bin/mipsel-linux-uclibc-

        ACTURAL_KERNEL_DIR = mt7620/linux-2.6.36.x

        endif

        AR = $(CROSS_COMPILE)ar

        AS = $(CROSS_COMPILE)as

        LD = $(CROSS_COMPILE)ld

        CC = $(CROSS_COMPILE)gcc

        CXX = $(CROSS_COMPILE)g++

        CPP = $(CROSS_COMPILE)cpp

        NM = $(CROSS_COMPILE)nm

        STRIP = $(CROSS_COMPILE)strip

        SSTRIP = $(CROSS_COMPILE)sstrip

        OBJCOPY = $(CROSS_COMPILE)objcopy

        OBJDUMP = $(CROSS_COMPILE)objdump

        RANLIB = $(CROSS_COMPILE)ranlib

        export TOOLCHAIN_TIP  TOOLCHAIN  LEGACY_TOOLCHAIN CROSS_COMPILE

                   AR AS LD CC CXX CPP  NM STRIP SSTRIP OBJCOPY OBJDUMP RANLIB

                   LIB_PATH LIBDIR USRLIBDIR EXTRALIBDIR EXTRAINCDIR LIBCDIR BUILD_GDBSERVER

    2. httpd_new的Makefile中

        all dynamic install: $(EXE) generic_exe_install cpall_html

        EXE = httpd

        $(EXE): $(OBJS)

            $(CC) -o $@ $^ -Wl, -rpath, $(CMS_LIB_RPATH), $(CMS_LIB_PATH), $(LIBS)

              (1) CC在make.common中定义了, 是toolchain下的gcc

                (2)  $@-目标文件,$^所有依赖的文件, $<第一个依赖的文件。

                (3)  -Wl(man ld), -W warning options,

                             -Wl, option, Linker Option

                      Linker Options

                      object-file-name  -l(library), -nostartfiles -nodefaultlibs, -nostdlib, -pie, -rdynamic,  -s,  -static,  -static-libgcc,  -static-libstdc++, 

                                                -shared, -shared-libgcc, -symboic, -T (script),     -Wl, option,     -Xlinker  (option),    -u (symbol)

                           Note: if the linker is being invoked indirectly, via a compiler driver (e.g. gcc), then all the linker command line options

                                    shouled    be prefiixed by -Wl, (or whatever is appropriate for the particular compiler) like this:

                                        gcc -Wl, --start-group foo.o bar.o -Wl, --end-group  

                          当链接器被间接调用(如通过编译器gcc)时, 所有连接器的命令选项都需要加上-Wl前缀。 -W warning option, -l linker option.

                                   This is important, because otherwise the compiler program may silently drop the linker options, resulting in a bad link.

                                   Comfusion may also arise when passing options that require values through a driver, as the use of a space between

                                   option and argument acts as seprator, and causes the driver to pass only the option to the linker and the argument

                                   to the compiler. In this case, it is simplest to use the joined forms of both single- and multiple-letter options, such as

                                               gcc foo.o bar.o -Wl, -e(Entry) -Wl, -Map=a.map

                                  -Map=mapfile

                                      Print a link map to the file mapfile. See the description of the -M option, above.

                                      -M

                                         --print-map

                                            Print a link map to the  standard output. A link map provides information about the link, including the following:

                                               ..Where object files are mapped into memory.

                                               ..How common symbols are allocated.

                                               .. All archive members included in the link, with a mention of the symbol which caused the archive member to

                                                       brought in.                                          

                                               .. The values assigned to symbols.

                             

                    -rpath(man ld): Add a directory to the runtime library search path. This is used when linking an ELF executable with shared objects.

                                           All -rapth arguments are concatinated and passed  to the runtime linker, which uses  them to locate shared

                    -L (man ld): -L searchdir

                                      Add path searchdir to the list  of paths that ld will search for archive libraries and ld control scripts.

                                      Directories specified on the command line are searched before the default directories.

                                      All -L options apply to all -l options, regardless of the order in which the options appear.

                   -l (man ld): -l namespec

                                       Add the archive or object file spcified by namespec to the list of files to link.

                                       If namespec is of the form :filename, ld will search the library path for a file called filename, otherwise

                                       it will search the library path for a file called libnamespec.a .

                                       On systems which support shared libraries, ld may also search for files other than libnamespec.a  .

                                       Specifically, on ELF and SunOS systems ld will search a directory for a library called libnamespec.so before

                                       searching for one called libnamespec.a (By convention, a ".so" extension indicates a shared library). Note

                                       that this behavior does not apply to :filename, which always specifies a file called filename.

                                      

                   make.common中

                   CMS_LIB_RPATH=

                   CMS_LIB_PATH = $(patsubst %, -L$(INSTALL_DIR)%, $(subst :, ,$(ALLOWED_LIB_DIRS))

                   INSTALL_DIR=$(PROFILE_DIR)/fs.install

                   CMS_COMMON_LIBS := -lcms_util -lcms_broadctl -lcrypt -lutil

                   CMS_CORE_LIBS := -lcms_core -lnanoxml -ldl -lmdm

                   httpd_new的Makefile中

                   LIBS = -lcms_dal -cms_msg $(CMS_COMMON_LIBS) -ldl $(CMS_CORE_LIBS)

                   AllOWED_LIB_DIRS := /lib:/lib/private:/lib/public

                   LIBS += -lc

               httpd_new的Makefile中:

               include $(BUILD_DIR)/make.deprules

               -include $(OBJS:.o=.d)

                make.deprules中

                ifneq ($(MAKECMDGOALS), clean)

                %.d: %.c

                    @set -e; rm -f $@;

                    $(CC)  -M  $(CPPFLAGS) $(CFLAGS) $< > $@.SSSS  2>/dev/null;  

                    sed '' <  $@.SSSS > $@;  

                    rm -f $@.SSSS

                endif

               

  • 相关阅读:
    mysql全文索引
    oracle窗口函数的实战
    数据库的三大范式
    Oracle12cR1 Data Guard 实施文档
    Oracle 11gR2 RAC 删除节点
    Jboss部署文档
    Hexo搭建静态博客踩坑日记(一)
    一行代码引入博客园樱花飘落特效
    Hexo搭建静态博客踩坑日记(二)
    学习axios必知必会(2)~axios基本使用、使用axios前必知细节、axios和实例对象区别、拦截器、取消请求
  • 原文地址:https://www.cnblogs.com/gavinwu/p/3553772.html
Copyright © 2011-2022 走看看