Создайте Makefile, который компилирует и связывает все исходные файлы за один шаг с Automake - PullRequest
1 голос
/ 15 февраля 2020

Я новичок с automake. Я пытаюсь написать файлы Makefile.am для моей библиотеки, однако из-за некоторых ограничений компилятора nv cc мне нужно скомпилировать и связать исходные файлы за один шаг, без создания файлов .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, чтобы создать подобный make-файл?

1 Ответ

1 голос
/ 16 февраля 2020

Правильный ответ на мой вопрос - тот, который написал Сэм Варшавчик: как он указал, это невозможно. Тем не менее, для тех, кто может быть заинтересован, я нашел обходной путь, который решает мою проблему, полезный, например, если вы хотите создать общую библиотеку CUDA-C / C ++ с Autotools.

Хитрость заключается в том, чтобы сначала сгенерировать файл src / Makefile.in с помощью autotools, а затем изменить этот файл перед командой 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- файлы - это список файлов, которые нужно скомпилировать. Будьте осторожны: перед строкой стоит табуляция, а не пробелы. Если вы хотите использовать «make install», вам также следует изменить команду, которая устанавливает библиотеку в нужную папку. В моем случае:

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

«$$ list2» следует заменить на «libexample.so»

Этот патч может быть выполнен автоматически с помощью сценария оболочки, запущенного в конце Конфигурационный скрипт. Я поместил полный рабочий пример в https://github.com/golosio/sharedcuda_autotools

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...