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)但是这个罢工我应该做的事情,我说我可以看到它为什么不需要它(命名同一文件的不同方式)。
答案 0 :(得分:1)
没有像这样的GNU make函数,也没有任何简单的方法来使用make函数。最简单的方法是让编译器首先不生成这些类型的路径。
我怀疑,虽然您没有提供足够的信息来确定,但$(INCLUDES)
变量的值包含的值-Isrc/Thing/listeners/..
(至少在扩展后)。您应该修改这些变量的设置,以便不使用/..
附加到目录的末尾,而是使用GNU make函数($(notdir ...)
)去除最后一个目录。那么这些路径就是-Isrc/Thing
,例如,你就不会有..
。