anchor.diff:      Ext = filename:extension(Source),
       filename:rootname(Source, Ext) ++ ".o".
   
  -so_name(Config, AppFile) ->
  +so_specs(Config, AppFile, Bins) ->
       %% Check config to see if a custom so_name has been specified
  -    PortName = case rebar_config:get(Config, so_name, undefined) of
  +    ?INFO("config ~p\n", [Config]),
  +    case rebar_config:get(Config, so_specs, undefined) of
                      undefined ->
                          %% Get the app name, which we'll use to
                          %% generate the linked port driver name
                          case rebar_app_utils:load_app_file(AppFile) of
                              {ok, AppName, _} ->
  -                               lists:concat([AppName, "_drv.so"]);
  +                               SoName = ?FMT("priv/~s", [lists:concat([AppName, "_drv.so"])]),
  +                               [{SoName, Bins}];
                              error ->
                                  ?FAIL
                          end;
  -                   Soname ->
  -                       Soname
  -               end,
  -
  -    %% Construct the driver name
  -    ?FMT("priv/~s", [PortName]).
  +                   SoSpecs -> SoSpecs
  +               end.
  
positive.code: expand_sources([Spec | Rest], Acc) ->
      Acc2 = filelib:wildcard(Spec) ++ Acc,
      expand_sources(Rest, Acc2).
  
  run_precompile_hook(Config, Env) ->
      case rebar_config:get(Config, port_pre_script, undefined) of
  
negative.code:             {NewBins, ExistingBins} = compile_each(Sources, Config, Env, [], []),
  
              %% Construct the driver name and make sure priv/ exists
              SoSpecs = so_specs(Config, AppFile, NewBins ++ ExistingBins),
              ?INFO("Using specs ~p\n", [SoSpecs]),
              lists:foreach(fun({SoName,_}) -> ok = filelib:ensure_dir(SoName) end, SoSpecs),
  
              %% Only relink if necessary, given the SoName and list of new binaries
              lists:foreach(fun({SoName,Bins}) ->
                  case needs_link(SoName, sets:to_list(sets:intersection([sets:from_list(Bins),sets:from_list(NewBins)]))) of
                    true ->
                      rebar_utils:sh_failfast(?FMT("$CC ~s $LDFLAGS $DRV_LDFLAGS -o ~s",
                                                    [string:join(Bins, " "), SoName]), Env);
                    false ->
                      ?INFO("Skipping relink of ~s\n", [SoName]),
                      ok
                  end
                end, SoSpecs)
      end.
  
  clean(Config, AppFile) ->
  