dnl This file is input of the m4 macro processor.
`# Specifications for the "camlp4" preprocessor:'
`requires = ""'
`version = "[distributed with Ocaml]"'
`description = "Base for Camlp4 syntax extensions"'
`directory = "+camlp4"'

`# For the toploop:'
`requires(byte,toploop) = "'camlp4_dynlink`"'
`archive(byte,toploop,camlp4o) = "camlp4o.cma"'
`archive(byte,toploop,camlp4r) = "camlp4r.cma"'

`# For the preprocessor itself:'
`archive(syntax,preprocessor,camlp4o) = "-parser o -parser op -printer p"'
`archive(syntax,preprocessor,camlp4r) = "-parser r -parser rp -printer p"'
`preprocessor = "'camlp4_cmd`"'

`package "lib" ('
`  requires = "camlp4 'camlp4_dynlink`"'
`  version = "[distributed with Ocaml]"'
`  description = "Camlp4 library"'
`  archive(byte) = "camlp4lib.cma"'
`  archive(byte,toploop) = ""  # already contained in camlp4*.cma'
`  archive(native) = "camlp4lib.cmxa"'
`)'

`package "gramlib" ('
`  requires = "camlp4.lib"'
`  version = "[distributed with Ocaml]"'
`  description = "Compatibilty name for camlp4.lib"'
`)'

`# don't use camlp4.lib and camlp4.fulllib together'
`package "fulllib" ('
`  requires = "camlp4 'camlp4_dynlink`"'
`  version = "[distributed with Ocaml]"'
`  description = "Camlp4 library"'
`  error(pkg_camlp4.lib) = "camlp4.lib and camlp4.fulllib are incompatible"'
`  archive(byte) = "camlp4fulllib.cma"'
`  archive(byte,toploop) = ""  # already contained in camlp4*.cma'
`  archive(native) = "camlp4fulllib.cmxa"'
`)'

`package "quotations" ('
`  version = "[distributed with Ocaml]"'
`  description = "Syntax extension: Quotations to create AST nodes"'
`  requires = "camlp4.quotations.r"  # backward compat'
dnl We must have a non-empty archive, otherwise this pkg is ignored
dnl for constructing the preprocessor command. We can pass -ignore arg
dnl to camlp4 as dummy argument:
`  archive(syntax,preprocessor) = "-ignore foo"'
`  package "o" ('
`    requires = "camlp4"'
`    version = "[distributed with Ocaml]"'
`    description = "Syntax extension: Quotations to create AST nodes (original syntax)"'
`    archive(syntax,preprocessor) = "-parser Camlp4QuotationCommon -parser Camlp4OCamlOriginalQuotationExpander"'
`    archive(syntax,toploop) = "Camlp4Parsers/Camlp4QuotationCommon.cmo Camlp4Parsers/Camlp4OCamlOriginalQuotationExpander.cmo"'
`  )'
`  package "r" ('
`    requires = "camlp4"'
`    version = "[distributed with Ocaml]"'
`    description = "Syntax extension: Quotations to create AST nodes (revised syntax)"'
`    archive(syntax,preprocessor) = "-parser Camlp4QuotationCommon -parser Camlp4OCamlRevisedQuotationExpander"'
`    archive(syntax,toploop) = "Camlp4Parsers/Camlp4QuotationCommon.cmo Camlp4Parsers/Camlp4OCamlRevisedQuotationExpander.cmo"'
`  )'
`)'

`package "extend" ('
`  requires = "camlp4"'
`  version = "[distributed with Ocaml]"'
`  description = "Syntax extension: EXTEND the camlp4 grammar"'
`  archive(syntax,preprocessor) = "-parser Camlp4GrammarParser"'
`  archive(syntax,toploop) = "Camlp4Parsers/Camlp4GrammarParser.cmo"'
`)'

`package "listcomprehension" ('
`  requires = "camlp4"'
`  version = "[distributed with Ocaml]"'
`  description = "Syntax extension for list comprehensions"'
`  archive(syntax,preprocessor) = "-parser Camlp4ListComprehension"'
`  archive(syntax,toploop) = "Camlp4Parsers/Camlp4ListComprehension.cmo"'
`)'

`package "macro" ('
`  requires = "camlp4"'
`  version = "[distributed with Ocaml]"'
`  description = "Syntax extension: Conditional compilation"'
`  archive(syntax,preprocessor) = "-parser Camlp4MacroParser"'
`  archive(syntax,toploop) = "Camlp4Parsers/Camlp4MacroParser.cmo"'
`)'

`package "mapgenerator" ('
`  requires = "camlp4"'
`  version = "[distributed with Ocaml]"'
`  description = "Syntax filter: Traverse data structure (map style)"'
`  archive(syntax,preprocessor) = "-filter Camlp4MapGenerator"'
`  archive(syntax,toploop) = "Camlp4Filters/Camlp4MapGenerator.cmo"'
`)'

`package "foldgenerator" ('
`  requires = "camlp4"'
`  version = "[distributed with Ocaml]"'
`  description = "Syntax filter: Traverse data structure (fold style)"'
`  archive(syntax,preprocessor) = "-filter Camlp4FoldGenerator"'
`  archive(syntax,toploop) = "Camlp4Filters/Camlp4FoldGenerator.cmo"'
`)'

`package "metagenerator" ('
`  requires = "camlp4"'
`  version = "[distributed with Ocaml]"'
`  description = "Syntax filter: Generate AST generator for data structure"'
`  archive(syntax,preprocessor) = "-filter Camlp4MetaGenerator"'
`  archive(syntax,toploop) = "Camlp4Filters/Camlp4MetaGenerator.cmo"'
`)'

`package "locationstripper" ('
`  requires = "camlp4"'
`  version = "[distributed with Ocaml]"'
`  description = "Syntax filter: Remove location info from AST"'
`  archive(syntax,preprocessor) = "-filter Camlp4LocationStripper"'
`  archive(syntax,toploop) = "Camlp4Filters/Camlp4LocationStripper.cmo"'
`)'

`package "tracer" ('
`  requires = "camlp4"'
`  version = "[distributed with Ocaml]"'
`  description = "Syntax filter: Trace execution"'
`  archive(syntax,preprocessor) = "-filter Camlp4Tracer"'
`  archive(syntax,toploop) = "Camlp4Filters/Camlp4Tracer.cmo"'
`)'

`package "exceptiontracer" ('
`  requires = "camlp4"'
`  version = "[distributed with Ocaml]"'
`  description = "Syntax filter: Trace exception execution"'
`  archive(syntax,preprocessor) = "-filter Camlp4ExceptionTracer"'
`  archive(syntax,toploop) = "Camlp4Filters/Camlp4ExceptionTracer.cmo"'
`)'

`package "profiler" ('
`  requires = "camlp4"'
`  version = "[distributed with Ocaml]"'
`  description = "Syntax filter: Count events during execution"'
`  archive(syntax,preprocessor) = "-filter Camlp4Profiler"'
`  archive(syntax,toploop) = "Camlp4Filters/Camlp4Profiler.cmo"'
`  archive(byte) = "camlp4prof.cmo"'
`  archive(native) = "camlp4prof.cmx"'
`)'
