AX_CFLAGS_NO_WRITABLE_STRINGS [(shellvar [,default, [A/NA]])] ,
2006年10月13日
Guido U. Draheim <guidod@gmx.de>
GPLWithACException
This program is free software; you can
redistribute it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation. As a special exception, the respective
Autoconf Macro's copyright owner gives unlimited permission to copy, distribute and modify
the configure scripts that are the output of Autoconf when processing the Macro. You
need not follow the terms of the
GNU General Public License when using or distributing such scripts
cryp.to ac-archive's C Support (released)
Try to find a compiler option that makes all stringliteral readonly.
The sanity check is done by looking at string.h which has a set of strcpy definitions that should be defined with const-modifiers to not emit a warning in all so many places.
For the GNU CC compiler it will be -fno-writable-strings -Wwrite-strings The result is added to the shellvar being CFLAGS by default.
DEFAULTS:
- 1ドル shell-variable-to-add-to : CFLAGS
- 2ドル add-value-if-not-found : nothing
- 3ドル action-if-found : add value to shellvariable
- 4ドル action-if-not-found : nothing
AC_DEFUN([AX_CFLAGS_NO_WRITABLE_STRINGS],[dnl AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_no_writable_strings])dnl AC_CACHE_CHECK([m4_ifval([1ドル],[1ドル],FLAGS) making strings readonly], VAR,[VAR="no, unknown" AC_LANG_SAVE AC_LANG_C ac_save_[]FLAGS="$[]FLAGS" # IRIX C compiler: # -use_readonly_const is the default for IRIX C, # puts them into .rodata, but they are copied later. # need to be "-G0 -rdatashared" for strictmode but # I am not sure what effect that has really. - guidod for ac_arg dnl in "-Wall % -fno-writable-strings -Wwrite-strings" dnl GCC "-v -Xc % -xstrconst" dnl Solaris C - strings go into readonly segment "+w1 -Aa % +ESlit" dnl HP-UX C - strings go into readonly segment "-w0 -std1 % -readonly_strings" dnl Digital Unix - again readonly segment "-fullwarn -use_readonly_const %% ok, its the default" dnl IRIX C # do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` AC_TRY_COMPILE([],[return 0;], [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) done case ".$VAR" in .|.no|.no,*) ;; *) # sanity check - testing strcpy() from string.h cp config.log config.tmp AC_TRY_COMPILE([#include <string.h>],[ char test[16]; if (strcpy (test, "test")) return 1;], dnl the original did use test -n `$CC testprogram.c` [if test `diff config.log config.tmp | grep -i warning | wc -l` != 0 then VAR="no, suppressed, string.h," ; fi], [VAR="no, suppressed, string.h"]) rm config.tmp ;; esac FLAGS="$ac_save_[]FLAGS" AC_LANG_RESTORE ]) case ".$VAR" in .ok|.ok,*) m4_ifvaln(3,ドル3ドル) ;; .|.no|.no,*) m4_ifvaln(4,ドル4,ドル[m4_ifval(2,ドル[ AC_RUN_LOG([: m4_ifval(1,ドル1,ドルFLAGS)="$m4_ifval(1,ドル1,ドルFLAGS) 2ドル"]) m4_ifval(1,ドル1,ドルFLAGS)="$m4_ifval(1,ドル1,ドルFLAGS) 2ドル"])]) ;; *) m4_ifvaln(3,ドル3,ドル[ if echo " $[]m4_ifval(1,ドル1,ドルFLAGS) " | grep " $VAR " 2>&1 >/dev/null then AC_RUN_LOG([: m4_ifval(1,ドル1,ドルFLAGS) does contain $VAR]) else AC_RUN_LOG([: m4_ifval(1,ドル1,ドルFLAGS)="$m4_ifval(1,ドル1,ドルFLAGS) $VAR"]) m4_ifval(1,ドル1,ドルFLAGS)="$m4_ifval(1,ドル1,ドルFLAGS) $VAR" fi ]) ;; esac AS_VAR_POPDEF([VAR])dnl AS_VAR_POPDEF([FLAGS])dnl ]) dnl the only difference - the LANG selection... and the default FLAGS AC_DEFUN([AX_CXXFLAGS_NO_WRITABLE_STRINGS],[dnl AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_no_writable_strings])dnl AC_CACHE_CHECK([m4_ifval(1,ドル1,ドルFLAGS) making strings readonly], VAR,[VAR="no, unknown" AC_LANG_SAVE AC_LANG_CXX ac_save_[]FLAGS="$[]FLAGS" # IRIX C compiler: # -use_readonly_const is the default for IRIX C, # puts them into .rodata, but they are copied later. # need to be "-G0 -rdatashared" for strictmode but # I am not sure what effect that has really. - guidod for ac_arg dnl in "-Wall % -fno-writable-strings -Wwrite-strings" dnl GCC "-v -Xc % -xstrconst" dnl Solaris C - strings go into readonly segment "+w1 -Aa % +ESlit" dnl HP-UX C - strings go into readonly segment "-w0 -std1 % -readonly_strings" dnl Digital Unix - again readonly segment "-fullwarn -use_readonly_const %% ok, its the default" dnl IRIX C # do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` AC_TRY_COMPILE([],[return 0;], [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) done case ".$VAR" in .|.no|.no,*) ;; *) # sanity check - testing strcpy() from string.h cp config.log config.tmp AC_TRY_COMPILE([#include <string.h>],[[ char test[16]; if (strcpy (test, "test")) return 1;]], dnl the original did use test -n `$CC testprogram.c` [if test `diff config.log config.tmp | grep -i warning | wc -l` != 0 then VAR="no, suppressed, string.h," ; fi], [VAR="no, suppressed, string.h"]) rm config.tmp ;; esac FLAGS="$ac_save_[]FLAGS" AC_LANG_RESTORE ]) case ".$VAR" in .ok|.ok,*) m4_ifvaln(3,ドル3ドル) ;; .|.no|.no,*) m4_ifvaln(4,ドル4,ドル[m4_ifval(2,ドル[ AC_RUN_LOG([: m4_ifval(1,ドル1,ドルFLAGS)="$m4_ifval(1,ドル1,ドルFLAGS) $VAR"]) m4_ifval(1,ドル1,ドルFLAGS)="$m4_ifval(1,ドル1,ドルFLAGS) 2ドル"])]) ;; *) m4_ifvaln(3,ドル3,ドル[ if echo " $[]m4_ifval(1,ドル1,ドルFLAGS) " | grep " $VAR " 2>&1 >/dev/null then AC_RUN_LOG([: m4_ifval(1,ドル1,ドルFLAGS) does contain $VAR]) else AC_RUN_LOG([: m4_ifval(1,ドル1,ドルFLAGS)="$m4_ifval(1,ドル1,ドルFLAGS) $VAR"]) m4_ifval(1,ドル1,ドルFLAGS)="$m4_ifval(1,ドル1,ドルFLAGS) $VAR" fi ]) ;; esac AS_VAR_POPDEF([VAR])dnl AS_VAR_POPDEF([FLAGS])dnl ])