Я хочу настроить среду разработки для 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, поэтому не стесняйтесь использовать любой непортативный хак.