首页 > 解决方案 > 野牛目标的CMake自定义命令

问题描述

我正在尝试将旧的 Autotools 项目转换为 CMake。在其中一个 Makefile 中,有一些使用 lex 和 yacc 的规则。我发现 CMake 有bison_targetflex_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 没有看到readlibreadliblex作为目标:

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.

我哪里错了?

标签: ccmakebisonflex-lexeryacc

解决方案


尽管它的名字,bison_target不创建 CMake目标。它只是add_custom_command()调用变量中列出的输出文件。BISON_<name>_OUTPUT


推荐阅读