如何在Makefile.am中包含从D源构建的静态库?

时间:2012-10-16 07:25:39

标签: static-libraries automake d

我正在编写一个实用程序库libdog-dev,用于使用D语言进行编程,这里是Makefile.am

sited2dir = /usr/include/d2/site
lib32dir = ${libdir}/i386-linux-gnu
# lib64dir = ${libdir}/x86_64-linux-gnu

lib32_LIBRARIES = \
    i386/libdog.a

# lib64_LIBRARIES = \
#     x86_64/libdog.a

i386/libdog.a:
    mkdir -p i386
    dmd -lib -m32 -of$@ -op -Hdi386/include/ `find src/ -name '*.d'`

x86_64/libdog.a:
    mkdir -p x86_64
    dmd -lib -m64 -of$@ -op -Hdx86_64/include/ `find src/ -name '*.d'`

# Since the header files for i386/x86_64 are the same, let's just pick the i386 one.
install-data-hook: 
    mkdir -p $(DESTDIR)$(sited2dir)
    rsync -av i386-linux-gnu/include/ $(DESTDIR)$(sited2dir)
然而,它正在发挥作用,我还不清楚:

  • 我需要在AC_PROG_CC中包含AC_PROG_RANLIBconfigure.ac,这应该是不必要的,因为此项目中没有c / c ++源代码。缺少这两个陈述将导致错误。

  • 我只能在libdog.a中包含单个Makefile.am。我在上面的代码中注释了x86-64,如果我包含它,automake将显示错误:

    cd . && /bin/bash /home/lenik/tasks/1-uni/devel/libdog-dev/missing --run automake-1.11 --gnu Makefile
    Makefile.am: object `libdog.$(OBJEXT)' created by `x86_64/libdog.c' and `i386/libdog.c'
    make: *** [Makefile.in] Error 1
    

    我想在一个软件包中包含i386和x86-64的两个版本,就像Debian的官方dmd软件包一样:

    ...                              (install tree of the dmd-2.059-0 package)
    |-- lib/
    |   |-- i386-linux-gnu/
    |   |   `-- libphobos2.a
    |   `-- x86_64-linux-gnu/
    |       `-- libphobos2.a
    
  • 我在Makefile源代码中对主要名称i386-linux-gnux86_64-linux-gnu进行了硬编码,但是,它应该以某种方式生成..?

1 个答案:

答案 0 :(得分:1)

  1. Automake将尝试查找_LIBRARIES目标中列出的文件的C / C ++源代码。因此,只需将它们更改为_DATA目标:

    lib32_DATA = \
        i386/libdog.a
    
    lib64_DATA = \
        x86_64/libdog.a
    
  2. 您可以通过运行以下命令生成主机系统的名称i386-linux-gnux86_64-linux-gnu

    dpkg-architecture -qDEB_HOST_GNU_TYPE
    

    您还可以从/etc/ld.so.conf/etc/ld.so.conf.d/*获取图书馆路径。