对于那些从源代码编译过来的人来说,知道运行"./configure"只是为了找到那个X库还是丢失了多少痛苦,最糟糕的是它吐出了一条愚蠢的行,说缺少一个神秘的lib文件,你就可以了必须转到丢失文件中的网络浏览器类型,谷歌可以为您找到答案...
我觉得这很重复,所以我的问题是:
有没有办法解决所有必需的依赖项,但没有做"./configure"
我有一个变量,其中包含不同目录中的先决条件列表,每个目录由相对路径指定.例如:
HTML_FILES := ../foo1/bar1.html ../foo1/bar2.html ../foo2/bar3.html foo3/bar4.html
Run Code Online (Sandbox Code Playgroud)
(请注意,实际生成了此变量,因此事先不知道文件夹的完整列表.)
对于其中的每一个,我想在当前目录中生成目标文件,例如bar1.xml, bar2.xml, bar3.xml, bar4.xml.
如何编写符合此规则的规则?这就像我来的那样近.这似乎是魔术的地方?????? 可能会做的伎俩.
build: $(XML_FILES)
$(XML_FILES): %.xml : ??????/%.html
perl $(HTML_TO_XML) $<
Run Code Online (Sandbox Code Playgroud) 我有一个gnu Makefile,它通过环境变量收集版本信息.现在,我想在使用gnumake语法构建任何目标之前全局地做"某事".作为伪代码,这意味着:
我试过这个:
$(shell if exist $(subst /,\,$(products)filenames.h) del /F/Q $(subst /,\,$(products)filenames.h))
$(foreach Item, $(EnvFilenames), @echo $(Item) >> $(subst /,\,$(products)filenames.h))
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误:
C:\temp\Makefile.mak:72: *** missing separator. Stop.
Run Code Online (Sandbox Code Playgroud)
其中第72 $(shell ...行是该行.如果我把它放在一个define部分:
define foobar
$(shell if exist $(subst /,\,$(products)filenames.h) del /F/Q $(subst /,\,$(products)filenames.h))
$(foreach Item, $(EnvFilenames), @echo $(Item) >> $(subst /,\,$(products)filenames.h))
endef
Run Code Online (Sandbox Code Playgroud)
并将其称为目标,运行正常:
$(products)$test.o : test.c $(commons)
$(call foobar)
$(cc) $(cflags_m) test.c -o$@
Run Code Online (Sandbox Code Playgroud)
它应该做什么......但是一旦我想从另一个内部调用它define,它就会再次失败,并且会丢失一个分离器.
它是什么意思,我该如何解决?
编译在Win32平台上进行,不必是多平台的.
gdb mi和gdb服务器有什么区别?两者都可以用于本地调试吗?
我在使用Red Hat上的gdb服务器进行调试时遇到了问题.调试启动器停止在72%.
我正在尝试创建一个Makefile,它将编译驻留在目录中的terminfo文件tic.tic还会将其自动创建的termcap文件复制到系统或用户特定的目标文件夹.对于常规用户,如果terminfo文件是例如screen-256color-bce-s.terminfo,则将其编译并复制到~/.terminfo/s/screen-256color-bce-s.所以它看起来像这样:
terminfo/screen-256color-bce-s.terminfo => /home/user/.terminfo/s/screen-256color-bce-s
terminfo/screen-256color-s.terminfo => /home/user/.terminfo/s/screen-256color-s
Run Code Online (Sandbox Code Playgroud)
如果我把这样的东西放到我的Makefile中:
TISRC = $(wildcard terminfo/*.terminfo)
TIDST = $(foreach x, $(TISRC), $(HOME)/.terminfo/$(shell basename $x|cut -c 1)/$(shell basename $x .terminfo))
$(HOME)/.terminfo/s/%: terminfo/%.terminfo
@echo "$< => $@"
@tic $<
install: $(TIDST)
Run Code Online (Sandbox Code Playgroud)
有用.但是,我想使它一般,并在目标中使用通配符,即:
$(HOME)/.terminfo/**/%: terminfo/%.terminfo
@echo "$< => $@"
@tic $<
Run Code Online (Sandbox Code Playgroud)
能够将terminfo文件添加到我的本地存储库.但是,上述方法不起作用.如何在模式规则中指定通配符目录?
我在Makefile(GNU)中使用sub-make.但是,只要sub-make失败,主make就会继续成功运行.每当我的子make失败时,我希望我的主Makefile失败.我怎么做?
all:
pushd ${STA_DIR};make clean;make ARGS=${A1},${A2};popd
Run Code Online (Sandbox Code Playgroud)
每当STA_DIR中的make失败时,主make就不会停止.我想主要制作停止.
我有一个关于Makefile中变量范围的问题.
我有几个目标,所有目标都执行相同的命令,但命令的某些参数需要根据目标进行更改.
为了尝试消除冗余,我试图重构这些目标,以便每个目标只是设置一些变量,然后稍后调用一个使用这些变量的通用目标.
例如,
target1:
COMMAND="../bin/release/prog1 input"
TITLE=PROG1
OUTFILE=PROG1.pdf
make targetN
target2:
COMMAND="../bin/release/prog2 input"
TITLE=PROG2
OUTFILE=PROG2.pdf
make targetN
..
..
targetN:
$(COMMAND) | grep RESULTS > results.csv
gnuplot -e "TITLE=$(TITLE)" prog.plot
...
..
Run Code Online (Sandbox Code Playgroud)
这里target1和target2设置它们的"特定于目标"的变量,然后调用targetN.目的是targetN然后使用这些变量并使用它们运行常规命令.
问题:targetN没有看到在target1和/或target2中设置的这些变量的值.任何人都可以对此有所了解吗?我试图搜索有关目标范围的信息,但没有找到任何有用的信息.也许这个问题与范围无关,而且是一个完全不同的问题.
关于如何完成我想用这个方案实现的任何建议?
谢谢!
所以这是我正在使用的回购:https://github.com/Garuda1/unixlib
我想知道我编译的lib(unixlib.a)和我的header(unixlib.h)应该在哪里,以便能够使用lib(在Linux-x86或Linux-x86_64下),只需编译:
$ gcc my_source.c -lunixlib
Run Code Online (Sandbox Code Playgroud)
并包括标题my_source.c.
我想我添加这样做Makefile:
install:
mv $(NAME).a $(LIB_PATH)
mv unixlib.h $(HEADER_PATH)
Run Code Online (Sandbox Code Playgroud)
但我不知道是什么$(LIB_PATH),并$(HEADER_PATH)有...
我正在制作一个超级简单的NASM x86_64装配程序 mytest.asm
BITS 64
GLOBAL _start
SECTION .text
_start:
mov rax, 60 ; 'exit' system call
mov rdi, 42 ; exit with error code 42
syscall
Run Code Online (Sandbox Code Playgroud)
所有这个程序都以状态42退出.我为它做了一个非常简单的Makefile,
AS=nasm
ASFLAGS=-f elf64
.PHONY: all
all: mytest
%.o : %.asm
$(AS) $(ASFLAGS) -o "$@" "$<"
% : %.o
$(LD) $(LDFLAGS) -o "$@" "$<"
Run Code Online (Sandbox Code Playgroud)
执行时,这很好,
nasm -f elf64 -o "mytest.o" "mytest.asm"
ld -m elf_x86_64 -o "mytest" "mytest.o"
rm mytest.o
Run Code Online (Sandbox Code Playgroud)
除非有相同名称的文件.c,例如此处mytest.c
// exits with status 66
int main () {
__asm__ …Run Code Online (Sandbox Code Playgroud) 我在尝试着:
.env文件,以便可以访问makeMakefile,将的内容读.env入变量问题是:
make替换我的换行符以解析我的变量的空格。我的正则表达式找到了正确的起点,但包括了.env文件的其余部分,而不是在要提取的值之后停在空白处。我知道当cat我将文件放入变量时,会make去除换行符。来自GNU Make docs:
shell函数执行与大多数shell中反引号('`')相同的功能:它执行命令扩展。这意味着它将shell命令作为参数并求值到命令的输出。对结果进行的唯一处理是将每个换行符(或回车符/换行符对)转换为单个空格。如果有尾随(回车和)换行符,它将被删除。
但是,我无法获得任何正则表达式来提前识别这些空间以提取变量或用另一个字符替换这些空间以帮助提取。
例:
.env:
SSH_CREDENTIALS=path/to/my/key
ANOTHER_VAR=somethingelse
YET_ANOTHER_VAR=yetanothersomething
Run Code Online (Sandbox Code Playgroud)
Makefile:
ENV_FILE_CONTENTS := $(shell cat $(ENV_FILE_PATH) ) # | sed -e 's/[[:space:]]/x/g'
$(info $(ENV_FILE_CONTENTS))
SSH_CREDENTIALS := $(shell echo $(ENV_FILE_CONTENTS) | grep -o -P '(?<=SSH_CREDENTIALS=).*(?=[[:space:]])' )
$(info $(SSH_CREDENTIALS))
SSH_CREDENTIALS := $(shell echo $(ENV_FILE_CONTENTS) | grep -o -P '(?<=SSH_CREDENTIALS=).*(?=\s)' )
$(info $(SSH_CREDENTIALS))
[recipes below]
Run Code Online (Sandbox Code Playgroud)
命令和结果:
$ export …Run Code Online (Sandbox Code Playgroud)