Makefile gnumake,一个类似于Python';s os.path.normpath?

Makefile gnumake,一个类似于Python';s os.path.normpath?,makefile,Makefile,这是完美的 我有一个问题,冗余路径,同一个文件的多个条目,这是相当难看的,它没有造成伤害,但我想摆脱它。正如您将看到的,可以多次指定文件 makefile会自动生成(任何带有DEP的行都会生成一个要包含的makefile),并且有一些自动工具在起作用,代码文件的依赖项(.cpp)是由GCC使用-MM标志生成的,我认为这就是它们进入其中的方式。代码文件的包含相对于该文件位置给出。不管怎样,我很想解决这个问题 alec@ATMain ~/cxxtest $ make CREATING

这是完美的

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

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 $ 
看看:

real和abs path似乎都不是我想要的

正如我所说的,这并不会真正伤害到任何东西,这只是我更愿意看到的东西:

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 "$$"@" >> $@
build/%.d:src/%.cpp | builddir$(监听器:ld=.lo)
@回音“DEP GEN”$<
@echo-n$(dir$@)>$@
@如果$(CXX)$(CXX_标志)$(包括)-MM$<>>$@\
然后是rm$@\
出口1\
fi
@echo“@echo\”编译“$$”@“\”(\”由于更改:“$$”?\”)\”>>$@
@echo“$$”(“前缀”)“$$”(“CXX”)“$$”(CXX_标志)“$$”(包括)-c$<-o“$$”@“>>$@

我希望解决方案适用于“由于更改”行,而不是-MM行。我可以编写一个2行Python脚本来实现这一点,但我宁愿不使用GnuMake之外的东西,除非我必须这样做(我当然可以将这个脚本放在makefile中,让它创建,然后使用它:p),但这让我觉得make应该能够做到,因为我知道为什么它不需要它(命名同一个文件的不同方法)。

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


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

这很容易造成很多伤害。Make是按路径比较目标名称,因此如果您有一个生成的头,但编译器使用不同的路径引用它,Make将无法实现i不应该重做。@JanHudec我不明白你的意思,你的意思是修复它会造成伤害还是不修复它?Make确定目标的年龄并传递到系统功能的路径,系统将“简化”路径,这只是一个视觉问题,修复它不会改变makefile的工作方式。当然,不修复它。系统函数会解析路径,但make不仅会将路径传递给系统函数,还会对它们进行比较。在比较它们时,它不会简化它们。啊,抱歉@JanHudec,如果我说,我们有不同的术语一个makefile可以工作,这意味着它可以重建需要的东西,而不是说为了工作它必须只重建需要的东西,我已经说过我仍然看不到你提到的问题。也许是一个例子?我只是说它不重建需要的东西的情况。假设你有一个规则来生成
config.h
(比如说从
config.h.in
,这是很常见的事情),但编译器将其视为
include/./config.h
。在这种情况下,更改为
config.h.in
不会触发源代码的重建,因为make不知道
include/./config.h
依赖于
config.h.in
,因为
“include/./config.h”!=“config.h”“
虽然它们实际上是同一个文件。很好地发现,我忘记了我有include,以这种方式输入的唯一内容是wxWidgets标志,这是通过CXX_标志,问题来自GCC报告的
-MM
,它是吐出的需求只是GCC在include之前的WD。