2012-11-13 8 views
0

如果DEB包中包含的是從由flex生成的源代碼建立了一個共享庫,/usr/bin/lintian將報告林田報道SHLIB通話退出建設DEB包時從柔性生成的源代碼

shlib-calls-exit

因爲在flex生成的函數yy_fatal_error退出()調用的:

static void yy_fatal_error (yyconst char* msg) 
{ 
     (void) fprintf(stderr, "%s\n", msg); 
     exit(YY_EXIT_FAILURE); 
} 

我如何修改DEB包,使得林田將停止reportin g shlib-calls-exit?

DEB包在其構建腳本中使用CMake。 CMake的的源代碼對應的片段是

flex_target(scanner lexer.l ${CMAKE_CURRENT_BINARY_DIR}/lexer.c) 
bison_target(parser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.c) 
add_flex_bison_dependency(scanner parser) 
add_library(parse-and-scan SHARED ${FLEX_scanner_OUTPUTS} ${BISON_parser_OUTPUT_SOURCE}) 

有關該軟件的版本信息:

  • 柔性2.5.35
  • cmake的2.8.9
  • 林田2.5.10
  • Linux發行版:Debian Unstable(sid)

大約一個星期前,我貼了similar question到debian-導師郵件列表

具有柔性生成的源代碼退出()調用的問題已經brought up柔性,幫助郵件列表上,但帖子沒有提供答案。

回答

-1

通過用abort()調用替換exit()調用lintian將不再報告shlib-calls-exit。 CMake可以通過將lexer.c文件讀入字符串,然後進行文本替換,然後將字符串寫入新文件lexer_replaced.c(任意文件名)來處理此替換。

flex_target(scanner lexer.l ${CMAKE_CURRENT_BINARY_DIR}/lexer.c) 
bison_target(parser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.c) 
add_flex_bison_dependency(scanner parser) 
set(replaced_file ${CMAKE_CURRENT_BINARY_DIR}/lexer_replaced.c) 
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/replace_exit_with_abort.cmake " 
    file(READ ${FLEX_scanner_OUTPUTS} var1) 
    string(REPLACE \"exit\\(YY_EXIT_FAILURE \\);\" \"abort();\" var2 \"\${var1}\") 
    file(WRITE ${replaced_file} \"\${var2}\") 
") 
add_custom_command(OUTPUT ${replaced_file} 
    COMMAND ${CMAKE_COMMAND} 
    ARGS -P ${CMAKE_CURRENT_BINARY_DIR}/replace_exit_with_abort.cmake 
    DEPENDS ${FLEX_scanner_OUTPUTS} 
) 
add_library(parse-and-scan SHARED ${replaced_file} ${BISON_parser_OUTPUT_SOURCE}) 

我認爲這是一個可行的解決方案,但是從長遠來看,最好的解決辦法是修改程序柔性總是從它的功能,而不是使用有時會返回退出()調用。如果發生錯誤條件,則Flex函數會使用不同的返回值將此信息傳遞給調用者。