Skip to content

Commit f70240d

Browse files
author
Alexander Light
committed
Add support for cross compiling with ARCH=name
This is rather basic. A clean is needed to get rid of artifacts from previous runs with other architectures. Note this requires PR #88 to work because without it x86 is broken. Closes #89
1 parent efcb360 commit f70240d

4 files changed

Lines changed: 50 additions & 11 deletions

File tree

Make.inc

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ CC = gcc
3838
CFLAGS_add += -fno-gnu89-inline
3939
endif
4040

41-
ARCH := $(shell $(CC) -dumpmachine | sed "s/\([^-]*\).*$$/\1/")
41+
ARCH ?= $(shell $(CC) -dumpmachine | sed "s/\([^-]*\).*$$/\1/")
42+
ARCH_ORIGIN := $(origin ARCH)
43+
4244
ifeq ($(ARCH),mingw32)
4345
$(error "the mingw32 compiler you are using fails the openblas testsuite. please see the Julia README.windows.md document for a replacement")
4446
endif
@@ -48,12 +50,16 @@ CFLAGS_add += -std=c99 -Wall -O3 -I$(OPENLIBM_HOME) -I$(OPENLIBM_HOME)/include -
4850
default: all
4951

5052
%.c.o: %.c
51-
$(CC) $(CPPFLAGS) $(CFLAGS_add) $(CFLAGS) -c $< -o $@
53+
$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_add) -c $< -o $@
5254

5355
%.S.o: %.S
54-
$(CC) $(SFLAGS) $(filter -m% -B% -I% -D%,$(CFLAGS_add)) -c $< -o $@
56+
$(CC) $(SFLAGS) $(SFLAGS_add) $(filter -m% -B% -I% -D%,$(CFLAGS_add)) -c $< -o $@
5557

5658
# OS-specific stuff
59+
REAL_ARCH := $(ARCH)
60+
ifeq ($(findstring arm,$(ARCH)),arm)
61+
override ARCH := arm
62+
endif
5763
ifeq ($(ARCH),i386)
5864
override ARCH := i387
5965
endif
@@ -102,3 +108,34 @@ SHLIB_EXT = dylib
102108
SONAME_FLAG = -install_name
103109
CFLAGS_add+=-fPIC
104110
endif
111+
112+
# The target specific FLAGS_add
113+
ifeq ($(ARCH_ORIGIN),file)
114+
CFLAGS_add_TARGET_$(ARCH) :=
115+
SFLAGS_add_TARGET_$(ARCH) :=
116+
LDFLAGS_add_TARGET_$(ARCH) :=
117+
else
118+
ifeq ($(ARCH),i387)
119+
CFLAGS_add_TARGET_$(ARCH) := -m32 -march=$(REAL_ARCH)
120+
SFLAGS_add_TARGET_$(ARCH) := -m32 -march=$(REAL_ARCH)
121+
LDFLAGS_add_TARGET_$(ARCH) := -m32 -march=$(REAL_ARCH)
122+
endif
123+
CFLAGS_add_TARGET_x86_64 := -m64
124+
SFLAGS_add_TARGET_x86_64 := -m64
125+
LDFLAGS_add_TARGET_x86_64 := -m64
126+
# Arm
127+
ifeq ($(ARCH),arm)
128+
ifneq ($(REAL_ARCH),arm)
129+
CFLAGS_add_TARGET_$(ARCH) := -march=$(REAL_ARCH)
130+
SFLAGS_add_TARGET_$(ARCH) := -march=$(REAL_ARCH)
131+
LDFLAGS_add_TARGET_$(ARCH) := -march=$(REAL_ARCH)
132+
else
133+
$(error No known generic arm cflags. Please specify arch type)
134+
endif
135+
endif
136+
endif
137+
138+
# Actually finish setting the FLAGS_add
139+
CFLAGS_add += $(CFLAGS_add_TARGET_$(ARCH))
140+
LDFLAGS_add += $(LDFLAGS_add_TARGET_$(ARCH))
141+
SFLAGS_add += $(SFLAGS_add_TARGET_$(ARCH))

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ libopenlibm.a: $(OBJS)
3030
$(AR) -rcs libopenlibm.a $(OBJS)
3131
libopenlibm.$(SHLIB_EXT): $(OBJS)
3232
ifeq ($(OS),WINNT)
33-
$(CC) -shared $(OBJS) $(LDFLAGS) -Wl,$(SONAME_FLAG),libopenlibm.$(SHLIB_EXT) -o libopenlibm.$(SHLIB_EXT)
33+
$(CC) -shared $(OBJS) $(LDFLAGS) $(LDFLAGS_add) -Wl,$(SONAME_FLAG),libopenlibm.$(SHLIB_EXT) -o libopenlibm.$(SHLIB_EXT)
3434
else
35-
$(CC) -shared $(OBJS) $(LDFLAGS) -Wl,$(SONAME_FLAG),libopenlibm.$(SHLIB_EXT).$(SOMAJOR) -o libopenlibm.$(SHLIB_EXT).$(SOMAJOR).$(SOMINOR)
35+
$(CC) -shared $(OBJS) $(LDFLAGS) $(LDFLAGS_add) -Wl,$(SONAME_FLAG),libopenlibm.$(SHLIB_EXT).$(SOMAJOR) -o libopenlibm.$(SHLIB_EXT).$(SOMAJOR).$(SOMINOR)
3636
@-ln -sf libopenlibm.$(SHLIB_EXT).$(SOMAJOR).$(SOMINOR) libopenlibm.$(SHLIB_EXT).$(SOMAJOR)
3737
@-ln -sf libopenlibm.$(SHLIB_EXT).$(SOMAJOR).$(SOMINOR) libopenlibm.$(SHLIB_EXT)
3838
endif

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,5 @@ includes experimental support for ARM.
2525
Linux and Windows.
2626
3. Use `make USECLANG=1` to build with clang. This is the default on OS X
2727
and FreeBSD.
28+
4. Use `make ARCH=i386` to build for i386. Other supported architectures are
29+
i486, i586, i686, x86_64, and various arm architectures.

test/Makefile

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,22 @@ all: test-double test-float # test-double-system test-float-system
66
bench: bench-syslibm bench-openlibm
77

88
test-double: test-double.c libm-test.c
9-
$(CC) $(CFLAGS) -g $@.c -D__BSD_VISIBLE -I ../include -I../src ../libopenlibm.a -o $@
9+
$(CC) $(CFLAGS) $(CFLAGS_add_TARGET_$(ARCH)) -g $@.c -D__BSD_VISIBLE -I ../include -I../src ../libopenlibm.a -o $@
1010

1111
test-float: test-float.c libm-test.c
12-
$(CC) $(CFLAGS) -g $@.c -D__BSD_VISIBLE -I ../include -I../src ../libopenlibm.a -o $@
12+
$(CC) $(CFLAGS) $(CFLAGS_add_TARGET_$(ARCH)) -g $@.c -D__BSD_VISIBLE -I ../include -I../src ../libopenlibm.a -o $@
1313

1414
test-double-system: test-double.c libm-test.c
15-
$(CC) $(CFLAGS) -g $< -DSYS_MATH_H -lm -o $@
15+
$(CC) $(CFLAGS) $(CFLAGS_add_TARGET_$(ARCH)) -g $< -DSYS_MATH_H -lm -o $@
1616

1717
test-float-system: test-float.c libm-test.c
18-
$(CC) $(CFLAGS) -g $< -DSYS_MATH_H -lm -o $@
18+
$(CC) $(CFLAGS) $(CFLAGS_add_TARGET_$(ARCH)) -g $< -DSYS_MATH_H -lm -o $@
1919

2020
bench-openlibm: libm-bench.cpp
21-
$(CC) $(CFLAGS) -O2 $< ../libopenlibm.a -o $@
21+
$(CC) $(CFLAGS) $(CFLAGS_add_TARGET_$(ARCH)) -O2 $< ../libopenlibm.a -o $@
2222

2323
bench-syslibm: libm-bench.cpp
24-
$(CC) $(CFLAGS) -O2 $< -lm -o $@
24+
$(CC) $(CFLAGS) $(CFLAGS_add_TARGET_$(ARCH)) -O2 $< -lm -o $@
2525

2626
clean:
2727
rm -fr test-double test-float test-double-system test-float-system bench-openlibm bench-syslibm *.dSYM

0 commit comments

Comments
 (0)