with "config/libbullet_config.gpr";
project Libbullet is

   for Library_Name use "Libbullet";
   for Library_Version use Project'Library_Name & ".so." & Libbullet_Config.Crate_Version;

   for Source_Dirs use ("src");
   for Object_Dir use "obj";
   for Create_Missing_Dirs use "True";
   for Library_Dir use "lib";

   type Library_Type_Type is ("relocatable", "static", "static-pic");
   Library_Type : Library_Type_Type :=
     external ("LIBBULLET_LIBRARY_TYPE", external ("LIBRARY_TYPE", "static"));
   for Library_Kind use Library_Type;

   type Enabled_Kind is ("enabled", "disabled");
   Compile_Checks : Enabled_Kind := External ("LIBBULLET_COMPILE_CHECKS", "disabled");
   Runtime_Checks : Enabled_Kind := External ("LIBBULLET_RUNTIME_CHECKS", "disabled");
   Style_Checks : Enabled_Kind := External ("LIBBULLET_STYLE_CHECKS", "disabled");
   Contracts_Checks : Enabled_Kind := External ("LIBBULLET_CONTRACTS", "disabled");

   type Build_Kind is ("debug", "optimize");
   Build_Mode : Build_Kind := External ("LIBBULLET_BUILD_MODE", "optimize");

   Compile_Checks_Switches := ();
   case Compile_Checks is
      when "enabled" =>
         Compile_Checks_Switches :=
           ("-gnatwa",  -- All warnings
            "-gnatVa",  -- All validity checks
            "-gnatwe"); -- Warnings as errors
      when others => null;
   end case;

   Runtime_Checks_Switches := ();
   case Runtime_Checks is
      when "enabled" => null;
      when others =>
         Runtime_Checks_Switches :=
           ("-gnatp"); -- Suppress checks
   end case;

   Style_Checks_Switches := ();
   case Style_Checks is
      when "enabled" =>
         Style_Checks_Switches :=
           ("-gnatyg",   -- GNAT Style checks
            "-gnaty-d",  -- Disable no DOS line terminators
            "-gnatyM80", -- Maximum line length
            "-gnatyO");  -- Overriding subprograms explicitly marked as such
      when others => null;
   end case;

   Contracts_Switches := ();
   case Contracts_Checks is
      when "enabled" =>
         Contracts_Switches :=
           ("-gnata"); --  Enable assertions and contracts
      when others => null;
   end case;

   Build_Switches := ();
   case Build_Mode is
      when "optimize" =>
         Build_Switches := ("-O3",     -- Optimization
                            "-gnatn"); -- Enable inlining
      when "debug" =>
         Build_Switches := ("-g",   -- Debug info
                            "-Og"); -- No optimization
   end case;

   package Compiler is
      for Default_Switches ("Ada") use
        Compile_Checks_Switches &
        Build_Switches &
        Runtime_Checks_Switches &
        Style_Checks_Switches &
        Contracts_Switches &
        ("-gnatw.X", -- Disable warnings for No_Exception_Propagation
         "-gnatQ");  -- Don't quit. Generate ALI and tree files even if illegalities
   end Compiler;

   package Binder is
      for Switches ("Ada") use ("-Es"); --  Symbolic traceback
   end Binder;

end Libbullet;
