Exemple #1
0
bool package_init(pass_opt_t* opt)
{
  if(!codegen_init(opt))
    return false;

  // package_add_paths for command line paths has already been done. Here, we
  // append the paths from an optional environment variable, and then the paths
  // that are relative to the compiler location on disk.
  package_add_paths(getenv("PONYPATH"));
  add_exec_dir();

  // Convert all the safe packages to their full paths.
  strlist_t* full_safe = NULL;

  while(safe != NULL)
  {
    const char* path;
    safe = strlist_pop(safe, &path);

    // Lookup (and hence normalise) path.
    path = find_path(NULL, path, NULL);

    if(path == NULL)
    {
      strlist_free(full_safe);
      return false;
    }

    full_safe = strlist_push(full_safe, path);
  }

  safe = full_safe;
  return true;
}
Exemple #2
0
bool package_init(pass_opt_t* opt)
{
  if(!codegen_init(opt))
    return false;

  package_add_paths(getenv("PONYPATH"));
  add_exec_dir();

  // Convert all the safe packages to their full paths.
  strlist_t* full_safe = NULL;

  while(safe != NULL)
  {
    const char* path;
    safe = strlist_pop(safe, &path);

    // Lookup (and hence normalise) path.
    path = find_path(NULL, path);

    if(path == NULL)
    {
      strlist_free(full_safe);
      return false;
    }

    full_safe = strlist_push(full_safe, path);
  }

  safe = full_safe;
  return true;
}
Exemple #3
0
bool package_init(pass_opt_t* opt)
{
  // package_add_paths for command line paths has already been done. Here, we
  // append the paths from an optional environment variable, and then the paths
  // that are relative to the compiler location on disk.
  package_add_paths(getenv("PONYPATH"), opt);
  if(!add_exec_dir(opt))
  {
    errorf(opt->check.errors, NULL, "Error adding package paths relative to ponyc binary location");
    return false;
  }

  // Finally we add OS specific paths.
#ifdef PLATFORM_IS_POSIX_BASED
  add_path("/usr/local/lib", opt);
  add_path("/opt/local/lib", opt);
#endif

  // Convert all the safe packages to their full paths.
  strlist_t* full_safe = NULL;
  strlist_t* safe = opt->safe_packages;

  while(safe != NULL)
  {
    const char* path;
    safe = strlist_pop(safe, &path);

    // Lookup (and hence normalise) path.
    path = find_path(NULL, path, NULL, NULL, opt);

    if(path == NULL)
    {
      strlist_free(full_safe);
      strlist_free(safe);
      opt->safe_packages = NULL;
      return false;
    }

    full_safe = strlist_push(full_safe, path);
  }

  opt->safe_packages = full_safe;

  if(opt->simple_builtin)
    package_add_magic_src("builtin", simple_builtin, opt);

  return true;
}
Exemple #4
0
int main(int argc, char* argv[])
{
  stringtab_init();

  pass_opt_t opt;
  pass_opt_init(&opt);

  opt.release = true;
  opt.output = ".";

  ast_setwidth(get_width());
  bool print_program_ast = false;
  bool print_package_ast = false;

  opt_state_t s;
  ponyint_opt_init(args, &s, &argc, argv);

  bool ok = true;
  bool print_usage = false;
  int id;

  while((id = ponyint_opt_next(&s)) != -1)
  {
    switch(id)
    {
      case OPT_VERSION:
        printf("%s [%s] (llvm %s)\n", PONY_VERSION, PONY_BUILD_CONFIG,
          LLVM_VERSION);
        return 0;

      case OPT_DEBUG: opt.release = false; break;
      case OPT_BUILDFLAG: define_build_flag(s.arg_val); break;
      case OPT_STRIP: opt.strip_debug = true; break;
      case OPT_PATHS: package_add_paths(s.arg_val, &opt); break;
      case OPT_OUTPUT: opt.output = s.arg_val; break;
      case OPT_LIBRARY: opt.library = true; break;
      case OPT_RUNTIMEBC: opt.runtimebc = true; break;
      case OPT_PIC: opt.pic = true; break;
      case OPT_DOCS: opt.docs = true; break;

      case OPT_SAFE:
        if(!package_add_safe(s.arg_val, &opt))
          ok = false;
        break;

      case OPT_IEEEMATH: opt.ieee_math = true; break;
      case OPT_CPU: opt.cpu = s.arg_val; break;
      case OPT_FEATURES: opt.features = s.arg_val; break;
      case OPT_TRIPLE: opt.triple = s.arg_val; break;
      case OPT_STATS: opt.print_stats = true; break;
      case OPT_LINK_ARCH: opt.link_arch = s.arg_val; break;
      case OPT_LINKER: opt.linker = s.arg_val; break;

      case OPT_AST: print_program_ast = true; break;
      case OPT_ASTPACKAGE: print_package_ast = true; break;
      case OPT_TRACE: parse_trace(true); break;
      case OPT_WIDTH: ast_setwidth(atoi(s.arg_val)); break;
      case OPT_IMMERR: errors_set_immediate(opt.check.errors, true); break;
      case OPT_VERIFY: opt.verify = true; break;
      case OPT_EXTFUN: opt.extfun = true; break;
      case OPT_FILENAMES: opt.print_filenames = true; break;
      case OPT_CHECKTREE: opt.check_tree = true; break;

      case OPT_BNF: print_grammar(false, true); return 0;
      case OPT_ANTLR: print_grammar(true, true); return 0;
      case OPT_ANTLRRAW: print_grammar(true, false); return 0;

      case OPT_VERBOSE:
        {
          int v = atoi(s.arg_val);
          if (v >= 0 && v <= 4) {
            opt.verbosity = (verbosity_level)v;
          } else {
            ok = false;
          }
        }
        break;

      case OPT_PASSES:
        if(!limit_passes(&opt, s.arg_val))
        {
          ok = false;
          print_usage = true;
        }
        break;

      default: usage(); return -1;
    }
  }

  for(int i = 1; i < argc; i++)
  {
    if(argv[i][0] == '-')
    {
      printf("Unrecognised option: %s\n", argv[i]);
      ok = false;
      print_usage = true;
    }
  }

#if defined(PLATFORM_IS_WINDOWS)
  opt.strip_debug = true;
#endif

  if(!ok)
  {
    errors_print(opt.check.errors);

    if(print_usage)
      usage();

    return -1;
  }

  if(ponyc_init(&opt))
  {
    if(argc == 1)
    {
      ok &= compile_package(".", &opt, print_program_ast, print_package_ast);
    } else {
      for(int i = 1; i < argc; i++)
        ok &= compile_package(argv[i], &opt, print_program_ast,
          print_package_ast);
    }
  }

  if(!ok && errors_get_count(opt.check.errors) == 0)
    printf("Error: internal failure not reported\n");

  ponyc_shutdown(&opt);
  pass_opt_done(&opt);

  return ok ? 0 : -1;
}
Exemple #5
0
int main(int argc, char* argv[])
{
  stringtab_init();

  pass_opt_t opt;
  pass_opt_init(&opt);

  opt.release = true;
  opt.output = ".";

  ast_setwidth(get_width());
  bool print_program_ast = false;
  bool print_package_ast = false;

  opt_state_t s;
  opt_init(args, &s, &argc, argv);

  bool ok = true;
  bool print_usage = false;
  int id;

  while((id = opt_next(&s)) != -1)
  {
    switch(id)
    {
      case OPT_VERSION:
        printf("%s\n", PONY_VERSION);
        return 0;

      case OPT_DEBUG: opt.release = false; break;
      case OPT_BUILDFLAG: define_build_flag(s.arg_val); break;
      case OPT_STRIP: opt.strip_debug = true; break;
      case OPT_PATHS: package_add_paths(s.arg_val); break;
      case OPT_OUTPUT: opt.output = s.arg_val; break;
      case OPT_LIBRARY: opt.library = true; break;
      case OPT_DOCS: opt.docs = true; break;

      case OPT_SAFE:
        if(!package_add_safe(s.arg_val))
          ok = false;
        break;

      case OPT_IEEEMATH: opt.ieee_math = true; break;
      case OPT_CPU: opt.cpu = s.arg_val; break;
      case OPT_FEATURES: opt.features = s.arg_val; break;
      case OPT_TRIPLE: opt.triple = s.arg_val; break;
      case OPT_STATS: opt.print_stats = true; break;

      case OPT_AST: print_program_ast = true; break;
      case OPT_ASTPACKAGE: print_package_ast = true; break;
      case OPT_TRACE: parse_trace(true); break;
      case OPT_WIDTH: ast_setwidth(atoi(s.arg_val)); break;
      case OPT_IMMERR: error_set_immediate(true); break;
      case OPT_VERIFY: opt.verify = true; break;
      case OPT_FILENAMES: opt.print_filenames = true; break;
      case OPT_CHECKTREE: enable_check_tree(true); break;

      case OPT_BNF: print_grammar(false, true); return 0;
      case OPT_ANTLR: print_grammar(true, true); return 0;
      case OPT_ANTLRRAW: print_grammar(true, false); return 0;

      case OPT_PASSES:
        if(!limit_passes(&opt, s.arg_val))
        {
          ok = false;
          print_usage = true;
        }
        break;

      default: usage(); return -1;
    }
  }

  for(int i = 1; i < argc; i++)
  {
    if(argv[i][0] == '-')
    {
      printf("Unrecognised option: %s\n", argv[i]);
      ok = false;
      print_usage = true;
    }
  }

#ifdef PLATFORM_IS_WINDOWS
  opt.strip_debug = true;
#endif

  if(!ok)
  {
    print_errors();

    if(print_usage)
      usage();

    return -1;
  }

  if(package_init(&opt))
  {
    if(argc == 1)
    {
      ok &= compile_package(".", &opt, print_program_ast, print_package_ast);
    } else {
      for(int i = 1; i < argc; i++)
        ok &= compile_package(argv[i], &opt, print_program_ast,
          print_package_ast);
    }
  }

  if(!ok && get_error_count() == 0)
    printf("Error: internal failure not reported\n");

  package_done(&opt);
  pass_opt_done(&opt);
  stringtab_done();

  return ok ? 0 : -1;
}
Exemple #6
0
ponyc_opt_process_t ponyc_opt_process(opt_state_t* s, pass_opt_t* opt,
       /*OUT*/ bool* print_program_ast,
       /*OUT*/ bool* print_package_ast)
{
  ponyc_opt_process_t exit_code = CONTINUE;
  int id;
  *print_program_ast = false;
  *print_package_ast = false;

  exit_code = special_opt_processing(opt);
  if(exit_code != CONTINUE)
    return exit_code;

  bool wants_help = false;

  while((id = ponyint_opt_next(s)) != -1)
  {
    switch(id)
    {
      case OPT_VERSION:
        printf("%s\n", PONY_VERSION_STR);
        printf("Defaults: pic=%s ssl=%s\n", opt->pic ? "true" : "false",
            PONY_DEFAULT_SSL);
        return EXIT_0;

      case OPT_HELP:
        wants_help = true; break;
      case OPT_DEBUG: opt->release = false; break;
      case OPT_BUILDFLAG:
        if(is_openssl_flag(s->arg_val))
        {
          if(validate_openssl_flag(s->arg_val))
          { // User wants to add an openssl_flag,
            // remove any existing openssl_flags.
            remove_build_flags(valid_openssl_flags);
          } else {
            printf("Error: %s is invalid openssl flag, expecting one of:\n",
                s->arg_val);
            for(const char** next=valid_openssl_flags; *next != NULL; next++)
              printf("       %s\n", *next);
            return EXIT_255;
          }
        }
        define_build_flag(s->arg_val);
        break;
      case OPT_STRIP: opt->strip_debug = true; break;
      case OPT_PATHS: package_add_paths(s->arg_val, opt); break;
      case OPT_OUTPUT: opt->output = s->arg_val; break;
      case OPT_BIN_NAME: opt->bin_name = s->arg_val; break;
      case OPT_LIBRARY: opt->library = true; break;
      case OPT_RUNTIMEBC: opt->runtimebc = true; break;
      case OPT_STATIC: opt->staticbin = true; break;
      case OPT_PIC: opt->pic = true; break;
      case OPT_NOPIC: opt->pic = false; break;
      case OPT_DOCS:
        {
          opt->docs = true;
          opt->docs_private = true;
        }
        break;
      case OPT_DOCS_PUBLIC:
        {
          opt->docs = true;
          opt->docs_private = false;
        }
        break;
      case OPT_SAFE:
        if(!package_add_safe(s->arg_val, opt))
        {
          printf("Error adding safe packages: %s\n", s->arg_val);
          exit_code = EXIT_255;
        }
        break;

      case OPT_CPU: opt->cpu = s->arg_val; break;
      case OPT_FEATURES: opt->features = s->arg_val; break;
      case OPT_TRIPLE: opt->triple = s->arg_val; break;
      case OPT_STATS: opt->print_stats = true; break;
      case OPT_LINK_ARCH: opt->link_arch = s->arg_val; break;
      case OPT_LINKER: opt->linker = s->arg_val; break;
      case OPT_PLUGIN:
        if(!plugin_load(opt, s->arg_val))
        {
          printf("Error loading plugins: %s\n", s->arg_val);
          exit_code = EXIT_255;
        }
        break;

      case OPT_AST: *print_program_ast = true; break;
      case OPT_ASTPACKAGE: *print_package_ast = true; break;
      case OPT_TRACE: opt->parse_trace = true; break;
      case OPT_WIDTH: opt->ast_print_width = atoi(s->arg_val); break;
      case OPT_IMMERR: errors_set_immediate(opt->check.errors, true); break;
      case OPT_VERIFY: opt->verify = true; break;
      case OPT_EXTFUN: opt->extfun = true; break;
      case OPT_SIMPLEBUILTIN: opt->simple_builtin = true; break;
      case OPT_FILENAMES: opt->print_filenames = true; break;
      case OPT_CHECKTREE: opt->check_tree = true; break;
      case OPT_LINT_LLVM: opt->lint_llvm = true; break;

      case OPT_BNF: print_grammar(false, true); return EXIT_0;
      case OPT_ANTLR: print_grammar(true, true); return EXIT_0;
      case OPT_ANTLRRAW: print_grammar(true, false); return EXIT_0;

      case OPT_VERBOSE:
        {
          int v = atoi(s->arg_val);
          if(v >= 0 && v <= 4)
          {
            opt->verbosity = (verbosity_level)v;
          } else {
            printf("Verbosity must be 0..4, %d is invalid\n", v);
            exit_code = EXIT_255;
          }
        }
        break;

      case OPT_PASSES:
        if(!limit_passes(opt, s->arg_val))
        {
          printf("Invalid pass=%s it should be one of:\n", s->arg_val);
          print_passes();
          exit_code = EXIT_255;
        }
        break;

      default:
        printf("BUG: unprocessed option id %d\n", id);
        return EXIT_255;
    }
  }

  if(!plugin_parse_options(opt, s->argc, s->argv))
    exit_code = EXIT_255;

  if(wants_help)
  {
    usage();
    plugin_print_help(opt);

    if(exit_code != EXIT_255)
      exit_code = EXIT_0;

    return exit_code;
  }

  for(int i = 1; i < (*s->argc); i++)
  {
    if(s->argv[i][0] == '-')
    {
      printf("Unrecognised option: %s\n", s->argv[i]);
      exit_code = EXIT_255;
    }
  }

  return exit_code;
}