1 ## See sim/Makefile.am. 2 ## 3 ## Copyright (C) 1997-2024 Free Software Foundation, Inc. 4 ## 5 ## This program is free software; you can redistribute it and/or modify 6 ## it under the terms of the GNU General Public License as published by 7 ## the Free Software Foundation; either version 3 of the License, or 8 ## (at your option) any later version. 9 ## 10 ## This program is distributed in the hope that it will be useful, 11 ## but WITHOUT ANY WARRANTY; without even the implied warranty of 12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 ## GNU General Public License for more details. 14 ## 15 ## You should have received a copy of the GNU General Public License 16 ## along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 ## Parts of the common/ sim code that have been unified. 19 20 AM_CPPFLAGS += \ 21 -I$(srcdir)/%D% \ 22 -DSIM_TOPDIR_BUILD 23 AM_CPPFLAGS_%C% = -DSIM_COMMON_BUILD 24 AM_CPPFLAGS_FOR_BUILD += -I$(srcdir)/%D% 25 26 ## NB: libcommon.a isn't used directly by ports. We need a target for common 27 ## objects to be a part of, and ports use the individual objects directly. 28 ## We can delete this once ppc/Makefile.in is merged into ppc/local.mk. 29 noinst_LIBRARIES += %D%/libcommon.a 30 %C%_libcommon_a_SOURCES = \ 31 %D%/callback.c \ 32 %D%/portability.c \ 33 %D%/sim-load.c \ 34 %D%/sim-signal.c \ 35 %D%/syscall.c \ 36 %D%/target-newlib-errno.c \ 37 %D%/target-newlib-open.c \ 38 %D%/target-newlib-signal.c \ 39 %D%/target-newlib-syscall.c \ 40 %D%/version.c 41 42 %D%/version.c: %D%/version.c-stamp ; @true 43 %D%/version.c-stamp: $(srcroot)/gdb/version.in $(srcroot)/bfd/version.h $(srcdir)/%D%/create-version.sh 44 $(AM_V_GEN)$(SHELL) $(srcdir)/%D%/create-version.sh $(srcroot)/gdb $@.tmp 45 $(AM_V_at)$(SHELL) $(srcroot)/move-if-change $@.tmp $(@:-stamp=) 46 $(AM_V_at)touch $@ 47 48 CLEANFILES += \ 49 %D%/version.c %D%/version.c-stamp 50 51 ## NB: This is a bit of a hack. If we can generalize the common/ files, we can 52 ## turn this from an arch-specific %/test-hw-events into a common/test-hw-events 53 ## program. 54 .PRECIOUS: %/test-hw-events.o 55 %/test-hw-events.o: common/hw-events.c 56 $(AM_V_CC)$(COMPILE) -DMAIN -c -o $@ $< 57 %/test-hw-events: %/test-hw-events.o %/libsim.a 58 $(AM_V_CCLD)$(LINK) -o $@ $^ $(SIM_COMMON_LIBS) $(LIBS) 59 60 ## 61 ## For subdirs. 62 ## 63 64 SIM_COMMON_HW_OBJS = \ 65 hw-alloc.o \ 66 hw-base.o \ 67 hw-device.o \ 68 hw-events.o \ 69 hw-handles.o \ 70 hw-instances.o \ 71 hw-ports.o \ 72 hw-properties.o \ 73 hw-tree.o \ 74 sim-hw.o 75 76 SIM_NEW_COMMON_OBJS = \ 77 sim-arange.o \ 78 sim-bits.o \ 79 sim-close.o \ 80 sim-command.o \ 81 sim-config.o \ 82 sim-core.o \ 83 sim-cpu.o \ 84 sim-endian.o \ 85 sim-engine.o \ 86 sim-events.o \ 87 sim-fpu.o \ 88 sim-hload.o \ 89 sim-hrw.o \ 90 sim-io.o \ 91 sim-info.o \ 92 sim-memopt.o \ 93 sim-model.o \ 94 sim-module.o \ 95 sim-options.o \ 96 sim-profile.o \ 97 sim-reason.o \ 98 sim-reg.o \ 99 sim-stop.o \ 100 sim-syscall.o \ 101 sim-trace.o \ 102 sim-utils.o \ 103 sim-watch.o 104 105 SIM_HW_DEVICES = cfi core pal glue 106 107 if SIM_ENABLE_HW 108 SIM_NEW_COMMON_OBJS += \ 109 $(SIM_COMMON_HW_OBJS) \ 110 $(SIM_HW_SOCKSER) 111 endif 112 113 # FIXME This is one very simple-minded way of generating the file hw-config.h. 114 %/hw-config.h: %/stamp-hw ; @true 115 %/stamp-hw: Makefile 116 $(AM_V_GEN)set -e; \ 117 ( \ 118 sim_hw="$(SIM_HW_DEVICES) $($(@D)_SIM_EXTRA_HW_DEVICES)" ; \ 119 echo "/* generated by Makefile */" ; \ 120 printf "extern const struct hw_descriptor dv_%s_descriptor[];\n" $$sim_hw ; \ 121 echo "const struct hw_descriptor * const hw_descriptors[] = {" ; \ 122 printf " dv_%s_descriptor,\n" $$sim_hw ; \ 123 echo " NULL," ; \ 124 echo "};" \ 125 ) > $@.tmp; \ 126 $(SHELL) $(srcroot)/move-if-change $@.tmp $(@D)/hw-config.h; \ 127 touch $@ 128 .PRECIOUS: %/stamp-hw 129 130 MOSTLYCLEANFILES += $(SIM_ENABLED_ARCHES:%=%/hw-config.h) $(SIM_ENABLED_ARCHES:%=%/stamp-hw) 131 132 ## See sim_pre_argv_init and sim_module_install in sim-module.c for more details. 133 ## TODO: Switch this to xxx_SOURCES once projects build objects in local.mk. 134 am_arch_d = $(subst -,_,$(@D)) 135 GEN_MODULES_C_SRCS = \ 136 $(wildcard \ 137 $(patsubst %,$(srcdir)/%,$($(am_arch_d)_libsim_a_SOURCES)) \ 138 $(patsubst %.o,$(srcdir)/%.c,$($(am_arch_d)_libsim_a_OBJECTS) $($(am_arch_d)_libsim_a_LIBADD)) \ 139 $(filter-out %.o,$(patsubst $(@D)/%.o,$(srcdir)/common/%.c,$($(am_arch_d)_libsim_a_LIBADD)))) 140 %/modules.c: %/stamp-modules ; @true 141 %/stamp-modules: Makefile 142 $(AM_V_GEN)set -e; \ 143 LANG=C ; export LANG; \ 144 LC_ALL=C ; export LC_ALL; \ 145 sed -n -e '/^sim_install_/{s/^\(sim_install_[a-z_0-9A-Z]*\).*/\1/;p}' $(GEN_MODULES_C_SRCS) | sort >$@.l-tmp; \ 146 ( \ 147 echo '/* Do not modify this file. */'; \ 148 echo '/* It is created automatically by the Makefile. */'; \ 149 echo '#include "libiberty.h"'; \ 150 echo '#include "sim-module.h"'; \ 151 sed -e 's:\(.*\):extern MODULE_INIT_FN \1;:' $@.l-tmp; \ 152 echo 'MODULE_INSTALL_FN * const sim_modules_detected[] = {'; \ 153 sed -e 's:\(.*\): \1,:' $@.l-tmp; \ 154 echo '};'; \ 155 echo 'const int sim_modules_detected_len = ARRAY_SIZE (sim_modules_detected);'; \ 156 ) >$@.tmp; \ 157 $(SHELL) $(srcroot)/move-if-change $@.tmp $(@D)/modules.c; \ 158 rm -f $@.l-tmp; \ 159 touch $@ 160 .PRECIOUS: %/stamp-modules 161 162 ## NB: The ppc port doesn't currently utilize the modules API, so skip it. 163 MOSTLYCLEANFILES += $(SIM_ENABLED_ARCHES:%=%/modules.c) $(SIM_ENABLED_ARCHES:%=%/stamp-modules) 164 165 LIBIBERTY_LIB = ../libiberty/libiberty.a 166 BFD_LIB = ../bfd/libbfd.la 167 OPCODES_LIB = ../opcodes/libopcodes.la 168 169 SIM_COMMON_LIBS = \ 170 $(BFD_LIB) \ 171 $(OPCODES_LIB) \ 172 $(LIBIBERTY_LIB) \ 173 $(LIBGNU) \ 174 $(LIBGNU_EXTRA_LIBS) 175 176 ## 177 ## CGEN support. 178 ## 179 180 ## If the local tree has a bundled copy of guile, use that. 181 GUILE = guile 182 CGEN = "$(GUILE) -l $(cgendir)/guile.scm -s" 183 CGENFLAGS = -v 184 CGEN_CPU_DIR = $(cgendir)/cpu 185 ## Most ports use the files here instead of cgen/cpu. 186 CPU_DIR = $(srcroot)/cpu 187 CGEN_ARCHFILE = $(CPU_DIR)/$(@D).cpu 188 189 CGEN_READ_SCM = $(cgendir)/sim.scm 190 CGEN_ARCH_SCM = $(cgendir)/sim-arch.scm 191 CGEN_CPU_SCM = $(cgendir)/sim-cpu.scm $(cgendir)/sim-model.scm 192 CGEN_DECODE_SCM = $(cgendir)/sim-decode.scm 193 CGEN_DESC_SCM = $(cgendir)/desc.scm $(cgendir)/desc-cpu.scm 194 195 ## Various choices for which cpu specific files to generate. 196 ## These are passed to cgen.sh in the "extrafiles" argument. 197 CGEN_CPU_EXTR = /extr/ 198 CGEN_CPU_READ = /read/ 199 CGEN_CPU_WRITE = /write/ 200 CGEN_CPU_SEM = /sem/ 201 CGEN_CPU_SEMSW = /semsw/ 202 203 CGEN_WRAPPER = $(srccom)/cgen.sh 204 205 CGEN_GEN_ARCH = \ 206 $(SHELL) $(CGEN_WRAPPER) arch $(srcdir)/$(@D) \ 207 $(CGEN) $(cgendir) "$(CGENFLAGS)" \ 208 $(@D) "$$FLAGS" ignored "$$isa" $$mach ignored \ 209 $(CGEN_ARCHFILE) ignored 210 CGEN_GEN_CPU = \ 211 $(SHELL) $(CGEN_WRAPPER) cpu $(srcdir)/$(@D) \ 212 $(CGEN) $(cgendir) "$(CGENFLAGS)" \ 213 $(@D) "$$FLAGS" $$cpu "$$isa" $$mach "$$SUFFIX" \ 214 $(CGEN_ARCHFILE) "$$EXTRAFILES" 215 CGEN_GEN_DEFS = \ 216 $(SHELL) $(CGEN_WRAPPER) defs $(srcdir)/$(@D) \ 217 $(CGEN) $(cgendir) "$(CGENFLAGS)" \ 218 $(@D) "$$FLAGS" $$cpu "$$isa" $$mach "$$SUFFIX" \ 219 $(CGEN_ARCHFILE) ignored 220 CGEN_GEN_DECODE = \ 221 $(SHELL) $(CGEN_WRAPPER) decode $(srcdir)/$(@D) \ 222 $(CGEN) $(cgendir) "$(CGENFLAGS)" \ 223 $(@D) "$$FLAGS" $$cpu "$$isa" $$mach "$$SUFFIX" \ 224 $(CGEN_ARCHFILE) "$$EXTRAFILES" 225 CGEN_GEN_CPU_DECODE = \ 226 $(SHELL) $(CGEN_WRAPPER) cpu-decode $(srcdir)/$(@D) \ 227 $(CGEN) $(cgendir) "$(CGENFLAGS)" \ 228 $(@D) "$$FLAGS" $$cpu "$$isa" $$mach "$$SUFFIX" \ 229 $(CGEN_ARCHFILE) "$$EXTRAFILES" 230 CGEN_GEN_CPU_DESC = \ 231 $(SHELL) $(CGEN_WRAPPER) desc $(srcdir)/$(@D) \ 232 $(CGEN) $(cgendir) "$(CGENFLAGS)" \ 233 $(@D) "$$FLAGS" $$cpu "$$isa" $$mach "$$SUFFIX" \ 234 $(CGEN_ARCHFILE) ignored $$opcfile 235 236 CGEN_GEN_MLOOP = \ 237 $(SHELL) $(srccom)/lineno.sh \ 238 $(srccom)/genmloop.sh \ 239 $@.lineno.sh \ 240 -shell $(SHELL) -awk $(AWK) -lineno $(srccom)/lineno.sh \ 241 -infile $< -outfile-prefix $(@D)/ 242