######
#
# The main Makefile
# for C-bootstrapping ATS2
#
######
#
CC=gcc
GCC=gcc
CCOMP=$(CC)
#
# GCFLAG=-D_ATS_NGC
# GCFLAG=-D_ATS_GCATS
# GCFLAG=-D_ATS_GCBDW
#
# CFLAGS=
# LDFLAGS=
#
######

CFLAGS += -I. -I./ccomp/runtime

######
#
# This is fixed:
#
C3NSTRINTKND=gmpknd
#
# [gmpknd] for CBOOT
# [intknd] for CBOOTmin
#
######
#
LIBGMP=
#
ifeq ($(C3NSTRINTKND),intknd)
LIBGMP :=
endif
ifeq ($(C3NSTRINTKND),gmpknd)
LIBGMP := -lgmp
endif
#
######
#
LIBGC=
gcats_o=
#
ifeq ($(GCFLAG),-D_ATS_GCBDW)
  LIBGC := -lgc
endif
ifeq ($(GCFLAG),-D_ATS_GCATS)
  gcats_o := gcats.o
endif
#
######

all:: patsopt

######

SOURCES := \
  pats_params.hats \
  pats_error.sats \
  pats_error.dats \
  pats_intinf.sats \
  pats_intinf.dats \
  pats_counter.sats \
  pats_counter.dats \
  pats_utils.sats \
  pats_utils.dats \
  pats_global.sats \
  pats_global.dats \
  pats_basics.sats \
  pats_basics.dats \
  pats_basics.hats \
  pats_stamp.sats \
  pats_stamp.dats \
  pats_symbol.sats \
  pats_symbol.dats \
  pats_filename.sats \
  pats_filename.dats \
  pats_location.sats \
  pats_location.dats \
  pats_location.cats \
  pats_jsonize.sats \
  pats_jsonize.dats \
  pats_errmsg.sats \
  pats_errmsg.dats \
  pats_reader.sats \
  pats_reader.dats \
  pats_reader.cats \
  pats_lexbuf.sats \
  pats_lexbuf.dats \
  pats_lexbuf.cats \
  pats_lexing.sats \
  pats_lexing.dats \
  pats_lexing.cats \
  pats_lexing_print.dats \
  pats_lexing_error.dats \
  pats_lexing_token.dats \
  pats_label.sats \
  pats_label.dats \
  pats_effect.sats \
  pats_effect.dats \
  pats_fixity.sats \
  pats_fixity_prec.dats \
  pats_fixity_fxty.dats \
  pats_syntax.sats \
  pats_syntax.dats \
  pats_syntax_print.dats \
  pats_depgen.sats \
  pats_depgen.dats \
  pats_taggen.sats \
  pats_taggen.dats \
  pats_tokbuf.sats \
  pats_tokbuf.dats \
  pats_tokbuf.cats \
  pats_parsing.sats \
  pats_parsing.dats \
  pats_parsing_error.dats \
  pats_parsing_util.dats \
  pats_parsing_kwds.dats \
  pats_parsing_base.dats \
  pats_parsing_e0xp.dats \
  pats_parsing_sort.dats \
  pats_parsing_staexp.dats \
  pats_parsing_p0at.dats \
  pats_parsing_dynexp.dats \
  pats_parsing_decl.dats \
  pats_parsing_toplevel.dats \
  pats_symmap.sats \
  pats_symmap.dats \
  pats_symmap_avltree.hats \
  pats_symmap_htlinprb.hats \
  pats_symenv.sats \
  pats_symenv.dats \
  pats_staexp1.sats \
  pats_staexp1.dats \
  pats_staexp1_print.dats \
  pats_dynexp1.sats \
  pats_dynexp1.dats \
  pats_dynexp1_print.dats \
  pats_trans1.sats \
  pats_trans1_env.sats \
  pats_trans1_env.dats \
  pats_e1xpval.sats \
  pats_e1xpval.dats \
  pats_e1xpval_error.dats \
  pats_filename_reloc.dats \
  pats_trans1_error.dats \
  pats_trans1_e0xp.dats \
  pats_trans1_effect.dats \
  pats_trans1_sort.dats \
  pats_trans1_staexp.dats \
  pats_trans1_p0at.dats \
  pats_trans1_syndef.dats \
  pats_trans1_dynexp.dats \
  pats_trans1_decl.dats \
  pats_staexp2.sats \
  pats_staexp2.dats \
  pats_stacst2.sats \
  pats_stacst2.dats \
  pats_staexp2_print.dats \
  pats_staexp2_pprint.dats \
  pats_staexp2_sort.dats \
  pats_staexp2_scst.dats \
  pats_staexp2_svar.dats \
  pats_staexp2_svvar.dats \
  pats_staexp2_hole.dats \
  pats_staexp2_ctxt.dats \
  pats_staexp2_dcon.dats \
  pats_staexp2_skexp.dats \
  pats_staexp2_szexp.dats \
  pats_staexp2_util.sats \
  pats_staexp2_util1.dats \
  pats_staexp2_util2.dats \
  pats_staexp2_util3.dats \
  pats_staexp2_error.sats \
  pats_staexp2_error.dats \
  pats_staexp2_solve.sats \
  pats_staexp2_solve.dats \
  pats_patcst2.sats \
  pats_patcst2.dats \
  pats_dynexp2.sats \
  pats_dynexp2.dats \
  pats_dyncst2.sats \
  pats_dyncst2.dats \
  pats_dynexp2_print.dats \
  pats_dynexp2_dcst.dats \
  pats_dynexp2_dvar.dats \
  pats_dynexp2_dmac.dats \
  pats_dynexp2_util.dats \
  pats_dynexp2_mapgen.dats \
  pats_codegen2.sats \
  pats_codegen2.dats \
  pats_codegen2_util.dats \
  pats_codegen2_absrec.dats \
  pats_codegen2_datype.dats \
  pats_codegen2_fprint.dats \
  pats_jsonize_synent2.sats \
  pats_jsonize_synent2.dats \
  pats_trans2.sats \
  pats_namespace.sats \
  pats_namespace.dats \
  pats_trans2_env.sats \
  pats_trans2_env.dats \
  pats_trans2_error.dats \
  pats_trans2_sort.dats \
  pats_trans2_staexp.dats \
  pats_trans2_p1at.dats \
  pats_trans2_dynexp.dats \
  pats_trans2_impdec.dats \
  pats_trans2_decl.dats \
  pats_dynexp3.sats \
  pats_dynexp3.dats \
  pats_dynexp3_print.dats \
  pats_trans3.sats \
  pats_trans3_error.dats \
  pats_trans3_util.dats \
  pats_trans3_env.sats \
  pats_trans3_env.dats \
  pats_trans3_env_print.dats \
  pats_trans3_env_scst.dats \
  pats_trans3_env_svar.dats \
  pats_trans3_env_termet.dats \
  pats_trans3_env_effect.dats \
  pats_trans3_env_dvar.dats \
  pats_trans3_env_lamlp.dats \
  pats_trans3_env_pfman.dats \
  pats_trans3_env_lstate.dats \
  pats_dmacro2.sats \
  pats_dmacro2.dats \
  pats_dmacro2_print.dats \
  pats_dmacro2_eval0.dats \
  pats_dmacro2_eval1.dats \
  pats_trans3_p2at.dats \
  pats_trans3_patcon.dats \
  pats_trans3_syncst.dats \
  pats_trans3_dynexp_up.dats \
  pats_trans3_dynexp_dn.dats \
  pats_trans3_appsym.dats \
  pats_trans3_caseof.dats \
  pats_trans3_selab.dats \
  pats_trans3_ptrof.dats \
  pats_trans3_viewat.dats \
  pats_trans3_deref.dats \
  pats_trans3_assgn.dats \
  pats_trans3_xchng.dats \
  pats_trans3_lvalres.dats \
  pats_trans3_fldfrat.dats \
  pats_trans3_looping.dats \
  pats_trans3_decl.dats \
  pats_lintprgm.sats \
  pats_lintprgm.dats \
  pats_lintprgm_print.dats \
  pats_lintprgm_myint.cats \
  pats_lintprgm_myint.dats \
  pats_lintprgm_solve.dats \
  pats_constraint3.sats \
  pats_constraint3.dats \
  pats_constraint3_print.dats \
  pats_constraint3_mapgen.dats \
  pats_constraint3_jsonize.dats \
  pats_constraint3_init.dats \
  pats_constraint3_simplify.dats \
  pats_constraint3_icnstr.dats \
  pats_constraint3_solve.dats \
  pats_histaexp.sats \
  pats_histaexp.dats \
  pats_histaexp_print.dats \
  pats_histaexp_funlab.dats \
  pats_hidynexp.sats \
  pats_hidynexp.dats \
  pats_hidynexp_print.dats \
  pats_hidynexp_util.dats \
  pats_typerase.sats \
  pats_typerase_error.dats \
  pats_typerase_staexp.dats \
  pats_typerase_dynexp.dats \
  pats_typerase_decl.dats \
  pats_ccomp.sats \
  pats_ccomp.dats \
  pats_ccomp_print.dats \
  pats_ccomp_hitype.dats \
  pats_ccomp_tmplab.dats \
  pats_ccomp_tmpvar.dats \
  pats_ccomp_d2env.dats \
  pats_ccomp_funlab.dats \
  pats_ccomp_funent.dats \
  pats_ccomp_util.dats \
  pats_ccomp_ccompenv.dats \
  pats_ccomp_instrseq.dats \
  pats_ccomp_hipat.dats \
  pats_ccomp_dynexp.dats \
  pats_ccomp_caseof.dats \
  pats_ccomp_claulst.dats \
  pats_ccomp_lazyeval.dats \
  pats_ccomp_trywith.dats \
  pats_ccomp_looping.dats \
  pats_ccomp_decl.dats \
  pats_ccomp_subst.dats \
  pats_ccomp_environ.dats \
  pats_ccomp_template.dats \
  pats_ccomp_emit.dats \
  pats_ccomp_emit2.dats \
  pats_ccomp_emit3.dats \
  pats_ccomp_main.dats \
  pats_comarg.sats \
  pats_comarg.dats \

######

SOURCESsta := $(filter %.sats, $(SOURCES))
SOURCESdyn := $(filter %.dats, $(SOURCES))

######

OBJECTSsta := $(SOURCESsta)
OBJECTSsta := $(patsubst %.sats, %_sats.o, $(OBJECTSsta))
OBJECTSdyn := $(SOURCESdyn)
OBJECTSdyn := $(patsubst %.dats, %_dats.o, $(OBJECTSdyn))

######

OBJECTSstadyn := $(OBJECTSsta) $(OBJECTSdyn)

######
#
patsopt: \
pats_main_dats.o \
$(OBJECTSstadyn) \
prelude_libats.o \
libc_libats.o libats_libats.o ; \
$(CCOMP) -O2 -I. $(GCFLAG) -o $@ \
  ccomp/runtime/ats_prelude.c $^ $(gcats_o) $(LDFLAGS) $(LIBGMP) $(LIBGC)
#
######
#
AR=ar
MV=mv
#
libatsopt: \
pats_main_none_dats.o \
$(OBJECTSstadyn) \
prelude_libats.o \
libc_libats.o libats_libats.o ; \
$(AR) -r libatsopt.a $^ $(gcats_o)
#
######
#
%_sats.o: %_sats.c ; $(CCOMP) -O2 $(CFLAGS) -c -o $@ $<
%_dats.o: %_dats.c ; $(CCOMP) -O2 $(CFLAGS) -c -o $@ $<
#
######

PRELUDE_OBJECTS := \
  prelude_basics_sta_sats.o \
  prelude_basics_dyn_sats.o \
  prelude_ats_main_prelude_dats.o \
  prelude_DATS_basics_dats.o \
  prelude_DATS_bool_dats.o \
  prelude_DATS_char_dats.o \
  prelude_DATS_float_dats.o \
  prelude_DATS_integer_dats.o \
  prelude_DATS_sizetype_dats.o \
  prelude_DATS_pointer_dats.o \
  prelude_DATS_reference_dats.o \
  prelude_DATS_string_dats.o \
  prelude_DATS_lazy_dats.o \
  prelude_DATS_lazy_vt_dats.o \
  prelude_DATS_printf_dats.o \
  prelude_DATS_filebas_dats.o \
  prelude_DATS_list_dats.o \
  prelude_DATS_list_vt_dats.o \
  prelude_DATS_list0_dats.o \
  prelude_DATS_option_dats.o \
  prelude_DATS_option_vt_dats.o \
  prelude_DATS_option0_dats.o \
  prelude_DATS_array_dats.o \
  prelude_DATS_array0_dats.o \
  prelude_DATS_matrix_dats.o \
  prelude_DATS_matrix0_dats.o \
  prelude_DATS_ptrarr_dats.o \
  prelude_DATS_unsafe_dats.o \

######
#
prelude_%.o: \
prelude/%.c ; $(CCOMP) $(CFLAGS) -c -o $@ $<
#
prelude_libats.o: $(PRELUDE_OBJECTS) ; ld -r -o $@ $^
#
######

LIBC_OBJECTS := \
  libc_SATS_errno_sats.o \
  libc_SATS_fcntl_sats.o \
  libc_DATS_fcntl_dats.o \
  libc_SATS_stdarg_sats.o \
  libc_SATS_stdio_sats.o \
  libc_SATS_stdlib_sats.o \
  libc_SATS_string_sats.o \
  libc_SATS_time_sats.o \
  libc_SATS_unistd_sats.o \
  libc_DATS_unistd_dats.o \
  libc_sys_SATS_stat_sats.o \
  libc_sys_SATS_wait_sats.o \
  libc_sys_SATS_types_sats.o \

ifeq ($(C3NSTRINTKND),gmpknd)
LIBC_OBJECTS += \
  libc_SATS_gmp_sats.o libc_DATS_gmp_dats.o
endif

######
#
libc_%.o: \
libc/%.c ; $(CCOMP) $(CFLAGS) -c -o $@ $<
#
libc_libats.o: $(LIBC_OBJECTS) ; ld -r -o $@ $^
#
######

LIBATS_OBJECTS := \
  libats_SATS_funmap_avltree_sats.o \
  libats_DATS_funmap_avltree_dats.o \
  libats_SATS_funset_avltree_sats.o \
  libats_DATS_funset_avltree_dats.o \
  libats_SATS_funset_listord_sats.o \
  libats_DATS_funset_listord_dats.o \
  libats_SATS_funmset_listord_sats.o \
  libats_DATS_funmset_listord_dats.o \
  libats_SATS_hashtable_chain_sats.o \
  libats_DATS_hashtable_chain_dats.o \
  libats_SATS_hashtable_linprb_sats.o \
  libats_DATS_hashtable_linprb_dats.o \
  libats_SATS_linqueue_arr_sats.o \
  libats_DATS_linqueue_arr_dats.o \
  libats_SATS_linqueue_lst_sats.o \
  libats_DATS_linqueue_lst_dats.o \
  libats_ngc_SATS_deque_arr_sats.o \
  libats_ngc_DATS_deque_arr_dats.o \

######
#
libats_%.o: \
libats/%.c ; $(CCOMP) $(CFLAGS) -c -o $@ $<
#
libats_libats.o: $(LIBATS_OBJECTS) ; ld -r -o $@ $^
#
######
#
gcats.o: \
  gcats1_hats gcats1_all_cats.o ; ld -r -o $@ gcats1_all_cats.o
#
gcats1_hats: ; \
  $(GCC) -E -P -o gcats1.hats -x c ./ccomp/runtime/GCATS/gcats1_master.hats
#
gcats1_all_cats.o: ; \
  $(CCOMP) -O2 -I. -I./ccomp/runtime -c -o $@ -x c ./ccomp/runtime/gcats1_all.cats
#
######

CPF=cp -f
RMF=rm -f

######
#
clean:: ; $(RMF) *~
clean:: ; $(RMF) *_sats.o
clean:: ; $(RMF) *_dats.o
#
clean:: ; $(RMF) gcats1.hats
clean:: ; $(RMF) gcats1_all_cats.o
#
clean:: ; $(RMF) gcats.o
clean:: ; $(RMF) patsopt
clean:: ; $(RMF) prelude_libats.o
clean:: ; $(RMF) libc_libats.o
clean:: ; $(RMF) libats_libats.o
#
######

cleanall:: clean

######

###### end of [Makefile] ######