(standard input): No keywords in input file!(udev编译)

需求

在 centos 9 上编译 udev-182 源码。

问题

编译报错: (standard input): No keywords in input file!

[root@root udev-182]# make
  GEN    src/gudev/gudevmarshal.h
INFO: Reading src/gudev/gudevmarshal.list...
  GEN    src/gudev/gudevmarshal.c
INFO: Reading src/gudev/gudevmarshal.list...
  GEN    src/gudev/gudevenumtypes.c
  GEN    src/keymap/keys.txt
  GEN    src/keymap/keys-from-name.gperf
  GEN    src/keymap/keys-from-name.h
(standard input): No keywords in input file!
make: *** [Makefile:3672: src/keymap/keys-from-name.h] Error 1

原因分析

生成src/keymap/keys-from-name.h时报的错,检查Makefile生成keys-from-name.h的地方,也就是报错中说到了 Makefile:3672 行
在这里插入图片描述
把这行稍微改下(如下),$(AM_V_GEN)会取消打印当前命令行,给他跳一行,看下到底执行的是什么命令。

src/keymap/keys-from-name.h: src/keymap/keys-from-name.gperf Makefile
         $(AM_V_GEN)
         $(GPERF) -L ANSI-C -t --ignore-case -N lookup_key -H hash_key_name -p -C < $< > $@

输出结果如下

[root@root udev-182]# make clean && make
....
  GEN    src/keymap/keys.txt
  GEN    src/keymap/keys-from-name.gperf
  GEN    src/keymap/keys-from-name.h
/usr/bin/gperf -L ANSI-C -t --ignore-case -N lookup_key -H hash_key_name -p -C < src/keymap/keys-from-name.gperf > src/keymap/keys-from-name.h
(standard input): No keywords in input file!
make: *** [Makefile:3673: src/keymap/keys-from-name.h] Error 1

手动执行/usr/bin/gperf -L ANSI-C -t --ignore-case -N lookup_key -H hash_key_name -p -C < src/keymap/keys-from-name.gperf,输出确实是空的,看来原因就是 keys-from-name.gperf 没有关键字。

keys-from-name.gperf 也是生成,再看下 Makefile 中 keys-from-name.gperf 文件的生成地方(跟上面截图位置在一块),同样改下代码,看下具体执行的是什么指令。
在这里插入图片描述
gawk 行就是执行了命令,看来是从 src/keymap/keys.txt 读取什么关键字,然后换个格式输出到 src/keymap/keys-from-name.gperf。

[root@root udev-182]# make clean && make
  GEN    src/keymap/keys.txt
  GEN    src/keymap/keys-from-name.gperf
gawk 'BEGIN{ print "struct key { const char* name; unsigned short id; };"; print "%null-strings"; print "%%";} { print $1 ", " $1 }' < src/keymap/keys.txt > src/keymap/keys-from-name.gperf
  GEN    src/keymap/keys-from-name.h
/usr/bin/gperf -L ANSI-C -t --ignore-case -N lookup_key -H hash_key_name -p -C < src/keymap/keys-from-name.gperf > src/keymap/keys-from-name.h
(standard input): No keywords in input file!
make: *** [Makefile:3674: src/keymap/keys-from-name.h] Error 1

查看 src/keymap/keys.txt 发现是空的,那么再看 src/keymap/keys.txt 生成的地方,就是上面截图中的第一个目标,同样改代码,把执行的命令打印出来,发现执行的是 gawk '/^#define.*KEY_[^ ]+[ \t]+[0-9]/ { if ($2 != "KEY_MAX") { print $2 } }' < /usr/include/linux/input.h | sed 's/^KEY_COFFEE$/KEY_SCREENLOCK/' > src/keymap/keys.txt

[root@root udev-182]# make clean && make
  GEN    src/keymap/keys.txt
gawk '/^#define.*KEY_[^ ]+[ \t]+[0-9]/ { if ($2 != "KEY_MAX") { print $2 } }' < /usr/include/linux/input.h | sed 's/^KEY_COFFEE$/KEY_SCREENLOCK/' > src/keymap/keys.txt
  GEN    src/keymap/keys-from-name.gperf
gawk 'BEGIN{ print "struct key { const char* name; unsigned short id; };"; print "%null-strings"; print "%%";} { print $1 ", " $1 }' < src/keymap/keys.txt > src/keymap/keys-from-name.gperf
  GEN    src/keymap/keys-from-name.h
/usr/bin/gperf -L ANSI-C -t --ignore-case -N lookup_key -H hash_key_name -p -C < src/keymap/keys-from-name.gperf > src/keymap/keys-from-name.h
(standard input): No keywords in input file!
make: *** [Makefile:3675: src/keymap/keys-from-name.h] Error 1

看来是从系统文件 /usr/include/linux/input.h 中读取 KEY_ 开头的宏定义,去 /usr/include/linux/input.h 搜索了一下,发现并没这类宏定义,简单看了下代码 KEY_ 开头的宏定义大概是指的按键码字定义,这种东西不可能随便删除,于是猜想,是不是因为内核版本不同(因为我使用的比较新的centos9),定义到了其他头文件。

于是在内核头文件中搜索 #define KEY_MAX (上面的命令中有这个),结果真搜到了

[root@root udev-182]# grep '#define KEY_MAX' -r /usr/include/linux
/usr/include/linux/input-event-codes.h:#define KEY_MAX                  0x2ff

解决办法

问题找到了,那么解决办法也很简单,因为内核版本的原因,Makefile找错了文件,修改一下 Makefile 就行,将 /usr/include/linux/input.h 修改成 /usr/include/linux/input-event-codes.h

src/keymap/keys.txt: $(INCLUDE_PREFIX)/linux/input-event-codes.h
        $(AM_V_at)mkdir -p src/keymap
        $(AM_V_GEN)
        $(AWK) '/^#define.*KEY_[^ ]+[ \t]+[0-9]/ { if ($$2 != "KEY_MAX") { print $$2 } }' < $< | sed 's/^KEY_COFFEE$$/KEY_SCREENLOCK/' > $@

src/keymap/keys-from-name.gperf: src/keymap/keys.txt
        $(AM_V_GEN)
        $(AWK) 'BEGIN{ print "struct key { const char* name; unsigned short id; };"; print "%null-strings"; print "%%";} { print $$1 ", " $$1 }' < $< > $@

src/keymap/keys-from-name.h: src/keymap/keys-from-name.gperf Makefile
        $(AM_V_GEN)
        $(GPERF) -L ANSI-C -t --ignore-case -N lookup_key -H hash_key_name -p -C < $< > $@
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值