【问题标题】:Forcing erl -make to recompile files when macros are changed更改宏时强制 erl -make 重新编译文件
【发布时间】:2010-10-07 11:07:57
【问题描述】:

我尝试做类似于How to make two different source directories in a Makefile output to one bin directory? 的事情,所以我有这些文件(相对于我的项目根目录):

Emakefile:
% EMakefile
% -*- mode: erlang -*-
{["src/*", "src/*/*", "src/*/*/*"],
 [{i, "include"}, {outdir, "ebin"}, debug_info]}.

test/Emakefile:
% EMakefile
% -*- mode: erlang -*-
{["../src/*", "../src/*/*", "../src/*/*/*"],
 [{i, "../include"}, {outdir, "../ebin"}, debug_info, {d, 'TEST'}]}.

Makefile:
EPATH=-pa ebin

all: before_compile
    erl -make

all_test: before_compile
    cd test
    erl -make
    cd ..

before_compile: mk_ebin copy_sqlite create_db copy_config copy_dot_app

test: all_test
    erl -noshell $(EPATH) \
        -s tests run \
        -s init stop
    rm -f ct.db

clean:
    rm -fv ebin/*

... dependencies of before_compile

问题是运行make test 不会重新编译任何已经用make 编译的模块。似乎erl -make 并不关心它们是在没有定义TEST 的情况下编译的,它只是检查模块本身是否比梁文件更旧。如何强制它重新编译(并在不需要时避免重新编译)?

更新:奇怪的是,在make clean 之后立即运行make all_test 时,似乎使用./Emakefile 而不是test/Emakefile:我得到了

Recompile: src/tests
Recompile: src/server_protocol_client

等等。并且没有测试而不是

Recompile: ../src/tests
Recompile: ../src/server_protocol_client

我通过手动执行cd test; erl -make 得到。知道为什么吗?无论如何,我已经通过删除test/Emakefile 并在Makefile 中替换all_test 解决了这个问题:

all_test: before_compile
    erl -noshell -eval "make:all([{d, 'TEST'}])." -s init stop

【问题讨论】:

    标签: erlang makefile


    【解决方案1】:
    all_test: before_compile
        cd test
        erl -make
        cd ..
    

    这是不正确的。每条生产线都产生自己的流程。这样做:

    all_test: before_compile
        cd test; \
        erl -make
    

    【讨论】:

      猜你喜欢
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 2015-07-04
      • 2019-03-25
      • 2012-10-14
      • 1970-01-01
      • 2013-01-09
      相关资源
      最近更新 更多