生成一个生成文件,该生成文件使用Automake在一个步骤中编译和链接所有源文件

Generate a Makefile that compiles and links all the source files in a single step with Automake

本文关键字:一个 文件 链接 编译 源文件 Automake      更新时间:2023-10-16

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

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 才能生成这样的生成文件?

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

诀窍是首先使用autotools生成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 是库的名称,源文件是要编译的文件列表。 请注意:该行前面有一个制表符,而不是空格。 如果您希望能够使用"make install",则还应修改在正确文件夹中安装库的命令。就我而言:

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

"$$list 2"应改为"libexample.so">

此补丁可以通过在配置脚本结束时启动的 shell 脚本自动完成。 我在 https://github.com/golosio/sharedcuda_autotools 中放置了一个完整的工作示例

相关文章: