GNU Make,一个类似Python的os.path.normpath的命令?

时间:2014-01-01 06:06:20

标签: makefile

http://docs.python.org/2/library/os.path.html#os.path.normpath是完美的。

我有一个冗余路径的问题,同一个文件的多个条目,它相当不雅观,它没有伤害,但我想摆脱它。正如您将看到的那样,可以多次指定文件。

makefile自己生成(其中包含DEP的任何行正在构建一个包含的makefile)并且有一些自动化工具正在运行,代码文件的依赖关系(.cpp)由GCC生成使用-MM标志,这就是我认为这些进入它的方式。代码文件的包含是相对于该文件位置给出的。无论如何,我想解决这个问题!

alec@ATMain ~/cxxtest $ make 
    CREATING    build
    CREATING    build/Structures
    CREATING    build/Thing
    CREATING    build/Thing/listeners
    CREATING    build/implementations
    LISTENER GEN    src/Thing/thing.listener
    LISTENER    src/Thing/thing.listener
    DEP GEN     src/main.cpp
    DEP GEN     src/implementations/thing.cpp
    COMPILE     build/main.o (Due to changes: src/main.cpp src/Thing/thing.h src/Thing/listeners/ThingChangeEmitter.h src/Thing/listeners/../../Structures/LinkedList.h src/Thing/listeners/../../Structures/List.h src/Thing/listeners/../../Structures/Ptr.h src/Thing/listeners/ThingChangeListener.h src/Thing/listeners/../thing.h src/Structures/LinkedList.h src/Structures/Del.h)
    COMPILE     build/implementations/thing.o (Due to changes: src/implementations/thing.cpp src/implementations/../Thing/listeners/ThingChangeListener.h src/implementations/../Thing/listeners/../thing.h src/implementations/../Thing/listeners/ThingChangeEmitter.h src/implementations/../Thing/listeners/../../Structures/LinkedList.h src/implementations/../Thing/listeners/../../Structures/List.h src/implementations/../Thing/listeners/../../Structures/Ptr.h src/implementations/../Thing/thing.h)
    LINK        A.out
alec@ATMain ~/cxxtest $ touch ./src/Thing/thing.h
alec@ATMain ~/cxxtest $ make 
    COMPILE     build/main.o (Due to changes: src/Thing/thing.h src/Thing/listeners/../thing.h)
    COMPILE     build/implementations/thing.o (Due to changes: src/implementations/../Thing/listeners/../thing.h src/implementations/../Thing/thing.h)
    LINK        A.out
alec@ATMain ~/cxxtest $ 

看: http://www.gnu.org/software/make/manual/html_node/File-Name-Functions.html

真实的和荒谬的道路似乎都没有做我想要的事情

正如我所说,这并没有真正伤害任何东西,这只是我宁愿看到的东西:

build/%.d: src/%.cpp | builddir $(LISTENERDS:.ld=.lo)
    @echo " DEP GEN     "$< 
    @echo -n $(dir $@) > $@
    @if ! $(CXX) $(CXX_FLAGS) $(INCLUDES) -MM $< >> $@; \
    then rm $@; \
    exit 1; \
    fi
    @echo " @echo \"    \"COMPILE\"     \""$$"@""   \"(\"Due to changes: "$$"?\")\"">> $@
    @echo " "$$"("PREFIX")"$$"("CXX")" $$"(CXX_FLAGS)" $$"(INCLUDES) -c $< -o "$$"@" >> $@

我希望解决方案适用于“由于更改”行,而不是-MM之一。我可以写一个2行的Python脚本来做这个,但我宁愿不使用GnuMake之外的东西,除非我必须(我当然可以将这个脚本放在makefile中并让它创建然后使用它:p)但是这个罢工我应该做的事情,我说我可以看到它为什么不需要它(命名同一文件的不同方式)。

1 个答案:

答案 0 :(得分:1)

没有像这样的GNU make函数,也没有任何简单的方法来使用make函数。最简单的方法是让编译器首先不生成这些类型的路径。

我怀疑,虽然您没有提供足够的信息来确定,但$(INCLUDES)变量的值包含的值-Isrc/Thing/listeners/..(至少在扩展后)。您应该修改这些变量的设置,以便不使用/..附加到目录的末尾,而是使用GNU make函数($(notdir ...))去除最后一个目录。那么这些路径就是-Isrc/Thing,例如,你就不会有..