Использование yacc (1) с CMake на OpenBSD - PullRequest
0 голосов
/ 25 апреля 2019

Я хочу настроить среду разработки для httpd (8) на OpenBSD с CLion (я использую Удаленный проект в CLion, но это не очень отличается от работы на коробке OpenBSD). Тем не менее, CLion вынуждает меня использовать CMake, и у меня возникают проблемы с переносом Makefile в CMakeLists.txt.

Это Makefile из оригинального репо

#   $OpenBSD: Makefile,v 1.30 2017/07/03 22:21:47 espie Exp $

PROG=       httpd
SRCS=       parse.y
SRCS+=      config.c control.c httpd.c log.c logger.c proc.c
SRCS+=      server.c server_http.c server_file.c server_fcgi.c
MAN=        httpd.8 httpd.conf.5

SRCS+=      patterns.c
MAN+=       patterns.7

LDADD=      -levent -ltls -lssl -lcrypto -lutil
DPADD=      ${LIBEVENT} ${LIBTLS} ${LIBSSL} ${LIBCRYPTO} ${LIBUTIL}
#DEBUG=     -g -DDEBUG=3 -O0
CFLAGS+=    -Wall -I${.CURDIR}
CFLAGS+=    -Wstrict-prototypes -Wmissing-prototypes
CFLAGS+=    -Wmissing-declarations
CFLAGS+=    -Wshadow -Wpointer-arith
CFLAGS+=    -Wsign-compare -Wcast-qual
YFLAGS=

.include <bsd.prog.mk>

Несмотря на загадочный синтаксис, он отлично работает на OpenBSD, и вот вывод

openbsd$ uname -a
OpenBSD openbsd.my.domain 6.4 GENERIC#10 amd64
openbsd$ make
===> httpd
yacc  -o parse.c parse.y
cc -O2 -pipe  -Wall -I/home/nalzok/httpd/httpd -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wpointer-arith -Wsign-compare -Wcast-qual  -MD -MP  -c parse.c
cc -O2 -pipe  -Wall -I/home/nalzok/httpd/httpd -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wpointer-arith -Wsign-compare -Wcast-qual  -MD -MP  -c config.c
cc -O2 -pipe  -Wall -I/home/nalzok/httpd/httpd -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wpointer-arith -Wsign-compare -Wcast-qual  -MD -MP  -c control.c
cc -O2 -pipe  -Wall -I/home/nalzok/httpd/httpd -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wpointer-arith -Wsign-compare -Wcast-qual  -MD -MP  -c httpd.c
cc -O2 -pipe  -Wall -I/home/nalzok/httpd/httpd -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wpointer-arith -Wsign-compare -Wcast-qual  -MD -MP  -c log.c
cc -O2 -pipe  -Wall -I/home/nalzok/httpd/httpd -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wpointer-arith -Wsign-compare -Wcast-qual  -MD -MP  -c logger.c
cc -O2 -pipe  -Wall -I/home/nalzok/httpd/httpd -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wpointer-arith -Wsign-compare -Wcast-qual  -MD -MP  -c proc.c
cc -O2 -pipe  -Wall -I/home/nalzok/httpd/httpd -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wpointer-arith -Wsign-compare -Wcast-qual  -MD -MP  -c server.c
cc -O2 -pipe  -Wall -I/home/nalzok/httpd/httpd -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wpointer-arith -Wsign-compare -Wcast-qual  -MD -MP  -c server_http.c
cc -O2 -pipe  -Wall -I/home/nalzok/httpd/httpd -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wpointer-arith -Wsign-compare -Wcast-qual  -MD -MP  -c server_file.c
cc -O2 -pipe  -Wall -I/home/nalzok/httpd/httpd -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wpointer-arith -Wsign-compare -Wcast-qual  -MD -MP  -c server_fcgi.c
cc -O2 -pipe  -Wall -I/home/nalzok/httpd/httpd -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wpointer-arith -Wsign-compare -Wcast-qual  -MD -MP  -c patterns.c
cc   -o httpd parse.o config.o control.o httpd.o log.o logger.o proc.o server.o server_http.o server_file.o server_fcgi.o patterns.o -levent -ltls -lssl -lcrypto -lutil

Как мудро указал в комментарии @ Цыварев , я должен собрать parse.c из parse.y, прежде чем связать все вместе, чтобы получить исполняемый файл. Среди прочего, bison(1) - популярный инструмент для создания *.c из *.y, поэтому моя попытка выглядит следующим образом. Вы также должны установить bison(1) и передать -DBISON_EXECUTABLE=/usr/local/bin/bison в CMake.

cmake_minimum_required(VERSION 3.10)
project(httpd)

find_package(BISON REQUIRED)
bison_target(parse httpd/parse.y "${CMAKE_CURRENT_BINARY_DIR}/parse.c")

set(CMAKE_C_FLAGS
        "-Wall -Wstrict-prototypes -Wmissing-prototypes"
        "-Wmissing-declarations -Wshadow -Wpointer-arith"
        "-Wsign-compare -Wcast-qual")

add_executable(httpd
        "${CMAKE_CURRENT_BINARY_DIR}/parse.c"
        httpd/config.c httpd/control.c httpd/httpd.c httpd/log.c httpd/logger.c httpd/proc.c
        httpd/server.c httpd/server_http.c httpd/server_file.c httpd/server_fcgi.c
        httpd/patterns.c)
target_link_libraries(httpd event tls ssl crypto util)

Эта проблема в том, что CMake предоставляет только модуль FindBISON для bison(1), но мне действительно нужно вызвать акции OpenBSD yacc(1). Обратите внимание, что эти две утилиты не являются полностью взаимозаменяемыми. Например, yacc не поддерживает флаг --version, тогда как bison поддерживает. Как мне дать команду CMake использовать yacc?

В качестве примечания: этот проект предназначен только для развертывания на OpenBSD, поэтому не стесняйтесь использовать любой непортативный хак.

...