2

My program used to compile fine with OpenBSD before I added the lemon parser. Now it compiles on Linux but on OpenBSD I get an error I don't understand.

$ cmake .. -- The C compiler identification is GNU 4.2.1 -- The CXX compiler identification is GNU 4.2.1 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /home/dac/test/openshell/build $ make Scanning dependScanning dependencies of target shell [ 28%] Building C object CMakeFiles/shell.dir/main.c.o /home/dac/test/openshell/main.c: In function 'main': /home/dac/test/openshell/main.c:788: warning: implicit declaration of function 'add_history' /home/dac/test/openshell/main.c: In function 'command': /home/dac/test/openshell/main.c:573: warning: passing argument 1 of 'expandVariable' discards qualifiers from pointer target type cc: -ledit: linker input file unused because linking not done cc: -lncurses: linker input file unused because linking not done cc: -lcurses: linker input file unused because linking not done cc: -ltermcap: linker input file unused because linking not done [ 42%] Building C object CMakeFiles/shell.dir/shellparser.c.o /home/dac/test/openshell/shellparser.c:280: error: expected expression before '%' token /home/dac/test/openshell/shellparser.c:288: error: expected expression before '%' token /home/dac/test/openshell/shellparser.c:288: error: initializer element is not constant /home/dac/test/openshell/shellparser.c:288: error: (near initialization for 'yyRuleName[0]') /home/dac/test/openshell/shellparser.c: In function 'yy_destructor': /home/dac/test/openshell/shellparser.c:370: error: expected expression before '%' token /home/dac/test/openshell/shellparser.c:370: warning: statement with no effect /home/dac/test/openshell/shellparser.c: In function 'yyStackOverflow': /home/dac/test/openshell/shellparser.c:551: error: expected expression before '%' token /home/dac/test/openshell/shellparser.c:551: warning: statement with no effect /home/dac/test/openshell/shellparser.c: At top level: /home/dac/test/openshell/shellparser.c:609: error: expected expression before '%' token /home/dac/test/openshell/shellparser.c:609: warning: missing braces around initializer /home/dac/test/openshell/shellparser.c:609: warning: (near initialization for 'yyRuleInfo[0]') /home/dac/test/openshell/shellparser.c:609: error: initializer element is not constant /home/dac/test/openshell/shellparser.c:609: error: (near initialization for 'yyRuleInfo[0].lhs') /home/dac/test/openshell/shellparser.c: In function 'yy_reduce': /home/dac/test/openshell/shellparser.c:664: error: expected expression before '%' token /home/dac/test/openshell/shellparser.c:664: warning: statement with no effect /home/dac/test/openshell/shellparser.c: In function 'yy_parse_failed': /home/dac/test/openshell/shellparser.c:710: error: expected expression before '%' token /home/dac/test/openshell/shellparser.c:710: warning: statement with no effect /home/dac/test/openshell/shellparser.c: In function 'yy_syntax_error': /home/dac/test/openshell/shellparser.c:726: error: expected expression before '%' token /home/dac/test/openshell/shellparser.c:726: warning: statement with no effect /home/dac/test/openshell/shellparser.c: In function 'yy_accept': /home/dac/test/openshell/shellparser.c:745: error: expected expression before '%' token /home/dac/test/openshell/shellparser.c:745: warning: statement with no effect /home/dac/test/openshell/shellparser.c: At top level: /home/dac/test/openshell/shellparser.c:918: error: expected identifier or '(' before string constant /home/dac/test/openshell/shellparser.c:929: error: expected identifier or '(' before ',' token 

Why is is happening and what can I do about it? Did I forget to include a library? My cmake file is

cmake_minimum_required(VERSION 3.0) project(shell.test) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L/usr/local/include/ -L/usr/include -std=c99 -pedantic -O3 -g -Wall -pedantic -ledit -lncurses -lcurses -ltermcap") include_directories(/usr/local/include/ /usr/include) link_directories(/usr/lib) link_directories(/usr/local/lib) add_executable(shell main.c shellparser.c errors.c util.c) target_link_libraries(shell edit readline) add_custom_target(shellparser DEPENDS ${CMAKE_SOURCE_DIR}/shellparser.c) add_custom_command(OUTPUT ${CMAKE_SOURCE_DIR}/shellparser.c COMMAND lemon -s ${CMAKE_SOURCE_DIR}/shellparser.y DEPENDS ${CMAKE_SOURCE_DIR}/shellparser.y) add_dependencies(shell shellparser) set_property(TARGET shell PROPERTY C_STANDARD 99)$ 

On Ubuntu I can build it successfully:

$ git clone http://github.com/montao/openshell Cloning into 'openshell'... remote: Counting objects: 1439, done. remote: Compressing objects: 100% (184/184), done. remote: Total 1439 (delta 124), reused 0 (delta 0), pack-reused 1255 Receiving objects: 100% (1439/1439), 405.08 KiB | 117.00 KiB/s, done. Resolving deltas: 100% (973/973), done. Checking connectivity... done. dac@dac-Latitude-E7450:~/montao/test$ cd openshell/ dac@dac-Latitude-E7450:~/montao/test/openshell$ mkdir build dac@dac-Latitude-E7450:~/montao/test/openshell$ cd build/ dac@dac-Latitude-E7450:~/montao/test/openshell/build$ cmake .. -- The C compiler identification is GNU 5.3.1 -- The CXX compiler identification is GNU 5.3.1 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /home/dac/montao/test/openshell/build dac@dac-Latitude-E7450:~/montao/test/openshell/build$ make Scanning dependencies of target shellparser [ 14%] Generating ../shellparser.c Parser statistics: terminal symbols................... 9 non-terminal symbols............... 3 total symbols...................... 12 rules.............................. 8 states............................. 14 conflicts.......................... 0 action table entries............... 32 total table size (bytes)........... 100 [ 14%] Built target shellparser Scanning dependencies of target shell [ 28%] Building C object CMakeFiles/shell.dir/main.c.o /home/dac/montao/test/openshell/main.c: In function ‘free_pipeline’: /home/dac/montao/test/openshell/main.c:337:6: note: the ABI of passing struct with a flexible array member has changed in GCC 4.4 void free_pipeline(struct pipeline pipe) { ^ [ 42%] Building C object CMakeFiles/shell.dir/shellparser.c.o [ 57%] Building C object CMakeFiles/shell.dir/errors.c.o [ 71%] Building C object CMakeFiles/shell.dir/util.c.o /home/dac/montao/test/openshell/util.c: In function ‘make_args’: /home/dac/montao/test/openshell/util.c:1100:52: warning: operation on ‘jc’ may be undefined [-Wsequence-point] char *str = concat((char *) *retArgv[jc++], (char *) *retArgv[jc]); ^ /home/dac/montao/test/openshell/util.c:1100:19: warning: unused variable ‘str’ [-Wunused-variable] char *str = concat((char *) *retArgv[jc++], (char *) *retArgv[jc]); ^ [ 85%] Linking C executable shell [100%] Built target shell 

No matter what I do, the error is there when I compile with OpenBSD. I tried everything.

4
  • 1
    obviously, knowing at least one or two of the lines where your compiler on openBSD fails would actually be helpful Commented May 14, 2016 at 11:34
  • @MarcusMüller I finally could compile it if I use lemon from cmake and then make. Lemon will generate different shellparser.c from shellparser.y depending on how I invoke it. I'm not sure of details, but at least I can build the project now :-) Commented May 15, 2016 at 4:23
  • 1
    You're not really helping anyone but yourself if you don't add an answer (you can self-answer questions, it's very much appreciated on SO!) and explain what you did, and actually show the files that are different! Other than that, your question bears no value for future readers :( Commented May 15, 2016 at 10:41
  • @MarcusMüller still looking for why it works to generate the code at Ubuntu and then run it with OpenBSD. But it works. Actually I did update the build instruction right away (github.com/montao/openshell) Commented May 17, 2016 at 0:16

2 Answers 2

4

I haven't used OpenBSD but this could be caused by an "ancient" GCC 4.2.1 which was released 18 July 2007. On Ubuntu it's compiled with more recent GCC.

In fact if you check dependencies of project you want to build

Dependencies: editline, ncurses, C99

And C99 support in gcc

C99 is substantially completely supported as of GCC 4.5 (with -std=c99 -pedantic-errors used; -fextended-identifiers also needed to enable extended identifiers before GCC 5)

Sign up to request clarification or add additional context in comments.

4 Comments

Interesting lead! I think, considering the errors OP gets, I think it might be that his parser generator doesn't work as expected. That's why I'm asking for the generated .c files; the .y file isn't sufficient to tell.
No matter what I do I get the error. I tried everything.
@Montao you should change -pedantic to -pedantic-errors an fix errors. Probably you will have to add #include <readline/history.h> to OpenBSD ifdef in main.c.
The error also happens when I try this example: stackoverflow.com/questions/34918631/… so we have a minimal way of reproducing it.
1

I can compile it like this with OpenBSD 5.9

gcc -std=c99 shellparser.c main.c util.c errors.c -ledit -ltermcap

IF I first generate the shellparser.c with Linux and copy the file to OpenBSD, then the above works to build for OpenBSD. But I still can't generate the C from the grammar with OpenBSD, there comes a compilation error. I can recreate the compilation error on Ubuntu and I'm still looking for what causes the diff in the generated C when I run lemon shellparser.y

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.