#
# Makefile for bfd library under openVMS
#
# For use with gnu-make for vms
#
# Created by Klaus K"ampf, kkaempf@rmi.de
#
#   Copyright (C) 2012-2021 Free Software Foundation, Inc.
#
# This file 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.
#
# This program 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.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.
#

ifeq ($(ARCH),IA64)
HOSTFILE=alphavms.h
OBJS:=cpu-ia64.obj,elfxx-ia64.obj,elf64-ia64-vms.obj,\
  vms-misc.obj,vms-lib.obj,elf-strtab.obj,corefile.obj,stabs.obj,\
  merge.obj,elf-eh-frame.obj,elflink.obj,elf-attrs.obj,dwarf1.obj,elf64.obj
DEFS=SELECT_VECS="&ia64_elf64_vms_vec",\
 SELECT_ARCHITECTURES="&bfd_ia64_arch","HAVE_ia64_elf64_vms_vec"=1
endif
ifeq ($(ARCH),ALPHA)
HOSTFILE=alphavms.h
OBJS:=vms-alpha.obj,vms-lib.obj,vms-misc.obj,cpu-alpha.obj
DEFS=SELECT_VECS="&alpha_vms_vec",SELECT_ARCHITECTURES="&bfd_alpha_arch"
endif

OBJS:=$(OBJS),archive.obj,archive64.obj,archures.obj,bfd.obj,bfdio.obj,\
  binary.obj,cache.obj,coffgen.obj,compress.obj,corefile.obj,dwarf2.obj,\
  elf.obj,format.obj,hash.obj,ihex.obj,init.obj,libbfd.obj,linker.obj,\
  opncls.obj,reloc.obj,section.obj,simple.obj,srec.obj,stab-syms.obj,\
  syms.obj,targets.obj,tekhex.obj,verilog.obj

ifeq ($(CC),gcc)
CFLAGS=/include=([],[-.include])$(DEFS)
else
OPT=/noopt/debug
CFLAGS=/name=(as_is,shortened)/include=([],"../include")\
 /define=("unlink=remove",DEBUGDIR="""GNU$$DEBUGDIR:""",$(DEFS))\
 /warns=(infor=(missingreturn,badansialias))$(OPT)
endif

libbfd.olb: $(OBJS)
	purge
	lib/create libbfd $(OBJS)

targmatch.h: bfd.h
config.h: bfd.h
vms-misc.c: vms.h
targets.c: targmatch.h

clean:
	$$ purge
	$(RM) libbfd.olb;
	$(RM) *.obj;
