c - 野牛目标的CMake自定义命令
问题描述
我正在尝试将旧的 Autotools 项目转换为 CMake。在其中一个 Makefile 中,有一些使用 lex 和 yacc 的规则。我发现 CMake 有bison_target
和flex_target
. 但是在 Makefile 中有一条规则sed
可以编辑生成的文件。这是Makefile.am
:
docdir = @SIS_DOCDIR@
AM_CPPFLAGS = -DSIS -I../include
AM_YFLAGS = -d
BUILT_SOURCES = readlib.c readlib.h readliblex.c
CLEANFILES = $(BUILT_SOURCES)
noinst_LIBRARIES = libgenlib.a
libgenlib_a_SOURCES = aoi.c com_genlib.c comb.c comb.h count.c genlib.c \
genlib.h genlib_int.h io.c nand.c permute.c sptree.c sptree.h \
readlib.y readliblex.l
dist_doc_DATA = genlib.doc
readlib.h: readlib.c
readlib.c readlib.h: readlib.y
$(YACC) $(YFLAGS) $(AM_YFLAGS) $<
sed 's/yy/GENLIB_yy/g' y.tab.c > readlib.c
sed 's/yy/GENLIB_yy/g' y.tab.h > readlib.h
$(RM) y.tab.c y.tab.h
readliblex.c: readliblex.l readlib.h
$(LEX) $(LFLAGS) $(AM_LFLAGS) $<
sed 's/yy/GENLIB_yy/g' lex.yy.c > readliblex.c
$(RM) lex.yy.c
这就是我翻译它的方式:
set(CMAKE_C_FLAGS -DSIS)
add_library(genlib STATIC
aoi.c
com_genlib.c
comb.c
count.c
genlib.c
io.c
nand.c
permute.c
sptree.c
readlib.y
readliblex.l
)
find_package(BISON)
find_package(FLEX)
bison_target(readlib readlib.y -d)
add_custom_command(TARGET readlib POST_BUILD
COMMAND sed 's/yy/GENLIB_yy/g' y.tab.c > readlib.c
COMMAND sed 's/yy/GENLIB_yy/g' y.tab.h > readlib.h
COMMAND rm -f y.tab.c y.tab.h
)
flex_target(readliblex readliblex.l lex.yy.c)
add_custom_command(TARGET readliblex POST_BUILD
COMMAND sed 's/yy/GENLIB_yy/g' lex.yy.c > readliblex.c
COMMAND rm -f lex.yy.c
)
问题是 CMake 没有看到readlib
和readliblex
作为目标:
CMake Error at sis/genlib/CMakeLists.txt:28 (add_custom_command):
No TARGET 'readlib' has been created in this directory.
CMake Error at sis/genlib/CMakeLists.txt:34 (add_custom_command):
No TARGET 'readliblex' has been created in this directory.
我哪里错了?
解决方案
尽管它的名字,bison_target
不创建 CMake目标。它只是add_custom_command()
调用变量中列出的输出文件。BISON_<name>_OUTPUT
推荐阅读
- oracle - 语句未在 pl/sql 中打印
- go - 互斥锁如何与单例一起使用?
- http - Flutter/Dart http 客户端 - 内容类型标头发送两次
- javascript - 类型 '"account_onboarding"' 不可分配给 typescript nodejs 上的条带 api 中的类型 'Type'.ts
- adaptive-cards - 如何在自适应卡上使用“仅显示时间”
- python - 如何在 Digitalocean 中上传 Django 项目?
- java - 来自 Java 的 PostgreSQL 查询中的可选日期参数不起作用
- html - flex-stretched文本元素(H2)的文本内容的对齐方式
- r - 在这种情况下,错误消息“列名不得重复”是什么意思
- typescript - 为什么 ES2015 模块语法优于自定义 TypeScript 命名空间?