首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ifdef和ifndef指令

使用ifdef和ifndef指令
EN

Stack Overflow用户
提问于 2013-01-13 11:07:25
回答 1查看 13.9K关注 0票数 2

我试图检查一个变量是否使用ifndef/ifdef定义,但是我一直从执行中得到一个not found错误。我正在使用GNU Make 3.81,下面是我所拥有内容的一个片段:

代码语言:javascript
复制
all: _images                 
    $(call clean, .)         
    $(call compile, .)       
    @$(OPENER) *.pdf &       

_images:                     
    $(call clean, "images")  
    $(call compile, "images")

define clean                                             
    @rm -f ${1}/*.log ${1}/*.aux ${1}/*.pdf              
endef                                                    

define compile                                           

    ifdef ${1}                                           
        dir = ${1}                                       
    else                                                 
        dir = .                                          
    endif                                                

    ifdef ${2}                                           
        outdir = ${2}                                    
    else                                                 
        outdir = ${1}                                    
    endif                                                

    @$(COMPILER) -output-directory ${outdir} ${dir}/*.tex

endef                                                    

而准确的错误是:

代码语言:javascript
复制
$ make                       
ifdef  "images"              
/bin/sh: 1: ifdef: not found 
make: *** [_images] Error 127

编辑

考虑到Barmar的评论,结论如下:

定义的内容是shell命令行,而不是指令;要在定义块内中断命令行,必须转义行符--而且,对应于一行命令的每个块分别执行,每个块在不同的shell执行中执行,这意味着,如果要在下一个一行程序块中访问变量值,则定义局部变量将无法工作。

谢谢你的好意。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-13 13:20:15

您可以将shell的功能与Make结合起来,以获得一个相当简洁的定义。

代码语言:javascript
复制
define compile
        @dir="${1}"; outdir="${2}"; outdir=$${outdir:-"$dir"}; \
        $(COMPILER) -output-directory "$${outdir}" "$${dir:-.}/*.tex

双美元是一种逃逸,它将一美元符号传递给空壳.构造${variable:-value}返回$variable的值,除非它是未设置或空的,在这种情况下,它返回value。由于${1}${2}在shell计算此表达式之前被静态字符串替换,所以在检查它们之前,我们必须采取将它们赋值给变量的迂回路线。

这还演示了如何将两个“一行程序”合并到单个shell调用中。分号是语句终止符(基本上相当于换行符),反斜杠和换行符的序列将使下一行与当前行合并为单个“逻辑行”。

这是足够复杂的,我建议您省略领先的@,但我留在这里只是为了显示它的归属。如果您想要静默操作,那么一旦您正确地调试了它,就使用make -s运行。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14302846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档