views:

2401

answers:

2

I've just written a Makefile to build a shared library, similar to the following:

libmystuff.so: CFLAGS+=-fPIC -shared
libmystuff.so: libmystuff.o otherstuff.o
    $(CC) $(CFLAGS) -o $@ $^

I like to avoid doing explicit actions when this seems like a common operation, but it seems there's no implicit rule or other built-ins to standardize this. I'm using GNU Make on Linux at the moment, but will need this to work on OS X as well.

EDIT: I'm asking about make rules rather than compiler/linker flags.

Can you recommend clean, reusable Makefile rules to build shared libs? Perhaps a %.so: or .c.so: type rule?

+2  A: 

Building shared libraries is platform dependent. For example, the flags you are using are ok for GCC for ELF platforms, for cygwin, for example, you do not add -fPIC for some other platforms and compilers you need other flags.

You need one of:

  • Provide an option to set flags for user platform.
  • Use standard build system like Autotools
Artyom
I'm fine with per platform flags. I'm really asking about make rules. See edited question, thanks.
dwc
dwc, the job of writing per-platform flags has been done. It's called Autotools. I promise you it will be a thousand times easier than what you seem to want to do (which looks like building your own Autotools from scratch).
Chris Lutz
+1  A: 

For portability, I'd look into integrating libtool.

define compile_rule
        libtool --mode=compile \
        $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
endef
define link_rule
        libtool --mode=link \
        $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
endef

LIBS = libmystuff.la
libmystuff_OBJS = libmystuff.lo otherstuff.lo

%.lo: %.c
        $(call compile_rule)

libmystuff.la: $(libmystuff_OBJS)
        $(call link_rule)

install/%.la: %.la
        libtool --mode=install \
        install -c $(notdir $@) $(libdir)/$(notdir $@)
install: $(addprefix install/,$(LIBS))
        libtool --mode=finish $(libdir)

libtool will automatically add -fPIC/-DPIC/-shared flags as appropriate, and generate whatever .o/.a/.so files would be used on the current platform.

Or you could use Automake's libtool integration.

ephemient
libtool seems to be the best way. It's a shame the manual throws you to the wolves (see http://www.gnu.org/software/libtool/manual/libtool.html#Makefile-rules) unless you're using the whole Autotools suite.
dwc