본문 바로가기
리눅스&OS

우분투 20.04에 bison 2.5 설치하기

by developer's warehouse 2024. 1. 14.

이 글에서는 우분투 20.04에 bison 2.5 설치하는 법에 대해서 설명합니다. 

우분투 20.04에 bison 2.5 설치하기 썸네일

우분투 20.04에 bison 2.5 설치하기 


우분투 20.04에 bison 2.5 설치하기 위해서는 gnu에서 bison 소스를 다운받고 컴파일을 합니다. 

아래와 같이 wget으로 다운 받고 컴파일 할 수 있습니다.

% wget http://ftp.gnu.org/gnu/bison/bison-2.5.tar.gz
--2023-09-14 13:49:47-- http://ftp.gnu.org/gnu/bison/bison-2.5.tar.gz
ftp.gnu.org (ftp.gnu.org) 해석 중... 209.51.188.20, 2001:470:142:3::b
다음으로 연결 중: ftp.gnu.org (ftp.gnu.org)|209.51.188.20|:80... 연결했습니다.
HTTP 요청을 보냈습니다. 응답 기다리는 중... 200 OK
길이: 2703110 (2.6M) [application/x-gzip]
저장 위치: ‘bison-2.5.tar.gz’

bison-2.5.tar.gz 100%[===============================================================================>] 2.58M 749KB/s / 3.5s

2023-09-14 13:49:51 (749 KB/s) - ‘bison-2.5.tar.gz’ 저장함 [2703110/2703110]

% ls

bison-2.5.tar.gz


% tar xvzf bison-2.5.tar.gz

% cd bison-2.5/
/home/altibase/pkg/bison-2.5
[altibase-KVM] altibase: ~/pkg/bison-2.5
% ls
ABOUT-NLS ChangeLog Makefile.am OChangeLog THANKS build-aux configure.ac doc lib po tests
AUTHORS GNUmakefile Makefile.in PACKAGING TODO cfg.mk data etc m4 runtime-po
COPYING INSTALL NEWS README aclocal.m4 configure djgpp examples maint.mk src

./configure --prefix=/usr/local/bin/bison-2.5/
make

make를 수행하면 아래의 두 개 에러가 발생합니다.

1. bison 2.5 컴파일 에러

make[3]: Entering directory '/home/altibase/pkg/bison-2.5/lib'
make[4]: Entering directory '/home/altibase/pkg/bison-2.5/lib'
depbase=`echo yyerror.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
gcc -I. -g -O2 -MT yyerror.o -MD -MP -MF $depbase.Tpo -c -o yyerror.o yyerror.c &&\
mv -f $depbase.Tpo $depbase.Po
In file included from yyerror.c:20:
./stdio.h:496:1: error: 'gets' undeclared here (not in a function); did you mean 'fgets'?
496 | _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
| ^~~~~~~~~~~~~~~
make[4]: *** [Makefile:1622: yyerror.o] Error 1
make[4]: Leaving directory '/home/altibase/pkg/bison-2.5/lib'

lib/stdio.h에 들어가서 496라인과 497 라인이 분리되어있어서 발생하는것으로 보이며, 라인을 합쳐줍니다.

/* It is very rare that the developer ever has full control of stdin,
so any use of gets warrants an unconditional warning. Assume it is
always declared, since it is required by C89. */
#undef gets _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");   
<-- 이렇게

2. fseterr.c 에러

fseterr.c: In function ‘fseterr’:
fseterr.c:72:3: error: #error "Please port gnulib fseterr.c to your platform! Look at the definitions of ferror and clearerr on your system, then report this to bug-gnulib."
72 | #error "Please port gnulib fseterr.c to your platform! Look at the definitions of ferror and clearerr on your system, then report this to bug-gnulib."
| ^~~~~
make[2]: *** [Makefile:1622: fseterr.o] 오류 1

_IO_ftrylockfile 옵션에 있는 것을 _IO_EOF_SEEN도 추가해 줍니다.

fseterr.c 
@@ -29,7 +29,7 @@
   /* Most systems provide FILE as a struct and the necessary bitmask in
      <stdio.h>, because they need it for implementing getc() and putc() as
      fast macros.  */
-#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+#if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
   fp->_flags |= _IO_ERR_SEEN;
 #elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */

 

컴파일이 완료되면 sudo make install을 해서 설치를 완료합니다.

make install을 완료하면 다음과 같이 디렉토리가 생깁니다. 

% ls /usrlocal/bin/bison-2.5/
bin  lib  share
 
다음과 같이 path를 잡아줍니다. 
export PATH=/usr/local/bin/bison-2.5/bin:$PATH 
 
facebook twitter kakaoTalk kakaostory naver band shareLink