我正在努力获得libtool
并yasm
一起工作。
yasm
.o files
从我的来源创建正确的.asm
,但我无法弄清楚如何libtool
构建关联.lo
和.dep
文件。它想要构建共享库,合并.o
文件。
这行得通(尽管我从来没有弄清楚如何让 libtool.lo
在目标目录中创建文件,或者创建目标目录的.libs
目录)。
Makefile 规则:
# Rule to build object files from asm files.
#
# XXX
# Libtool creates the .lo file in the directory where make is run. Move the file
# into place explicitly; I'm sure this is wrong, but have no idea how to fix it.
# Additionally, in a parallel make, the .libs file may not yet be created, check
# as necessary, but ignore errors.
.asm.lo:
-d=`dirname $@`; test $d/.libs || mkdir $d/.libs
$(LIBTOOL) --tag=CC --mode=compile sh $(srcdir)/dist/yasm.sh $< $@
rm -f $@
mv `basename $@` $@
用于执行 yasm 调用的支持 shell 脚本:
#! /bin/sh
# Libtool support for yasm files, expect the first argument to be a path to
# the source file and the second argument to be a path to libtool's .lo file.
# Use the second argument plus libtool's -o argument to set the real target
# file name.
source=$1
target=`dirname $2`
while test $# -gt 0
do
case $1 in
-o)
target="$target/$2"
shift; shift;;
*)
shift;;
esac
done
yasm -f x64 -f elf64 -X gnu -g dwarf2 -D LINUX -o $target $source
libtool
生成的文件通常使用以下布局:由位置元数据组成的目录.lo
中的文件;build
目录中的静态对象.o
文件build
;以及目录中的 PIC / 共享.o
对象build/.libs
。
您可以使用 libtool 编译模式。我对 yasm 不熟悉,所以你必须填写开关。它将运行yasm
构建两次,一次使用-DPIC
(可能还有其他共享对象选项)。
libtool --tag=CC --mode=compile yasm <options> src.asm
如果使用 automake,这可能需要.asm
文件的明确规则:
.asm.lo:
$(LIBTOOL) --tag=CC --mode=compile \
yasm <options> $<
请记住,这些是 Makefile 中的 TAB,而不是 (8) 个空格字符!您可能还需要添加:.SUFFIXES: .asm .lo
在此之前。我使用变量$(LIBTOOL)
,因为某些平台(例如 OSX)需要将其安装为glibtool
,它就是这样Makefile.in
做的。
例如,生成src.lo
的src.o
,.libs/src.o
应该受到尊重make clean
。
对于您的库,您需要使用 :和 obj depslibfoo
让 automake 知道这些来源。甚至可能值得添加到依赖项:.EXTRA_libfoo_la_SOURCES = src.asm
libfoo_la_LIBADD = src.lo
libfoo_la_DEPENDENCIES = src.lo
虽然我不明白为什么仅仅投入src.asm
是libfoo_la_SOURCES
不够的。