これが、2つの静的ライブラリを構築するために私が思いついた解決策です。1つはMPI(libmylib_mpi.a
)を使用し、もう1つは()を使用しませlibmylib.a
ん。この方法の利点は、重複するソースファイル、両方のバリアントに対して単一のMakefile.amが不要であり、サブディレクトリを使用できることです。ライブラリの代わりにバイナリを生成するために、必要に応じてこれを変更できるはずです。通常どおり非MPIライブラリを構築し、MPIバリアントの場合は_SOURCES
空のままにして、代わりにオブジェクトファイル_LIBADD
の拡張子を指定して使用します。.mpi.o
次に、MPIコンパイラを使用してMPIオブジェクトファイルを生成するルールを指定します。
全体的なファイル/ディレクトリ構造は次のようなものです
configure.ac
Makefile.am
src
mylib1.cpp
mylib2.cpp
...
include
mylib.h
...
configure.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
ここにリストしたよりも、おそらくより効率的な条件付きチェックの方法があります(提案を歓迎します)。
Makefile.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