$! File: config_h.com $! $! $Id: config_h.com,v 1.1.1.1 2012/12/02 19:25:21 wb8tyw Exp $ $! $! This procedure attempts to figure out how to build a config.h file $! for the current project. $! $! P1 specifies the config.h.in file or equivalent. If it is not specified $! then this procedure will search for several common names of the file. $! $! The CONFIGURE shell script will be examined for hints and a few symbols $! but most of the tests will not produce valid results on OpenVMS. Some $! will produce false positives and some will produce false negatives. $! $! It is easier to just read the config.h_in file and make up tests based $! on what is in it! $! $! This file will create an empty config_vms.h file if one does not exist. $! The config_vms.h is intended for manual edits to handle things that $! this procedure can not. $! $! The config_vms.h will be invoked by the resulting config.h file. $! $! This procedure knows about the DEC C RTL on the system it is on. $! Future versions may be handle the GNV, the OpenVMS porting library, $! and others. $! $! This procedure may not guess the options correctly for all architectures, $! and is a work in progress. $! $! Copyright 2011, John Malmberg $! $! Permission to use, copy, modify, and/or distribute this software for any $! purpose with or without fee is hereby granted, provided that the above $! copyright notice and this permission notice appear in all copies. $! $! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES $! WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF $! MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR $! ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES $! WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN $! ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT $! OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. $! $! 15-Jan-2001 J. Malmberg Original $! 29-Apr-2001 J. Malmberg Also look for config.*in* in a [.include] $! subdirectory $! 30-Apr-2001 J. Malmberg Update for SAMBA checks $! 09-Apr-2005 J. Malmberg Update for RSYNC and large file. $! 29-Sep-2011 J. Malmberg Update for Bash 4.2 $! 01-Mar-2012 J. Malmberg Warn about getcwd(0,0) $! 21-Dec-2012 J. Malmberg Update for gawk $! 29-Dec-2012 J. Malmberg Update for curl $!============================================================================ $! $ss_normal = 1 $ss_abort = 44 $ss_control_y = 1556 $status = ss_normal $on control_y then goto control_y $on warning then goto general_error $! $! Some information for writing timestamps to created files $!---------------------------------------------------------- $my_proc = f$environment("PROCEDURE") $my_proc_file = f$parse(my_proc,,,"NAME") + f$parse(my_proc,,,"TYPE") $tab[0,8] = 9 $datetime = f$element(0,".",f$cvtime(,"ABSOLUTE","DATETIME")) $username = f$edit(f$getjpi("","USERNAME"),"TRIM") $! $pid = f$getjpi("","PID") $tfile1 = "SYS$SCRATCH:config_h_temp1_''pid'.TEMP" $dchfile = "SYS$SCRATCH:config_h_decc_''pid'.TEMP" $configure_script = "SYS$SCRATCH:configure_script_''pid'.TEMP" $! $! Get the system type $!---------------------- $arch_type = f$getsyi("arch_type") $! $! $! Write out the header $!---------------------- $gosub write_curlbuild_h_header $! $! $! config.h.in could have at least five different names depending $! on how it was transferred to OpenVMS $!------------------------------------------------------------------ $base_curlbuild = "sys$disk:[.include.curl]" $if p1 .nes. "" $then $ cfile = p1 $else $ cfile = f$search("''base_curlbuild'curlbuild.h.in") $ if cfile .eqs. "" $ then $ cfile = f$search("''base_curlbuild'curlbuild.h_in") $ if cfile .eqs. "" $ then $ cfile = f$search("''base_curlbuild'curlbuildh.in") $ if cfile .eqs. "" $ then $ cfile = f$search("''base_curlbuild'curlbuild__2eh.in") $ if cfile .eqs. "" $ then $ cfile = f$search("''base_curlbuild'curlbuild.h__2ein") $ if cfile .eqs. "" $ then $ cfile = f$search("''base_curlbuild'curlbuild.h$5nin") $ endif $ endif $ endif $ endif $ endif $endif $! $if cfile .eqs. "" $then $ write sys$output "Can not find ''base_curlbuild'curlbuild.h.in" $ line_out = "Looked for curlbuild.h.in, curlbuild.h_in, curlbuild.in, " $ line_out = line_out + "curlbuild__2eh.in, curlbuild.h__2ein, " $ line_out = line_out + "curlbuild.h$5nin" $ write/symbol sys$output line_out $ goto general_error $endif $! $open/read inf 'cfile' $do_comment = 0 $if_block = 0 $cfgh_in_loop1: $!set nover $ read/end=cfgh_in_loop1_end inf line_in $ xline = f$edit(line_in,"TRIM,COMPRESS") $! $! Blank line handling $!--------------------- $ if xline .eqs. "" $ then $ write tf "" $ goto cfgh_in_loop1 $ endif $ xlen = f$length(xline) $ key = f$extract(0,2,xline) $! $! deal with comments by copying exactly $!----------------------------------------- $ if (do_comment .eq. 1) .or. (key .eqs. "/*") $ then $ do_comment = 1 $ write tf line_in $ key = f$extract(xlen - 2, 2, xline) $ if key .eqs. "*/" then do_comment = 0 $ goto cfgh_in_loop1 $ endif $! $! Some quick parsing $!---------------------- $ keyif = f$extract(0,3,xline) $ key1 = f$element(0," ",xline) $ key2 = f$element(1," ",xline) $ key2a = f$element(0,"_",key2) $ key2b = f$element(1,"_",key2) $ key2_len = f$length(key2) $ key2_h = f$extract(key2_len - 2, 2, key2) $ key2_t = f$extract(key2_len - 5, 5, key2) $ if key2_t .eqs. "_TYPE" then key2_h = "_T" $ key64 = 0 $ if f$locate("64", xline) .lt. xlen then key64 = 1 $! $!write sys$output "xline = ''xline'" $! $ if key1 .nes. "#undef" $ then $ write tf line_in $ goto cfgh_in_loop1 $ endif $! $! All versions of VMS have sys/types.h $!---------------------------------------- $ if (key2 .eqs. "CURL_PULL_SYS_TYPES_H") $ then $ write tf "#define ''key2' 1" $ goto cfgh_in_loop1 $ endif $! $! Most have sys/socket.h $!------------------------- $ if (key2 .eqs. "CURL_PULL_SYS_SOCKET_H") $ then $ write tf "#ifdef HAVE_SYS_SOCKET_H" $ write tf "#define ''key2' 1" $ write tf "#else" $ write tf "#undef ''key2'" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! VAX/VMS 7.3 does not have sys/poll.h $!---------------------------------------- $ if (key2 .eqs. "CURL_PULL_SYS_POLL_H") $ then $ write tf "#ifdef HAVE_POLL_H" $ write tf "#define ''key2' 1" $ write tf "#else" $ write tf "#undef ''key2'" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if (key2 .eqs. "CURL_SIZEOF_LONG") $ then $ write tf "#define ''key2' SIZEOF_INT" $ goto cfgh_in_loop1 $ endif $! $ if (key2 .eqs. "CURL_SIZEOF_CURL_SOCKLEN_T") $ then $ write tf "#define ''key2' SIZEOF_INT" $ goto cfgh_in_loop1 $ endif $! $ if (key2 .eqs. "CURL_TYPEOF_CURL_SOCKLEN_T") $ then $ write tf "#define ''key2' size_t" $ goto cfgh_in_loop1 $ endif $! $ if (key2 .eqs. "CURL_TYPEOF_CURL_OFF_T") $ then $ write tf "#define ''key2' off_t" $ goto cfgh_in_loop1 $ endif $! $ if (key2 .eqs. "CURL_FORMAT_CURL_OFF_T") $ then $ write tf "#if (SIZEOF_OFF_T == 8)" $ write tf "#define ''key2' ""lld""" $ write tf "#else" $ write tf "#define ''key2' ""ld""" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if (key2 .eqs. "CURL_FORMAT_CURL_OFF_TU") $ then $ write tf "#if (SIZEOF_OFF_T == 8)" $ write tf "#define ''key2' ""llu""" $ write tf "#else" $ write tf "#define ''key2' ""lu""" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if (key2 .eqs. "CURL_FORMAT_OFF_T") $ then $ write tf "#if (SIZEOF_OFF_T == 8)" $ write tf "#define ''key2' ""%lld""" $ write tf "#else" $ write tf "#define ''key2' ""%ld""" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if (key2 .eqs. "CURL_SIZEOF_CURL_OFF_T") $ then $ write tf "#define ''key2' SIZEOF_OFF_T" $ goto cfgh_in_loop1 $ endif $! $ if (key2 .eqs. "CURL_SUFFIX_CURL_OFF_T") $ then $ write tf "#if (SIZEOF_OFF_T == 8)" $ write tf "#define ''key2' LL" $ write tf "#else" $ write tf "#define ''key2' L" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if (key2 .eqs. "CURL_SUFFIX_CURL_OFF_TU") $ then $ write tf "#if (SIZEOF_OFF_T == 8)" $ write tf "#define ''key2' ULL" $ write tf "#else" $ write tf "#define ''key2' UL" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! $! $! If it falls through everything else, comment it out $!----------------------------------------------------- $ write tf "/* ", xline, " */" $ goto cfgh_in_loop1 $cfgh_in_loop1_end: $close inf $close tf $! $! Exit and clean up $!-------------------- $general_error: $status = '$status' $all_exit: $set noon $if f$trnlnm("tf","lnm$process",,"SUPERVISOR") .nes. "" then close tf $if f$trnlnm("inf","lnm$process",,"SUPERVISOR") .nes. "" then close inf $exit 'status' $! $! $control_y: $ status = ss_control_y $ goto all_exit $! $! $! gosub to write out a documentation header for config.h $!---------------------------------------------------------------- $write_curlbuild_h_header: $outfile = "sys$disk:[.include.curl]curlbuild.h" $create 'outfile' $open/append tf 'outfile' $write tf - "/* [.include.curl]curlbuild.h. Generated from curlbuild.h.in by */" $write tf - "/* ", my_proc_file, tab, datetime, tab, username, tab, " */" $write tf "" $return