生成一个 Makefile,使用 Automake 一步编译和链接所有源文件

Posted

技术标签:

【中文标题】生成一个 Makefile,使用 Automake 一步编译和链接所有源文件【英文标题】:Generate a Makefile that compiles and links all the source files in a single step with Automake 【发布时间】:2020-02-15 18:13:43 【问题描述】:

我是 automake 的新手。我正在尝试为我的库编写 Makefile.am 文件,但是由于 nvcc 编译器的一些限制,我需要一步编译和链接源文件,而不生成 .o 文件,以便我直接生成库,而无需链接单独的文件。我可以在网上找到几个 Makefile.am 文件的示例,但似乎没有一个适合我的需要。这是我的(工作)Makefile:

CC=g++
NVCC=nvcc
CXXFLAGS= -O3 -Wall -fPIC
CUDAFLAGS= -arch sm_30 --ptxas-options=-v --relocatable-device-code true
LIBS= -lm
LDFLAGS = -shared   # linking flags

RM = rm -f   # rm command
TARGET_LIB = ./lib/libsharedcuda.so  # target lib

SRC_DIR   = src

SRC_FILES  = $(wildcard $(SRC_DIR)/*.cu)
SRC_FILES += $(wildcard $(SRC_DIR)/*.cpp)

H_FILES   = $(wildcard $(SRC_DIR)/*.h)
H_FILES += $(wildcard $(SRC_DIR)/*.cuh)

.PHONY: all
all: $TARGET_LIB

$(TARGET_LIB): $(SRC_FILES)
    $(NVCC) -ccbin=$CC --compiler-options  '$CXXFLAGS' $CUDAFLAGS $LDFLAGS -o $@ $^

.PHONY: clean
clean:
    -$RM $TARGET_LIB

应该如何编写 Makefile.am 以生成像这样的 makefile?

【问题讨论】:

你不能。 automake 的全部目的是从一个简洁、紧凑的定义生成库存 Makefile,并且 automake 假定一个通用编译器和一个相当通用的 make 命令。对于这种非常自定义的情况,您将自己编写 Makefile,从头开始。 感谢您的回答,它为我节省了大量时间寻找不可行的解决方案。我找到了解决我的问题的方法,首先使用自动工具生成 Makefile.in 文件,然后使用在配置结束时启动的脚本向该文件应用补丁。有点棘手,但它奏效了。 【参考方案1】:

我的问题的正确答案是 Sam Varshavchik 写的:正如他所指出的,这是不可能的。但是,对于任何可能感兴趣的人,我找到了一个解决我的问题的解决方法,例如,如果你想用 Autotools 构建一个 CUDA-C/C++ 共享库。

诀窍是首先使用自动工具生成 src/Makefile.in 文件,然后在 make 命令之前修改此文件。 使用我的 autoconf/automake 版本,相关行是:

    $(AM_V_CXXLD)$(libexample_la_LINK) ... 

应该用类似的东西代替:

    nvcc -ccbin=g++ --compiler-options  '-O3 -Wall -fPIC' -shared -arch sm_30 --ptxas-options=-v --relocatable-device-code true -o source-files -lm

其中 libexample 是库的名称,source-files 是要编译的文件列表。 注意:该行前面有一个制表符,而不是空格。 如果您希望能够使用“make install”,您还应该修改将库安装在正确文件夹中的命令。在我的情况下:

    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)";

“$$list2”应替换为“libexample.so”

此补丁可以通过在配置脚本末尾启动的 shell 脚本自动完成。 我在https://github.com/golosio/sharedcuda_autotools

中放置了一个完整的工作示例

【讨论】:

我认为关键是,它不能“便携”地完成。绝对没有什么可以阻止您将自己的“制作”规则添加到 Makefile.am 文件中。使用libtool 基础设施管理支持它确实令人印象深刻。我希望你能在此基础上再接再厉。

以上是关于生成一个 Makefile,使用 Automake 一步编译和链接所有源文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 automake 生成条件块

是否有终端工具可以为 Vala 项目自动生成 autoconf/automake makefile?

教你如何使用automake生成Makefile文件

使用 automake/autoconf 条件生成文件

automake 以编程方式生成规则/使用宏

使用现有的 Makefile 作为 automake 项目的一部分