代码之家  ›  专栏  ›  技术社区  ›  1Teaches2Learn

如何确定makefile链中的哪个makefile正在覆盖变量?

  •  2
  • 1Teaches2Learn  · 技术社区  · 2 年前

    我想知道当试图“制作”我的程序时,如何找出变量被覆盖的位置。以下是编译器错误:

    Loading /home/tyler/Software/Cpp/Cpp_Libraries/PelePhysics/Submodules/amrex/Tools/GNUMake/comps/gnu.mak...
    Loading /home/tyler/Software/Cpp/Cpp_Libraries/PelePhysics/Submodules/amrex/Tools/GNUMake/sites/Make.unknown...
    Loading /home/tyler/Software/Cpp/Cpp_Libraries/PelePhysics/Submodules/amrex/Tools/GNUMake/packages/Make.sundials...
    make: /home/tyler/Software/Cpp/Cpp_Libraries/PelePhysics/Submodules/amrex/Tools/F_scripts/findparams.py: No such file or directory
    make: Warning: File 'tmp_build_dir/o/2d.gnu.EXE/AMReX_buildInfo.d' has modification time 26084 s in the future
    make: *** No rule to make target '/Users/tfara/amrex/Src/Extern/SUNDIALS/AMReX_NVector_MultiFab.cpp', needed by 'tmp_build_dir/o/2d.gnu.EXE/AMReX_NVector_MultiFab.o'.  Stop.
    

    我相信我可以准确地告诉你问题所在:我以前处理过这段软件,在那台机器上,一个名为 AMREX_HOME 设置为 /Users/tfara/amrex/ 。现在我在另一台机器上 AMREX_HOME 应设置为 /home/tyler/Software/Cpp/Cpp_Libraries/PelePhysics/Submodules/amrex/ 。问题是,PelePhysics和AMREX程序是巨大的、专业开发的程序包,当它们被制作出来时,会包含一个巨大的中间makefile链,我无法完全理解。

    因此,您可以从编译器错误中看到,前三个“加载”使用了正确的 AMREX_HOME 变量这是因为我在自己的makefile中设置了该变量。但在这一过程中的某个地方 AMREX_HOME 变量被覆盖。我想让编译器告诉我谁在试图生成目标 /Users/tfara/amrex/Src/Extern/(etc) 这样我就可以转到那个makefile并适当地更新路径变量。

    1 回复  |  直到 2 年前
        1
  •  2
  •   Maxim Egorushkin    2 年前

    这个 .d 时间戳警告表明您将源目录和构建工件一起复制到 tmp_build_dir 在新机器上。您的makefile最终包括自动生成的头依赖项 d 来自该构建目录的文件, d 文件包含生成这些文件的计算机上头文件的路径,而这些路径与您的新构建环境不匹配。

    要解决此问题,请执行以下操作之一:

    • 移除所有这些构建人工制品。 make clean 通常应该这样做,否则 rm -rf tmp_build_dir 非常坚固。
    • 仅删除 d 文件,并保留其余的构建人工制品 find tmp_build_dir -name '*.d' -delete 。不过,其他构建人工制品可能仍然包含来自原始构建环境的完整路径。