这是我为构建两个静态库而提出的解决方案 - 一个带有 MPI ( libmylib_mpi.a
),一个没有 ( libmylib.a
)。这种方法的优点是不需要重复的源文件、两个变体的单个 Makefile.am 以及使用子目录的能力。您应该能够根据需要修改它以生成二进制文件而不是库。我像往常一样构建非 MPI 库,然后对于 MPI 变体,我将其_SOURCES
留空并改为使用,为目标文件_LIBADD
指定扩展名。.mpi.o
然后我指定一个规则来使用 MPI 编译器生成 MPI 目标文件。
整体文件/目录结构类似于
configure.ac
Makefile.am
src
mylib1.cpp
mylib2.cpp
...
include
mylib.h
...
配置.ac:
AC_INIT()
AC_PROG_RANLIB
AC_LANG(C++)
AC_PROG_CXX
# test for MPI, define MPICXX, etc. variables, and define HAVE_MPI as a condition that will evaluate to true if MPI is available and false otherwise.
AX_MPI([AM_CONDITIONAL([HAVE_MPI], [test "1" = "1"])],[AM_CONDITIONAL([HAVE_MPI], [test "1" = "2"])]) #MPI optional for xio
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
进行条件检查的方法可能比我在此处列出的更有效(欢迎提出建议)。
生成文件.am:
AUTOMAKE_OPTIONS = subdir-objects
lib_LIBRARIES = libmylib.a
libmylib_a_SOURCES = src/mylib_1.cpp src/mylib_2.cpp ...
#conditionally generate libmylib_mpi.a if MPI is available
if HAVE_MPI
lib_LIBRARIES += libmylib_mpi.a
libmylib_mpi_a_SOURCES = #no sources listed here
#use LIBADD to specify objects to add - use the basic filename with a .mpi.o extension
libmylib_mpi_a_LIBADD = src/mylib_1.mpi.o src/mylib_2.mpi.o ...
endif
AM_CPPFLAGS = -I${srcdir}/include
include_HEADERS = include/mylib.h
# define a rule to compile the .mpi.o objects from the .cpp files with the same name
src/%.mpi.o: ${srcdir}/src/%.cpp ${srcdir}/include/mylib.h
$(MPICXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DWITH_MPI=1 -c $(patsubst %.mpi.o,$(srcdir)/%.cpp,$@) -o $@
#define a rule to clean the .mpi.o files
clean-local:
-rm -f src/*.mpi.o