V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
amiwrong123
V2EX  ›  Android

请问 make clean 可以根据 target 名来 clean 吗?

  •  
  •   amiwrong123 · 2019-08-26 14:31:49 +08:00 · 12698 次点击
    这是一个创建于 1948 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在不管编译整个项目,还是编译某个模块,都是在项目的根目录执行 make 或者 make targetname。

    但修改某个模块代码后,不想先 make clean 再 make targetname,因为这样不仅删除掉了修改模块生成的文件,而且也删除掉了其他没有变化的模块生成的文件。这样就会花费更多不必要的时间。

    所以,现在想请问各位,有没有办法使得 make clean 可以根据 target 名来 clean ?
    15 条回复    2019-08-27 12:46:17 +08:00
    vitodongdong
        1
    vitodongdong  
       2019-08-26 16:23:39 +08:00
    如果 make 耗时差别不大的话,我觉得没必要根据你说的 target 来 clean
    momocraft
        2
    momocraft  
       2019-08-26 16:30:38 +08:00
    正确使用时 make target 应该不会重新生成不需要的中间文件

    如果不正确则 make 也无从知道 clean target 要做的事的下限(显然删掉所有中间文件是上限)
    forcecharlie
        3
    forcecharlie  
       2019-08-26 16:39:37 +08:00
    添加
    ```makefile
    targetclean:
    -rm some/target/file
    ```

    ```
    make targetclean
    make
    ```

    实际上如果处理好 makefile target 的依赖,是不需要 make clean 再构建的。
    amiwrong123
        4
    amiwrong123  
    OP
       2019-08-26 16:46:28 +08:00
    @vitodongdong
    我这很慢啊,全编得要一晚上==
    amiwrong123
        5
    amiwrong123  
    OP
       2019-08-26 16:50:28 +08:00
    @momocraft
    主要吧,make target 不会把上一次生成的文件做什么处理,但这个可能会造成一些问题(比如链接到某个不应该存在的文件,本来本地编译应该出错的,但却因为这个不应该存在的文件而通过了编译)。

    最笨的就是,去手动删除这个 target 生成的文件。
    amiwrong123
        6
    amiwrong123  
    OP
       2019-08-26 16:53:24 +08:00
    @forcecharlie
    就是相当于 mk 里,执行了 rm 呗。
    刚才试了命令 make clean-targetname,发现好使,可以把 out/target/common 和 out/target/product 里的对应文件夹删除掉
    koebehshian
        7
    koebehshian  
       2019-08-26 19:56:33 +08:00
    @amiwrong123 "make target 不会把上一次生成的文件做什么处理,但这个可能会造成一些问题",
    那说明 Makefile 写得有问题,那只能自己去改 Makefile 文件了
    hardwork
        8
    hardwork  
       2019-08-26 20:22:15 +08:00 via Android
    修改了你直接 make 就可以了,干嘛要先 makeclean?
    想要 make clean target 你自己在 make file 里加规则
    amiwrong123
        9
    amiwrong123  
    OP
       2019-08-26 20:27:15 +08:00
    @koebehshian
    这个有问题指的是,路径有变动。
    比如,原来源文件路径下有 A,B,C 三个文件,对应 out 的某个文件夹下有 A,B,C 三个生成文件。
    现在源文件路径变为了 dict/A,B,C ( dict 文件夹下有三个文件),但对应的 out 的某个文件夹下有 A,B,C,dict/A,B,C.。即没有把上一次生成的在外面的 A,B,C 删除掉,但它们不应该存在。

    这种是 Makefile 写得有问题吗
    zhangfei
        10
    zhangfei  
       2019-08-26 20:31:26 +08:00 via Android
    编译的 ROM 吗?
    Android2MCU
        11
    Android2MCU  
       2019-08-26 21:33:33 +08:00 via iPhone
    mmm module -B 怎么样?
    koebehshian
        12
    koebehshian  
       2019-08-26 22:14:47 +08:00
    @amiwrong123 makefile 的本质是编译脚本,只不过通过比较修改时间,决定需不需要重新编译. makefile 太灵活了, 所以具体用法只有看过 makefile 才明白
    no1xsyzy
        13
    no1xsyzy  
       2019-08-27 09:43:11 +08:00
    @amiwrong123 文件结构都变了就不要指望 make 解决了吧……
    而且你大概是 rm -rf out ?本来这就是偷懒用法,正经办法是
    rm out/A
    rm out/B
    rm out/C
    rm -f out
    因为你不知道除了 ABC 以外是否有一些用户文件在里面
    julyclyde
        14
    julyclyde  
       2019-08-27 12:27:13 +08:00
    clean 就是一个 target
    make clean 并不是一个“神奇的”动作
    SuiXing
        15
    SuiXing  
       2019-08-27 12:46:17 +08:00
    话说 刚开始玩 都不知道怎么圈人啊

    mmm module -B 现在不能用咯

    可以换成 mmma module

    其实签名很多大大都说了 找到对应的额中间文件 rm 了就完事了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4544 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 10:02 · PVG 18:02 · LAX 02:02 · JFK 05:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.