summaryrefslogtreecommitdiff
path: root/libatomic/Makefile.am
blob: d731406fdbd4b87df7e7dbddd886b008c2b84cf3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
##  Copyright (C) 2012-2017 Free Software Foundation, Inc.
##  Contributed by Richard Henderson <rth@redhat.com>.
##
##  This file is part of the GNU Atomic Library (libatomic).
##
##  Libatomic is free software; you can redistribute it and/or modify it
##  under the terms of the GNU General Public License as published by
##  the Free Software Foundation; either version 3 of the License, or
##  (at your option) any later version.
##
##  Libatomic is distributed in the hope that it will be useful, but WITHOUT ANY
##  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
##  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
##  more details.
##
##  Under Section 7 of GPL version 3, you are granted additional
##  permissions described in the GCC Runtime Library Exception, version
##  3.1, as published by the Free Software Foundation.
##
##  You should have received a copy of the GNU General Public License and
##  a copy of the GCC Runtime Library Exception along with this program;
##  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
##  <http://www.gnu.org/licenses/>.

ACLOCAL_AMFLAGS = -I .. -I ../config
SUBDIRS = testsuite

## May be used by toolexeclibdir.
gcc_version := $(shell @get_gcc_base_ver@ $(top_srcdir)/../gcc/BASE-VER)

config_path= @config_path@
search_path = $(addprefix $(top_srcdir)/config/, $(config_path)) \
	$(top_srcdir) $(top_builddir)

vpath % $(strip $(search_path))

DEFAULT_INCLUDES = $(addprefix -I, $(search_path))
AM_CFLAGS = $(XCFLAGS)
AM_CCASFLAGS = $(XCFLAGS)
AM_LDFLAGS = $(XLDFLAGS) $(SECTION_LDFLAGS) $(OPT_LDFLAGS)

toolexeclib_LTLIBRARIES = libatomic.la
noinst_LTLIBRARIES = libatomic_convenience.la

if LIBAT_BUILD_VERSIONED_SHLIB
if LIBAT_BUILD_VERSIONED_SHLIB_GNU
libatomic_version_script = -Wl,--version-script,$(top_srcdir)/libatomic.map
libatomic_version_dep = $(top_srcdir)/libatomic.map
endif
if LIBAT_BUILD_VERSIONED_SHLIB_SUN
libatomic_version_script = -Wl,-M,libatomic.map-sun
libatomic_version_dep = libatomic.map-sun
libatomic.map-sun : $(top_srcdir)/libatomic.map \
		$(top_srcdir)/../contrib/make_sunver.pl \
		$(libatomic_la_OBJECTS) $(libatomic_la_LIBADD)
	perl $(top_srcdir)/../contrib/make_sunver.pl \
	  $(top_srcdir)/libatomic.map \
	  $(libatomic_la_OBJECTS:%.lo=.libs/%.o) \
	 `echo $(libatomic_la_LIBADD) | \
	    sed 's,\([^/ 	]*\)\.l\([ao]\),.libs/\1.\2,g'` \
	 > $@ || (rm -f $@ ; exit 1)
endif
else
libatomic_version_script =
libatomic_version_dep =
endif
libatomic_version_info = -version-info $(libtool_VERSION)

libatomic_la_LDFLAGS = $(libatomic_version_info) $(libatomic_version_script) $(lt_host_flags)
libatomic_la_SOURCES = gload.c gstore.c gcas.c gexch.c glfree.c lock.c init.c \
	fenv.c fence.c flag.c

SIZEOBJS = load store cas exch fadd fsub fand fior fxor fnand tas
SIZES = @SIZES@

EXTRA_libatomic_la_SOURCES = $(addsuffix _n.c,$(SIZEOBJS))
libatomic_la_DEPENDENCIES = $(libatomic_la_LIBADD) $(libatomic_version_dep)

## And now our custom target patterns that allow us not to have tons of
## extra source files hanging about.  Unfortunately, the complex relation
## between source and object filenames doesn't allow us to add an explicit
## dependency here.  Fortunately that doesn't matter since auto-generated
## dependencies do the job just as well:
-include $(wildcard $(DEPDIR)/*.Ppo)

## Naming pattern: base_n_i_.lo
##
##	N	size of data
##	I	IFUNC alternative, index beginning at 1.
##
## The trailing _ in the output object file name is required to differentiate
## these objects from those which should be compiled normally.  We can only
## have one stem in the implicit rule.

empty		=
space		= $(empty) $(empty)
PAT_SPLIT	= $(subst _,$(space),$(*F))
PAT_BASE	= $(word 1,$(PAT_SPLIT))
PAT_N		= $(word 2,$(PAT_SPLIT))
PAT_S		= $(word 3,$(PAT_SPLIT))
IFUNC_DEF	= -DIFUNC_ALT=$(PAT_S)
IFUNC_OPT	= $(word $(PAT_S),$(IFUNC_OPTIONS))

M_DEPS		= -MT $@ -MD -MP -MF $(DEPDIR)/$(@F).Ppo
M_SIZE		= -DN=$(PAT_N)
M_IFUNC		= $(if $(PAT_S),$(IFUNC_DEF) $(IFUNC_OPT))
M_FILE		= $(PAT_BASE)_n.c

# The lack of explicit dependency on the source file means that VPATH cannot
# work properly.  Instead, perform this operation by hand.  First, collect a
# list of all .c files in the search path.
all_c_files	:= $(foreach dir,$(search_path),$(wildcard $(dir)/*.c))

# Then sort through them to find the one we want, and select the first.
M_SRC		= $(firstword $(filter %/$(M_FILE), $(all_c_files)))

%_.lo: Makefile
	$(LTCOMPILE) $(M_DEPS) $(M_SIZE) $(M_IFUNC) -c -o $@ $(M_SRC)

## Include all of the sizes in the "normal" set of compilation flags.
libatomic_la_LIBADD = $(foreach s,$(SIZES),$(addsuffix _$(s)_.lo,$(SIZEOBJS)))

## On a target-specific basis, include alternates to be selected by IFUNC.
if HAVE_IFUNC
if ARCH_ARM_LINUX
IFUNC_OPTIONS	     = -march=armv7-a -DHAVE_KERNEL64
libatomic_la_LIBADD += $(foreach s,$(SIZES),$(addsuffix _$(s)_1_.lo,$(SIZEOBJS)))
libatomic_la_LIBADD += $(addsuffix _8_2_.lo,$(SIZEOBJS))
endif
if ARCH_I386
IFUNC_OPTIONS	     = -march=i586
libatomic_la_LIBADD += $(addsuffix _8_1_.lo,$(SIZEOBJS))
endif
if ARCH_X86_64
IFUNC_OPTIONS	     = -mcx16
libatomic_la_LIBADD += $(addsuffix _16_1_.lo,$(SIZEOBJS))
endif
endif

libatomic_convenience_la_SOURCES = $(libatomic_la_SOURCES)
libatomic_convenience_la_LIBADD = $(libatomic_la_LIBADD)

# Override the automake generated all-multi rule to guarantee that all-multi
# is not run in parallel with the %_.lo rules which generate $(DEPDIR)/*.Ppo
# makefile fragments to avoid broken *.Ppo getting included into the Makefile
# when it is reloaded during the build of all-multi.
all-multi: $(libatomic_la_LIBADD)
	$(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do # $(MAKE)