diff --git a/Make.inc b/Make.inc index b1d43a7..f1c177d 100644 --- a/Make.inc +++ b/Make.inc @@ -24,12 +24,7 @@ endif USEGCC = 1 USECLANG = 0 -ifeq ($(OS), Darwin) -USEGCC = 0 -USECLANG = 1 -endif - -ifeq ($(OS), FreeBSD) +ifneq (,$(findstring $(OS),Darwin FreeBSD OpenBSD)) USEGCC = 0 USECLANG = 1 endif diff --git a/Makefile b/Makefile index e4324a9..7144cf9 100644 --- a/Makefile +++ b/Makefile @@ -83,19 +83,19 @@ openlibm.pc: openlibm.pc.in Make.inc Makefile install-static: libopenlibm.a mkdir -p $(DESTDIR)$(libdir) - cp -f -a libopenlibm.a $(DESTDIR)$(libdir)/ + cp -RpP -f libopenlibm.a $(DESTDIR)$(libdir)/ install-shared: libopenlibm.$(OLM_MAJOR_MINOR_SHLIB_EXT) mkdir -p $(DESTDIR)$(shlibdir) - cp -f -a libopenlibm.*$(SHLIB_EXT)* $(DESTDIR)$(shlibdir)/ + cp -RpP -f libopenlibm.*$(SHLIB_EXT)* $(DESTDIR)$(shlibdir)/ install-pkgconfig: openlibm.pc mkdir -p $(DESTDIR)$(pkgconfigdir) - cp -f -a openlibm.pc $(DESTDIR)$(pkgconfigdir)/ + cp -RpP -f openlibm.pc $(DESTDIR)$(pkgconfigdir)/ install-headers: mkdir -p $(DESTDIR)$(includedir)/openlibm - cp -f -a include/*.h $(DESTDIR)$(includedir)/openlibm - cp -f -a src/*.h $(DESTDIR)$(includedir)/openlibm + cp -RpP -f include/*.h $(DESTDIR)$(includedir)/openlibm + cp -RpP -f src/*.h $(DESTDIR)$(includedir)/openlibm install: install-static install-shared install-pkgconfig install-headers diff --git a/README.md b/README.md index 461e41c..81d2e96 100644 --- a/README.md +++ b/README.md @@ -16,24 +16,20 @@ consistently across compilers and operating systems, and in 32-bit and OpenLibm builds on Linux, Mac OS X, Windows, FreeBSD, OpenBSD, and DragonFly BSD. It builds with both GCC and clang. Although largely tested and widely -used on x86 architectures, openlibm also supports ARM and -powerPC. +used on x86 architectures, OpenLibm also supports ARM and +PowerPC. ## Build instructions -1. Use `make` to build OpenLibm. +1. Use GNU Make to build OpenLibm. This is `make` on most systems, but `gmake` on BSDs. 2. Use `make USEGCC=1` to build with GCC. This is the default on Linux and Windows. -3. Use `make USECLANG=1` to build with clang. This is the default on OS X - and FreeBSD. +3. Use `make USECLANG=1` to build with clang. This is the default on OS X, FreeBSD, + and OpenBSD. 4. Architectures are auto-detected. Use `make ARCH=i386` to force a build for i386. Other supported architectures are i486, i586, and i686. GCC 4.8 is the minimum requirement for correct codegen on older 32-bit architectures. -5. On OpenBSD, you need to install GNU Make (port name: `gmake`) and a recent - version of `gcc` (tested: 4.9.2), as the default version provided by OpenBSD - is too old (4.2.1). If you use OpenBSD's port system for this (port name: - `gcc`), run `make CC=egcc` to force Make to use the newer `gcc`. ## Acknowledgements diff --git a/src/bsd_cdefs.h b/src/bsd_cdefs.h index b0ceee3..5799193 100644 --- a/src/bsd_cdefs.h +++ b/src/bsd_cdefs.h @@ -78,12 +78,14 @@ /* * Macro to test if we're using a specific version of gcc or later. */ +#ifndef __GNUC_PREREQ__ #if defined(__GNUC__) && !defined(__INTEL_COMPILER) #define __GNUC_PREREQ__(ma, mi) \ (__GNUC__ > (ma) || __GNUC__ == (ma) && __GNUC_MINOR__ >= (mi)) #else #define __GNUC_PREREQ__(ma, mi) 0 #endif +#endif /* __GNUC_PREREQ__ */ /* * Compiler-dependent macro to help declare pure (no side effects) functions. diff --git a/src/cdefs-compat.h b/src/cdefs-compat.h index d3e3166..fb31965 100644 --- a/src/cdefs-compat.h +++ b/src/cdefs-compat.h @@ -1,6 +1,7 @@ #ifndef _CDEFS_COMPAT_H_ #define _CDEFS_COMPAT_H_ +#if !defined(__BEGIN_DECLS) #if defined(__cplusplus) #define __BEGIN_DECLS extern "C" { #define __END_DECLS } @@ -8,6 +9,7 @@ #define __BEGIN_DECLS #define __END_DECLS #endif +#endif /* !defined(__BEGIN_DECLS) */ #ifdef __GNUC__ #ifndef __strong_reference @@ -25,18 +27,22 @@ #define __weak_reference(sym,alias) \ __asm__(".weak " #alias); \ __asm__(".equ " #alias ", " #sym) +#ifndef __warn_references #define __warn_references(sym,msg) \ __asm__(".section .gnu.warning." #sym); \ __asm__(".asciz \"" msg "\""); \ __asm__(".previous") +#endif /* __warn_references */ #else #define __weak_reference(sym,alias) \ __asm__(".weak alias"); \ __asm__(".equ alias, sym") +#ifndef __warn_references #define __warn_references(sym,msg) \ __asm__(".section .gnu.warning.sym"); \ __asm__(".asciz \"msg\""); \ __asm__(".previous") +#endif /* __warn_references */ #endif /* __STDC__ */ #elif defined(__clang__) /* CLANG */ #ifdef __STDC__ @@ -53,16 +59,20 @@ #define __weak_reference(sym,alias) \ __asm__(".stabs \"_" #alias "\",11,0,0,0"); \ __asm__(".stabs \"_" #sym "\",1,0,0,0") +#ifndef __warn_references #define __warn_references(sym,msg) \ __asm__(".stabs \"" msg "\",30,0,0,0"); \ __asm__(".stabs \"_" #sym "\",1,0,0,0") +#endif /* __warn_references */ #else #define __weak_reference(sym,alias) \ __asm__(".stabs \"_/**/alias\",11,0,0,0"); \ __asm__(".stabs \"_/**/sym\",1,0,0,0") +#ifndef __warn_references #define __warn_references(sym,msg) \ __asm__(".stabs msg,30,0,0,0"); \ __asm__(".stabs \"_/**/sym\",1,0,0,0") +#endif /* __warn_references */ #endif /* __STDC__ */ #endif /* __ELF__ */ #endif /* __weak_reference */