当一个 makefile 调用自己时
test :
@ mv $(BIN_SRC) $(BIN_SCR_TMP)
@ mv $(BIN_TEST_SRC) $(BIN_TEST_SRC_TMP)
@ make runtest
@ mv $(BIN_SCR_TMP) $(BIN_SRC)
@ mv $(BIN_TEST_SRC_TMP) $(BIN_TEST_SRC)
runtest : $(OBJS) $(LIB)
g++ -o $(TEST_BIN_FILE) $(OBJS) $(LIB)
@ chmod ugo+x $(TEST_BIN_FILE)
$(TEST_BIN_FILE)
Run Code Online (Sandbox Code Playgroud)
然后运行make test它会将其打印到终端:
make test
make[1]: Entering directory `/users/home2/admin/stringha/cs240/webcrawler'
g++ -o bin/webcrawler-tests obj/URL.o obj/webcrawler-tests.o lib/libcs240utils.a bin/webcrawler-tests
Hello webcrawler test!
make[1]: Leaving directory `/users/home2/admin/stringha/cs240/webcrawler'
Run Code Online (Sandbox Code Playgroud)
我想知道如何使它不打印出线条
make[1]: Entering directory `/users/home2/admin/stringha/cs240/webcrawler'
Run Code Online (Sandbox Code Playgroud)
和
make[1]: Leaving directory `/users/home2/admin/stringha/cs240/webcrawler'
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有一个主内核模块,其他内核模块与之通信.我已经构建了这样的模块(概念上):
main module/
|
\drivers/
|
|\driver1
|\driver2
\driver3
Run Code Online (Sandbox Code Playgroud)
由于这些是内核模块,我需要像这样编译它们:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
Run Code Online (Sandbox Code Playgroud)
但是,由于可以从以前的目录调用驱动程序的Makefile,我需要$(shell pwd)在调用其他make之前执行(linux的make).所以Makefile现在看起来像这样:
CURRENT_DIR := $(shell pwd)
.PHONY: all
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(CURRENT_DIR) modules
Run Code Online (Sandbox Code Playgroud)
到目前为止它很好,它完美地工作.问题是:我有一个驱动程序需要包含的文件,所以我必须给出包含路径.我第一次尝试
EXTRA_CFLAGS += -I../..
Run Code Online (Sandbox Code Playgroud)
并立即明白为什么它不起作用(相对路径将是/ lib/module/...不是当前目录).所以我改成了:
MAIN_MODULE_HOME := $(CURRENT_DIR)/../..
EXTRA_CFLAGS += -I$(MAIN_MODULE_HOME)
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这不起作用!如果我写
EXTRA_CFLAGS += -Ipath/I/get/from/pwd/../..
Run Code Online (Sandbox Code Playgroud)
手动,它编译!谁能解释我做错了什么?在调用make之前,我echo编辑$(CURRENT_DIR)并且$(MAIN_MODULE_HOME)变量是有意义的.
我知道,EXTRA_CFLAGS是不是马上进行评估,但由于CURRENT_DIR和MAIN_MODULE_HOME与声明:=我不明白事情是如何得到搞砸.
(如果有人能更好地说出问题标题,请做!)
我希望通过这个小脚本总结出我想要实现的目标.
DIRS = dir1 dir2 dir3 dir4 ...
OBJS =
all: GENERATE_OBJECT_FILES
GENERATE_OBJECT_FILES:
for curr_dir in $(DIRS); \
do \
$(join $(OBJS), `ls $${curr_dir}/*.o`); \
done
echo $(OBJS);
Run Code Online (Sandbox Code Playgroud)
如何使用Makefile中的脚本完成此操作?
我的源文件不在我需要做的一个目录中 ../ 或 ../../ 东西。
之后,我需要更改源文件名,例如: ../ex/test.c to obj/test.o
用这个: 命令:
$(OBJDIR) $(notdir $(SOURCECODE:.c=.o))
Run Code Online (Sandbox Code Playgroud)
然而,只有$(SOURCECODE)( ../ex/test.c) 中的第一个文件名被正确重命名为 obj/test.o,其余的看起来都像*.o,没有目录信息。
如何在Makefile中构建目标之前执行shell脚本,并在运行时查看输出?
我有一个调用的脚本prepare.sh生成一堆.pyx文件..pyx文件是我的构建过程涉及make的起点.它来自.pyx - > .c - > .o - > .so
我不喜欢在make之前单独运行prepare.sh.我想让它为我运行它.
我让它工作,但我没有看到命令的输出.我想看看它.这就是我现在拥有的:
PATH := ${PYTHONHOME}/bin:${PATH}
NOTHING:=$(shell ./prepare.sh)
PYXS?=$(wildcard merged/*.pyx)
SOURCES=$(PYXS:.pyx=.c)
OBJECTS=$(SOURCES:.c=.o)
SOBJECTS=$(OBJECTS:.o=.so)
Run Code Online (Sandbox Code Playgroud) 我遇到了一个简单的问题.
这是我的Android.mk:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libandroidgameengine
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include/ \
$(LOCAL_PATH)/../interface/ \
$(LOCAL_PATH)/../include/Render \
$(LOCAL_PATH)/../include/Utils
LOCAL_SRC_FILES := # Core
../src/Engine.cpp \
# Rendering
../src/Render/RenderManagerImpl.cpp \
# Utils
../src/Utils/LogManagerImpl.cpp \
# Memory
../src/Memory/MemoryManagerImpl.cpp \
../src/Memory/malloc.c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_CFLAGS := -DSTRUCT_MALLINFO_DECLARED
LOCAL_LDLIBS := -lGLESv2 -llog
Run Code Online (Sandbox Code Playgroud)
我一直得到"Android.mk:11 *命令在第一个目标之前开始"错误.我知道它与我构造源文件的方式有关(使用主题标签来表示引擎的特定部分)但我不明白它实际上应该是什么样子.任何提示?包含$(BUILD_STATIC_LIBRARY)
我正在尝试使用带有makefile的GNUplot生成一些图形.我希望目录中的每个*.plt文件都可以通过GNUplot运行,但是我看不到让它工作.到目前为止,这是我的makefile:
all: %.tex
%.tex: %.plt
<tab> gnuplot < $<
Run Code Online (Sandbox Code Playgroud)
如果我单独指定一个.plt文件,配方工作正常,但我希望它在我生成它们时拾取我的新图.
编辑:我想我现在已经开始工作了:
# plots all files in the folder with .plt extensions
SOURCES = $(wildcard *.plt)
TARGETS = $(SOURCES:.plt=.tex)
all: $(TARGETS)
%.tex: %.plt
gnuplot < $<
Run Code Online (Sandbox Code Playgroud)
有人可以确认我的推理(如下)是否正确?以前我没有指定任何文件all(我有点困惑%).现在SOURCES通过使用通配符拾取任何.plt文件来分配变量(为什么在使用.plt而不是*.plt?时它不起作用).分配后SOURCE,设置TARGETS变量,现在all:指定要构建的文件.现在运行匹配规则.