1##  Copyright (C) 2012-2020 Free Software Foundation, Inc.
2##  Contributed by Richard Henderson <rth@redhat.com>.
3##
4##  This file is part of the GNU Atomic Library (libatomic).
5##
6##  Libatomic is free software; you can redistribute it and/or modify it
7##  under the terms of the GNU General Public License as published by
8##  the Free Software Foundation; either version 3 of the License, or
9##  (at your option) any later version.
10##
11##  Libatomic is distributed in the hope that it will be useful, but WITHOUT ANY
12##  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13##  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14##  more details.
15##
16##  Under Section 7 of GPL version 3, you are granted additional
17##  permissions described in the GCC Runtime Library Exception, version
18##  3.1, as published by the Free Software Foundation.
19##
20##  You should have received a copy of the GNU General Public License and
21##  a copy of the GCC Runtime Library Exception along with this program;
22##  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23##  <http://www.gnu.org/licenses/>.
24
25ACLOCAL_AMFLAGS = -I .. -I ../config
26SUBDIRS = testsuite
27
28## May be used by toolexeclibdir.
29gcc_version := $(shell @get_gcc_base_ver@ $(top_srcdir)/../gcc/BASE-VER)
30
31config_path= @config_path@
32search_path = $(addprefix $(top_srcdir)/config/, $(config_path)) \
33	$(top_srcdir) $(top_builddir)
34
35vpath % $(strip $(search_path))
36
37DEFAULT_INCLUDES = $(addprefix -I, $(search_path))
38AM_CFLAGS = $(XCFLAGS)
39AM_CCASFLAGS = $(XCFLAGS)
40AM_LDFLAGS = $(XLDFLAGS) $(SECTION_LDFLAGS) $(OPT_LDFLAGS)
41
42toolexeclib_LTLIBRARIES = libatomic.la
43noinst_LTLIBRARIES = libatomic_convenience.la
44
45if LIBAT_BUILD_VERSIONED_SHLIB
46if LIBAT_BUILD_VERSIONED_SHLIB_GNU
47libatomic_version_script = -Wl,--version-script,$(top_srcdir)/libatomic.map
48libatomic_version_dep = $(top_srcdir)/libatomic.map
49endif
50if LIBAT_BUILD_VERSIONED_SHLIB_SUN
51libatomic_version_script = -Wl,-M,libatomic.map-sun
52libatomic_version_dep = libatomic.map-sun
53libatomic.map-sun : $(top_srcdir)/libatomic.map \
54		$(top_srcdir)/../contrib/make_sunver.pl \
55		$(libatomic_la_OBJECTS) $(libatomic_la_LIBADD)
56	perl $(top_srcdir)/../contrib/make_sunver.pl \
57	  $(top_srcdir)/libatomic.map \
58	  $(libatomic_la_OBJECTS:%.lo=.libs/%.o) \
59	 `echo $(libatomic_la_LIBADD) | \
60	    sed 's,\([^/ 	]*\)\.l\([ao]\),.libs/\1.\2,g'` \
61	 > $@ || (rm -f $@ ; exit 1)
62endif
63else
64libatomic_version_script =
65libatomic_version_dep =
66endif
67libatomic_version_info = -version-info $(libtool_VERSION)
68
69libatomic_la_LDFLAGS = $(libatomic_version_info) $(libatomic_version_script) $(lt_host_flags)
70libatomic_la_SOURCES = gload.c gstore.c gcas.c gexch.c glfree.c lock.c init.c \
71	fenv.c fence.c flag.c
72
73SIZEOBJS = load store cas exch fadd fsub fand fior fxor fnand tas
74SIZES = @SIZES@
75
76EXTRA_libatomic_la_SOURCES = $(addsuffix _n.c,$(SIZEOBJS))
77libatomic_la_DEPENDENCIES = $(libatomic_la_LIBADD) $(libatomic_version_dep)
78
79## And now our custom target patterns that allow us not to have tons of
80## extra source files hanging about.  Unfortunately, the complex relation
81## between source and object filenames doesn't allow us to add an explicit
82## dependency here.  Fortunately that doesn't matter since auto-generated
83## dependencies do the job just as well:
84-include $(wildcard $(DEPDIR)/*.Ppo)
85
86## Naming pattern: base_n_i_.lo
87##
88##	N	size of data
89##	I	IFUNC alternative, index beginning at 1.
90##
91## The trailing _ in the output object file name is required to differentiate
92## these objects from those which should be compiled normally.  We can only
93## have one stem in the implicit rule.
94
95empty		=
96space		= $(empty) $(empty)
97PAT_SPLIT	= $(subst _,$(space),$(*F))
98PAT_BASE	= $(word 1,$(PAT_SPLIT))
99PAT_N		= $(word 2,$(PAT_SPLIT))
100PAT_S		= $(word 3,$(PAT_SPLIT))
101IFUNC_DEF	= -DIFUNC_ALT=$(PAT_S)
102IFUNC_OPT	= $(word $(PAT_S),$(IFUNC_OPTIONS))
103
104@AMDEP_TRUE@M_DEPS		= -MT $@ -MD -MP -MF $(DEPDIR)/$(@F).Ppo
105@AMDEP_FALSE@M_DEPS		=
106
107M_SIZE		= -DN=$(PAT_N)
108M_IFUNC		= $(if $(PAT_S),$(IFUNC_DEF) $(IFUNC_OPT))
109M_FILE		= $(PAT_BASE)_n.c
110
111# The lack of explicit dependency on the source file means that VPATH cannot
112# work properly.  Instead, perform this operation by hand.  First, collect a
113# list of all .c files in the search path.
114all_c_files	:= $(foreach dir,$(search_path),$(wildcard $(dir)/*.c))
115
116# Then sort through them to find the one we want, and select the first.
117M_SRC		= $(firstword $(filter %/$(M_FILE), $(all_c_files)))
118
119%_.lo: Makefile
120	$(LTCOMPILE) $(M_DEPS) $(M_SIZE) $(M_IFUNC) -c -o $@ $(M_SRC)
121
122## Include all of the sizes in the "normal" set of compilation flags.
123libatomic_la_LIBADD = $(foreach s,$(SIZES),$(addsuffix _$(s)_.lo,$(SIZEOBJS)))
124
125## On a target-specific basis, include alternates to be selected by IFUNC.
126if HAVE_IFUNC
127if ARCH_AARCH64_LINUX
128IFUNC_OPTIONS	     = -march=armv8-a+lse
129libatomic_la_LIBADD += $(foreach s,$(SIZES),$(addsuffix _$(s)_1_.lo,$(SIZEOBJS)))
130endif
131if ARCH_ARM_LINUX
132IFUNC_OPTIONS	     = -march=armv7-a+fp -DHAVE_KERNEL64
133libatomic_la_LIBADD += $(foreach s,$(SIZES),$(addsuffix _$(s)_1_.lo,$(SIZEOBJS)))
134libatomic_la_LIBADD += $(addsuffix _8_2_.lo,$(SIZEOBJS))
135endif
136if ARCH_I386
137IFUNC_OPTIONS	     = -march=i586
138libatomic_la_LIBADD += $(addsuffix _8_1_.lo,$(SIZEOBJS))
139endif
140if ARCH_X86_64
141IFUNC_OPTIONS	     = -mcx16
142libatomic_la_LIBADD += $(addsuffix _16_1_.lo,$(SIZEOBJS))
143endif
144endif
145
146libatomic_convenience_la_SOURCES = $(libatomic_la_SOURCES)
147libatomic_convenience_la_LIBADD = $(libatomic_la_LIBADD)
148
149# Override the automake generated all-multi rule to guarantee that all-multi
150# is not run in parallel with the %_.lo rules which generate $(DEPDIR)/*.Ppo
151# makefile fragments to avoid broken *.Ppo getting included into the Makefile
152# when it is reloaded during the build of all-multi.
153all-multi: $(libatomic_la_LIBADD)
154	$(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do # $(MAKE)
155
156include $(top_srcdir)/../multilib.am
157