我怎么停止说make: Nothing to be done for 'all'.或或make: 'file' is up to date?我希望我的构建在没有做任何事情时保持沉默 - 还有其他地方echo被调用来跟踪构建进度,所以这个消息只是让事情变得混乱.我目前正在这样沉默:
all: dependency1 dependency2
@:
Run Code Online (Sandbox Code Playgroud)
有些东西告诉我必须有更好的方法.有任何想法吗?
编辑:
但是,当我确实需要构建一些东西时,我想保持命令echo工作.我希望的一个很好的例子是--no-print-directory,但我找不到任何其他标志来关闭所选的消息.
在Beta,Paul R和Sjoerd的帮助下,我一直在重构我的makefile(感谢大家!).
以下是我的STARTING产品:
#Nice, wonderful makefile written by Jason
CC=g++
CFLAGS=-c -Wall
BASE_DIR:=.
SOURCE_DIR:=$(BASE_DIR)/source
BUILD_DIR:=$(BASE_DIR)/build
TEST_DIR:=$(BASE_DIR)/build/tests
MAKEFILE_DIR:=$(BASE_DIR)/makefiles
DATA_DIR:=$(BASE_DIR)/data
DATA_DIR_TESTS:=$(DATA_DIR)/tests
MOLECULE_UT_SOURCES := $(SOURCE_DIR)/molecule_test/main.cc \
$(SOURCE_DIR)/molecule_manager.h \
$(SOURCE_DIR)/molecule_manager.cpp \
$(SOURCE_DIR)/molecule_manager_main.h \
$(SOURCE_DIR)/molecule_manager_main.cpp \
$(SOURCE_DIR)/molecule_reader.h \
$(SOURCE_DIR)/molecule_reader.cpp \
$(SOURCE_DIR)/molecule_reader_psf_pdb.h \
$(SOURCE_DIR)/molecule_reader_psf_pdb.cpp \
$(SOURCE_DIR)/parameter_manager_lj_molecule.h \
$(SOURCE_DIR)/parameter_manager_lj_molecule.cpp \
$(SOURCE_DIR)/parameter_manager.h \
$(SOURCE_DIR)/parameter_manager.cpp \
$(SOURCE_DIR)/parser.h \
$(SOURCE_DIR)/parser.cpp \
$(SOURCE_DIR)/common.h
MOLECULE_UT_DATA := \
$(DATA_DIR_TESTS)/molecule_test/par_oxalate_and_friends.inp \
$(DATA_DIR_TESTS)/molecule_test/dicarboxy-octane_4.pdb \
$(DATA_DIR_TESTS)/molecule_test/dicarboxy-octane_4.psf
PARAM_UT_SOURCES := $(SOURCE_DIR)/parameter_test/main.cc \
$(SOURCE_DIR)/parameter_manager_lj_molecule.h \
$(SOURCE_DIR)/parameter_manager_lj_molecule.cpp \
$(SOURCE_DIR)/parameter_manager.h \
$(SOURCE_DIR)/parameter_manager.cpp \
$(SOURCE_DIR)/parser.h \
$(SOURCE_DIR)/parser.cpp \
$(SOURCE_DIR)/common.h
PARAM_UT_DATA := $(DATA_DIR_TESTS)/molecule_test/par_oxalate_and_friends.inp …Run Code Online (Sandbox Code Playgroud) 引用有什么不同吗?
libmylib.a: ...
$(AR) $(ARFLAGS) $@ $?
# vs
libmylib.a: ...
"$(AR) $(ARFLAGS) $@ $?"
@echo Compiler: $(CXX)
# vs
@echo "Compiler: $(CXX)"
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有一个makefile,它使用$(info)函数调用向用户显示一些信息.但是,makefile还包括通过更新自动生成的依赖项文件gcc -M.每当需要重新创建这样的依赖项时,GNU Make会再次重新编译所有内容,从而复制使用$(info)和类似调用生成的输出.
有没有办法确定GNU Make是否在makefile中执行第一个或第二个这样的传递,以避免重复$(info)行?
我正在使用GNUmake从源目录生成某些Web内容的部署版本.我想成为通过压缩工具运行一些文件的规则(例如YUI压缩器),然后对于没有规则的任何东西,只需复制它.
例如:
# Rule with all the $(WWW_OUT_DIR)/*.* files as a prerequisite
all: $(WWW_OUT_FILES)
# Generic rule to perform compression on Javascript files.
$(WWW_OUT_DIR)/%.js: $(WWW_SRC_DIR)/%.js
$(YUI_COMP) $(YUI_COMP_OPTS) $< > $@
# Generic rule to perform compression on CSS files.
$(WWW_OUT_DIR)/%.css: $(WWW_SRC_DIR)/%.css
$(YUI_COMP) $(YUI_COMP_OPTS) $< > $@
# TDB Rule to magically handle everything else? (This doesn't work)
$(WWW_OUT_DIR)/%.%: $(WWW_SRC_DIR)/%.%
cp $< $@
Run Code Online (Sandbox Code Playgroud)
我如何完成最后一条规则试图做的事情?即对于$(WWW_OUT_FILES)中不是.js或.css的所有内容,只需复制它?如果可能,我想保留对相应输入文件的依赖.
我在我正在修改的Makefile中遇到了这个语法:
some_target: ;
another_target: ...
Run Code Online (Sandbox Code Playgroud)
分号在这种情况下意味着什么?
如何使用gnu-make从传递给用户定义函数的参数中去除前导空格?
例如:
define FOO
# --- some build rules
# run the built target
/home/user/dir/bin/$(1)
endef
Run Code Online (Sandbox Code Playgroud)
以下调用正常,因为没有前导空格:
$(eval $(call FOO,my_test ) )
Run Code Online (Sandbox Code Playgroud)
不幸的是,以下失败,因为$(1)有一个领先的空间
$(eval $(call FOO, my_test ) )
^
Additional space to 'prettier' formatting
Run Code Online (Sandbox Code Playgroud)
这最终扩展到:
/home/user/dir/bin/ $(1)
^
Leading whitespace
Run Code Online (Sandbox Code Playgroud)
如何从传递给用户定义函数的参数中去除前导空格?
这样做是不好的形式还是我应该简单地假设参数是在没有前导空格的情况下传递的?
我有一些生成的GNUmakefiles,我需要从中提取变量的值.
是否有一种简单的方法可以在不修改makefile的情况下查看变量的值?
仅供参考,变量包含emacs c-macro-expand功能所需的一些包含文件的路径.
我已经阅读了Linux Makefile:
$(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
$(Q)@:
Run Code Online (Sandbox Code Playgroud)
“ $(Q)@:”是什么意思?
我正在尝试使用google进行搜索,但如果搜索使用某些奇怪的字符,则google总是会崩溃。所以最后我找不到任何有关它的手册。
由于未知原因,GNU Make不能为我完成这项工作.我有这个MAKE文件,我确实为每个食谱,我使用标签,而不是空间.但是我看着它,我无法发现会导致错误信息的任何地方.
操作系统:Ubuntu 17.10/GNU Make:4.1/GCC:交叉编译到i686-elf-gcc.
运行它:make(在同一目录中)给我
make: *** No rule to make target '%.o', needed by 'kernel.elf'. Stop.
Run Code Online (Sandbox Code Playgroud)
我有一个bash脚本,完全相同的东西,它就像魅力一样.谁能说出我做错了什么?
Makefile文件:
NASM=nasm
QEMU=qemu-system-i386
GCC=~/opt/cross/bin/i686-elf-gcc
CFLAGS=-std=c11 -ffreestanding -Wall -Wextra -Werror -masm=intel -g -O0
ASFLAGS=-felf32 -g
.PHONY: all clean
all:boot.iso
%.o : %.c
$(GCC) -c $< $(CFLAGS) -o $@
%.so : %.asm
$(NASM) $(ASFLAGS) -o $@ $<
kernel.elf : %.o
$(GCC) -T link.ld -o $@ -ffreestanding -O0 -nostdlib -lgcc --verbose $^
grub-file --is-x86-multiboot2 kernel.elf
boot.iso : kernel.elf grub.cfg
mkdir -p ./iso/boot/grub
cp kernel.elf …Run Code Online (Sandbox Code Playgroud)