Не уверен, что вам понравится этот хакерский трюк, но вы можете использовать преобразование синтаксического анализа.
Давайте сначала определим модуль базового преобразования:
-module(erts_v).
-export([parse_transform/2]).
parse_transform(AST, _Opts) ->
io:format("~p~n", [AST]).
Скомпилируйте его, затем вы можете включить оба заголовка в модуль, для которого вы хотите, чтобы это работало. Это должно дать следующее:
-module(test).
-compile({parse_transform, erts_v}).
-include_lib("inets/src/httpd.hrl").
-include_lib("inets/src/http_server/httpd.hrl").
-export([fake_fun/1]).
fake_fun(A) -> A.
Если вы работаете на R14B и скомпилируете его, у вас должен быть абстрактный формат модуля, похожий на этот:
[{attribute,1,file,{"./test.erl",1}},
{attribute,1,module,test},
{error,{3,epp,{include,lib,"inets/src/httpd.hrl"}}},
{attribute,1,file,
{"/usr/local/lib/erlang/lib/inets-5.5/src/http_server/httpd.hrl",1}},
{attribute,1,file,
{"/usr/local/lib/erlang/lib/kernel-2.14.1/include/file.hrl",1}},
{attribute,24,record,
{file_info,
[{record_field,25,{atom,25,size}},
{record_field,26,{atom,26,type}},
...
Что это говорит нам о том, что мы можем использовать оба заголовка, и правильный будет автоматически включен, в то время как другой выдаст ошибку. Все, что нам нужно сделать, это удалить кортеж {error,...}
и получить работающую компиляцию. Для этого исправьте модуль parse_transform, чтобы он выглядел так:
-module(erts_v).
-export([parse_transform/2]).
parse_transform(AST, _Opts) ->
walk_ast(AST).
walk_ast([{error,{_,epp,{include,lib,"inets/src/httpd.hrl"}}}|AST]) ->
AST;
walk_ast([{error,{_,epp,{include,lib,"inets/src/http_server/httpd.hrl"}}}|AST]) ->
AST;
walk_ast([H|T]) ->
[H|walk_ast(T)].
Это затем удалит ошибку include, только если он находится на том модуле, который вы хотели. Другие беспорядочные включения должны потерпеть неудачу как обычно.
Я не проверял это на всех версиях, поэтому, если поведение между ними изменилось, это не сработает. С другой стороны, если он остался прежним, это parse_transform будет независимым от версии, за счет необходимости упорядочить порядок компиляции ваших модулей, что достаточно просто с Emakefiles и rebar.