OCAML_LIBRARIES =
CFLAGS = -O2 -fPIC -DPIC
OCAML_LIB_FLAGS += -ccopt -lblas -ccopt -llapack

switch $(PROCESSOR)
case x86_64
default
  OCAML_LIB_FLAGS += -ccopt -lg2c
  export

AUTOGEN = \
  vec4_S.mli vec4_S.ml vec4_D.mli vec4_D.ml \
  vec4_C.mli vec4_C.ml vec4_Z.mli vec4_Z.ml \
  vec2_S.mli vec2_S.ml vec2_D.mli vec2_D.ml \
  vec2_C.mli vec2_C.ml vec2_Z.mli vec2_Z.ml \
  mat4_S.mli mat4_S.ml mat4_D.mli mat4_D.ml \
  mat4_C.mli mat4_C.ml mat4_Z.mli mat4_Z.ml \
  mat2_S.mli mat2_S.ml mat2_D.mli mat2_D.ml \
  mat2_C.mli mat2_C.ml mat2_Z.mli mat2_Z.ml \
  impl2_S.mli impl2_S.ml impl2_D.mli impl2_D.ml \
  impl2_C.mli impl2_C.ml impl2_Z.mli impl2_Z.ml \
  impl4_S.mli impl4_S.ml impl4_D.mli impl4_D.ml \
  impl4_C.mli impl4_C.ml impl4_Z.mli impl4_Z.ml

LIB_CNAMES[] =
  impl_c
  utils_c
  vec2_S_c
  vec2_D_c
  vec2_C_c
  vec2_Z_c
  mat2_S_c
  mat2_D_c
  mat2_C_c
  mat2_Z_c
  mat4_S_c
  mat4_D_c
  mat4_C_c
  mat4_Z_c
  impl4_S_c
  impl4_D_c
  impl4_C_c
  impl4_Z_c
  impl2_S_c
  impl2_D_c
  impl2_C_c
  impl2_Z_c

LIB_MLNAMES[] =
  common
  utils
  float32
  float64
  complex32
  complex64
  vec4_S
  vec4_D
  vec4_C
  vec4_Z
  vec2_S
  vec2_D
  vec2_C
  vec2_Z
  mat4_S
  mat4_D
  mat4_C
  mat4_Z
  mat2_S
  mat2_D
  mat2_C
  mat2_Z
  impl4_S
  impl4_D
  impl4_C
  impl4_Z
  impl2_S
  impl2_D
  impl2_C
  impl2_Z
  io
  impl

# Generation rules for precision-dependent C-code
%2_S_c.o:  %_SD_c.c
  $(CC) -c $(CFLAGS) $(PREFIXED_INCLUDES) $< -o $@

%2_D_c.o:  %_SD_c.c
  $(CC) -c -DLACAML_DOUBLE $(CFLAGS) $(PREFIXED_INCLUDES) $< -o $@

%2_C_c.o:  %_CZ_c.c
  $(CC) -c -DLACAML_COMPLEX $(CFLAGS) $(PREFIXED_INCLUDES) $< -o $@

%2_Z_c.o:  %_CZ_c.c
  $(CC) -c -DLACAML_COMPLEX -DLACAML_DOUBLE $(CFLAGS) $(PREFIXED_INCLUDES) \
    $< -o $@

%4_S_c.o:  %_SDCZ_c.c
  $(CC) -c $(CFLAGS) $(PREFIXED_INCLUDES) $< -o $@

%4_D_c.o:  %_SDCZ_c.c
  $(CC) -c -DLACAML_DOUBLE $(CFLAGS) $(PREFIXED_INCLUDES) $< -o $@

%4_C_c.o:  %_SDCZ_c.c
  $(CC) -c -DLACAML_COMPLEX $(CFLAGS) $(PREFIXED_INCLUDES) $< -o $@

%4_Z_c.o:  %_SDCZ_c.c
  $(CC) -c -DLACAML_COMPLEX -DLACAML_DOUBLE $(CFLAGS) $(PREFIXED_INCLUDES) \
    $< -o $@

# Generation rules for precision-dependent OCaml-code
%2_S.mli:  %_SD.mli
  sed -e "s/FPREC/S/g" \
    -e "s/Floatxx/Float32/g" \
    -e "s/floatxx/float32/g" $< > $@

%2_S.ml:    %_SD.ml
  sed -e "s/FPREC/S/g" \
    -e "s/Floatxx/Float32/g" \
    -e "s/floatxx/float32/g" $< > $@

%2_D.mli:  %_SD.mli
  sed -e "s/FPREC/D/g" \
    -e "s/Floatxx/Float64/g" \
    -e "s/floatxx/float64/g" $< > $@

%2_D.ml:    %_SD.ml
  sed -e "s/FPREC/D/g" \
    -e "s/Floatxx/Float64/g" \
    -e "s/floatxx/float64/g" $< > $@

%2_C.mli:  %_CZ.mli
  sed -e "s/CPREC/C/g" \
    -e "s/Floatxx/Float32/g" \
    -e "s/floatxx/float32/g" \
    -e "s/CBPREC/S/g" \
    -e "s/Complexxx/Complex32/g" \
    -e "s/complexxx/complex32/g" $< > $@

%2_C.ml:    %_CZ.ml
  sed -e "s/CPREC/C/g" \
    -e "s/Floatxx/Float32/g" \
    -e "s/floatxx/float32/g" \
    -e "s/CBPREC/S/g" \
    -e "s/Complexxx/Complex32/g" \
    -e "s/complexxx/complex32/g" $< > $@

%2_Z.mli:  %_CZ.mli
  sed -e "s/CPREC/Z/g" -e "s/CBPREC/D/g" \
    -e "s/Floatxx/Float64/g" \
    -e "s/floatxx/float64/g" \
    -e "s/Complexxx/Complex64/g" \
    -e "s/complexxx/complex64/g" $< > $@

%2_Z.ml:    %_CZ.ml
  sed -e "s/CPREC/Z/g" -e "s/CBPREC/D/g" \
    -e "s/Floatxx/Float64/g" \
    -e "s/floatxx/float64/g" \
    -e "s/Complexxx/Complex64/g" \
    -e "s/complexxx/complex64/g" $< > $@

%4_S.mli:  %_SDCZ.mli
  sed -e "s/NPREC/S/g" -e "s/NBPREC/S/g" \
    -e "s/Numberxx/Float32/g" \
    -e "s/numberxx/float32/g" $< > $@

%4_S.ml:    %_SDCZ.ml
  sed -e "s/NPREC/S/g" -e "s/NBPREC/S/g" \
    -e "s/Numberxx/Float32/g" \
    -e "s/numberxx/float32/g" $< > $@

%4_D.mli:  %_SDCZ.mli
  sed -e "s/NPREC/D/g" -e "s/NBPREC/D/g" \
    -e "s/Numberxx/Float64/g" \
    -e "s/numberxx/float64/g" $< > $@

%4_D.ml:    %_SDCZ.ml
  sed -e "s/NPREC/D/g" -e "s/NBPREC/D/g" \
    -e "s/Numberxx/Float64/g" \
    -e "s/numberxx/float64/g" $< > $@

%4_C.mli:  %_SDCZ.mli
  sed -e "s/NPREC/C/g" -e "s/NBPREC/S/g" \
    -e "s/Numberxx/Complex32/g" \
    -e "s/numberxx/complex32/g" $< > $@

%4_C.ml:    %_SDCZ.ml
  sed -e "s/NPREC/C/g" -e "s/NBPREC/S/g" \
    -e "s/Numberxx/Complex32/g" \
    -e "s/numberxx/complex32/g" $< > $@

%4_Z.mli:  %_SDCZ.mli
  sed -e "s/NPREC/Z/g" -e "s/NBPREC/D/g" \
    -e "s/Numberxx/Complex64/g" \
    -e "s/numberxx/complex64/g" $< > $@

%4_Z.ml:    %_SDCZ.ml
  sed -e "s/NPREC/Z/g" -e "s/NBPREC/D/g" \
    -e "s/Numberxx/Complex64/g" \
    -e "s/numberxx/complex64/g" $< > $@

OCamlMakeLibPackage(lacaml)

InstantiateOCamlEnv()
