mirror of
https://github.com/vim/vim.git
synced 2025-10-22 08:34:29 -04:00
patch 9.1.1591: VMS support can be improved
Problem: VMS support can be improved Solution: Merge chagnes from Steven M. Schweda (Zoltan) closes: #17810 Co-authored-by: Steven M. Schweda <sms@antinode.info> Signed-off-by: Zoltan Arpadffy <zoltan.arpadffy@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
af9a7a04f1
commit
e9d1259111
947
src/Make_vms.mms
947
src/Make_vms.mms
File diff suppressed because it is too large
Load Diff
@@ -1694,6 +1694,7 @@ extern char_u *all_lflags;
|
||||
# ifdef VMS
|
||||
extern char_u *compiler_version;
|
||||
extern char_u *compiled_arch;
|
||||
extern char_u *compiled_vers;
|
||||
# endif
|
||||
extern char_u *compiled_user;
|
||||
extern char_u *compiled_sys;
|
||||
|
30
src/main.c
30
src/main.c
@@ -2096,7 +2096,19 @@ command_line_scan(mparm_T *parmp)
|
||||
{
|
||||
want_argument = FALSE;
|
||||
c = argv[0][argv_idx++];
|
||||
#ifdef VMS
|
||||
#if defined( VMS)
|
||||
/* 2025-05-13 SMS
|
||||
* On sufficiently recent non-VAX systems, case preservation
|
||||
* of the command line is possible/routine. And quotation
|
||||
* always works, and is the expected method in such cases.
|
||||
* However, leaving this slash-prefix scheme available is
|
||||
* nearly harmless. But note that it doesn't help with the
|
||||
* case of other command-line arguments, such as file names.
|
||||
* For details, see os_vms.c:vms_init().
|
||||
* On VAX and old non-VAX systems, or with SET PROC/PARSE=TRAD,
|
||||
* DCL upcases the command line, and the C RTL downcases it.
|
||||
* I would not say "only uses upper case command lines".
|
||||
*/
|
||||
/*
|
||||
* VMS only uses upper case command lines. Interpret "-X" as "-x"
|
||||
* and "-/X" as "-X".
|
||||
@@ -2106,9 +2118,12 @@ command_line_scan(mparm_T *parmp)
|
||||
c = argv[0][argv_idx++];
|
||||
c = TOUPPER_ASC(c);
|
||||
}
|
||||
else
|
||||
c = TOLOWER_ASC(c);
|
||||
#endif
|
||||
/* Note that although DCL might upcase things, the C RTL
|
||||
* will only downcase them, so there should be no need for
|
||||
* the following (additional?) downcasing (which spoils the
|
||||
* preserve-case results):
|
||||
*/
|
||||
#endif /* defined( VMS) */
|
||||
switch (c)
|
||||
{
|
||||
case NUL: // "vim -" read from stdin
|
||||
@@ -3610,9 +3625,10 @@ usage(void)
|
||||
break;
|
||||
mch_msg(_("\n or:"));
|
||||
}
|
||||
#ifdef VMS
|
||||
mch_msg(_("\nWhere case is ignored prepend / to make flag upper case"));
|
||||
#endif
|
||||
#if defined( VMS)
|
||||
mch_msg(_("\nWhere command is down-cased, prepend / (like: -/R) to treat flag as upper-case."));
|
||||
mch_msg(_("\nOr, where supported, SET PROC/PARSE=EXT, or else quote upper-case material."));
|
||||
#endif /* defined( VMS) */
|
||||
|
||||
mch_msg(_("\n\nArguments:\n"));
|
||||
main_msg(_("--\t\t\tOnly file names after this"));
|
||||
|
237
src/os_vms.c
237
src/os_vms.c
@@ -725,28 +725,82 @@ vms_fixfilename(void *instring)
|
||||
* Remove version number from file name
|
||||
* we need it in some special cases as:
|
||||
* creating swap file name and writing new file
|
||||
*/
|
||||
|
||||
/*
|
||||
* 2025-05-13 SMS.
|
||||
* Using $PARSE would be simpler and more accurate, if all-VMS (not
|
||||
* mixed UNIX+VMS) path were ensured. Meanwhile, to improve (imperfect)
|
||||
* handling of extended name syntax:
|
||||
* o All characters (up to five (32767)) after semi-colon (or last
|
||||
* of multiple dots) must be numeric.
|
||||
* o Caret-escaped semi-colon (^;) or dot (^.) does not delimit
|
||||
* version.
|
||||
* Whether it makes sense to detect syntax errors here is not entirely
|
||||
* clear. Currently, many invalid version strings are not treated as
|
||||
* version strings. (More could be.)
|
||||
*/
|
||||
void
|
||||
vms_remove_version(void * fname)
|
||||
{
|
||||
char_u *cp;
|
||||
char_u *fp;
|
||||
char_u *dp; // Dot pointer
|
||||
char_u *rp; // Right pointer
|
||||
int done = 0;
|
||||
int vdigits = 0;
|
||||
|
||||
if ((cp = vim_strchr( fname, ';')) != NULL) // remove version
|
||||
*cp = '\0';
|
||||
else if ((cp = vim_strrchr( fname, '.')) != NULL )
|
||||
rp = (char_u *)fname+ strlen( (char *)fname)- 1; // Rightmost char
|
||||
while ((done == 0) && (rp > (char_u *)fname)) // Count digits
|
||||
{
|
||||
if ((fp = vim_strrchr( fname, ']')) != NULL )
|
||||
{;}
|
||||
else if ((fp = vim_strrchr( fname, '>')) != NULL )
|
||||
{;}
|
||||
else
|
||||
fp = fname;
|
||||
|
||||
while ( *fp != '\0' && fp < cp )
|
||||
if ( *fp++ == '.' )
|
||||
*cp = '\0';
|
||||
if (isdigit( *rp))
|
||||
{
|
||||
vdigits++;
|
||||
*rp--;
|
||||
}
|
||||
else
|
||||
{
|
||||
done = 1; // Quit at non-digit
|
||||
}
|
||||
} // while (Count digits)
|
||||
|
||||
if (vdigits <= 5) // If likely version digits, check delimiter
|
||||
{ // (Could check for <= 32767, not just five digits or fewer.)
|
||||
if (*rp == (char_u)';')
|
||||
{
|
||||
if ((rp >= (char_u *)fname) && (*(rp- 1) != (char_u)'^'))
|
||||
{ // Unescaped ";"
|
||||
*rp = '\0'; // Trim off ";nnn"
|
||||
}
|
||||
}
|
||||
else if (*rp == (char_u)'.') // Last of multiple dots?
|
||||
{
|
||||
if ((rp >= (char_u *)fname) && (*(rp- 1) != '^'))
|
||||
{ // Unescaped dot. Version requires previous one
|
||||
dp = rp- 1; // Scan chars before "."
|
||||
done = 0;
|
||||
while ((done == 0) && (dp >= (char_u *)fname))
|
||||
{
|
||||
if ((*dp == ']') || (*dp == '>') || (*dp == ':') || (*dp == '/'))
|
||||
{ // Possible VMS dev:[dir] delimiter (or UNIX "/")
|
||||
if ((dp >= (char_u *)fname) && (*(dp- 1) != '^'))
|
||||
{ // Unescaped dev:[dir] (or /) delimiter
|
||||
done = 1; // No previous dot found in name
|
||||
}
|
||||
}
|
||||
else if (*dp == '.')
|
||||
{ // Possible dot delimiter
|
||||
if ((dp >= (char_u *)fname) && (*(dp- 1) != '^'))
|
||||
{ // Unescaped dot delimiter
|
||||
done = 1; // Previous dot found in name
|
||||
*rp = '\0'; // Trim off ".nnn"
|
||||
}
|
||||
}
|
||||
dp--; // Next char to right
|
||||
} // while
|
||||
}
|
||||
}
|
||||
// Else no version found to remove
|
||||
} // if (vdigits <= 5)
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
@@ -783,23 +837,29 @@ RealWaitForChar(
|
||||
if (sec > 0)
|
||||
{
|
||||
// time-out specified; convert it to absolute time
|
||||
// sec>0 requirement of lib$cvtf_to_internal_time()
|
||||
// sec>0 requirement of lib$cvt[fs]_to_internal_time()
|
||||
|
||||
// get current time (number of 100ns ticks since the VMS Epoch)
|
||||
status = sys$gettim(&time_curr);
|
||||
if (status != SS$_NORMAL)
|
||||
return 0; // error
|
||||
// construct the delta time
|
||||
#if __G_FLOAT==0
|
||||
# ifndef VAX
|
||||
// IEEE is default on IA64, but can be used on Alpha too - but not on VAX
|
||||
status = lib$cvts_to_internal_time(
|
||||
|
||||
/* On all non-VAX hardware architectures, the "CC /FLOAT=option"
|
||||
* determines the floating-point format. The default format on Alpha
|
||||
* is VAX; on IA64 and x86_64 it's IEEE. But, except on VAX, the user
|
||||
* can specify either. What matters here is the actual floating-point
|
||||
* format being used, not the hardware architecture. Choose the
|
||||
* appropriate time conversion function accordingly.
|
||||
*/
|
||||
#if __IEEE_FLOAT
|
||||
# define LIB_CVTX_TO_INTERNAL_TIME lib$cvts_to_internal_time // IEEE
|
||||
#else
|
||||
# define LIB_CVTX_TO_INTERNAL_TIME lib$cvtf_to_internal_time // VAX
|
||||
#endif // __IEEE_FLOAT CVTS
|
||||
|
||||
status = LIB_CVTX_TO_INTERNAL_TIME(
|
||||
&convert_operation, &sec, &time_diff);
|
||||
# endif
|
||||
#else // default on Alpha and VAX
|
||||
status = lib$cvtf_to_internal_time(
|
||||
&convert_operation, &sec, &time_diff);
|
||||
#endif
|
||||
if (status != LIB$_NORMAL)
|
||||
return 0; // error
|
||||
// add them up
|
||||
@@ -851,3 +911,130 @@ RealWaitForChar(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if !defined( __VAX) && (__CRTL_VER >= 70301000)
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unixlib.h>
|
||||
|
||||
// Structure to hold a DECC$* feature name and its desired value
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *name;
|
||||
int value;
|
||||
} decc_feat_t;
|
||||
|
||||
int vms_init_done = -1;
|
||||
|
||||
decc_feat_t decc_feat_array[] = {
|
||||
|
||||
// Preserve command-line case with SET PROCESS/PARSE_STYLE=EXTENDED
|
||||
{ "DECC$ARGV_PARSE_STYLE", 1 },
|
||||
|
||||
// Preserve case for file names on ODS5 disks
|
||||
{ "DECC$EFS_CASE_PRESERVE", 1 },
|
||||
|
||||
// Enable multiple dots (and most characters) in ODS5 file names,
|
||||
// while preserving VMS-ness of ";version"
|
||||
{ "DECC$EFS_CHARSET", 1 },
|
||||
|
||||
// List terminator
|
||||
{ (char *)NULL, 0 } };
|
||||
|
||||
|
||||
/* LIB$INITIALIZE initialization.
|
||||
*
|
||||
* On sufficiently recent non-VAX systems, set a collection of C RTL
|
||||
* features without using the DECC$* logical name method.
|
||||
*
|
||||
* Note: Old VAX VMS versions may suffer from a linker complaint like
|
||||
* this:
|
||||
*
|
||||
* %LINK-W-MULPSC, conflicting attributes for psect LIB$INITIALIZE
|
||||
* in module LIB$INITIALIZE file SYS$COMMON:[SYSLIB]STARLET.OLB;1
|
||||
*
|
||||
* Using a LINK options file which includes a line like this one should
|
||||
* stop this complaint:
|
||||
*
|
||||
* PSECT_ATTR=LIB$INITIALIZE,NOPIC
|
||||
*/
|
||||
|
||||
/* vms_init()
|
||||
*
|
||||
* Uses LIB$INITIALIZE to set a collection of C RTL features without
|
||||
* requiring the user to define the corresponding logical names.
|
||||
*
|
||||
* LIB$INITIALIZE initialization function
|
||||
*/
|
||||
|
||||
static void
|
||||
vms_init(void)
|
||||
{
|
||||
// Set the global flag to indicate that LIB$INITIALIZE worked
|
||||
|
||||
vms_init_done = 1;
|
||||
|
||||
int feat_index;
|
||||
int feat_value;
|
||||
int feat_value_max;
|
||||
int feat_value_min;
|
||||
int i;
|
||||
int sts;
|
||||
|
||||
// Loop through all items in the decc_feat_array[]
|
||||
for (i = 0; decc_feat_array[i].name != NULL; i++)
|
||||
{
|
||||
// Get the feature index
|
||||
feat_index = decc$feature_get_index(decc_feat_array[i].name);
|
||||
if (feat_index >= 0)
|
||||
{
|
||||
// Valid item. Collect its properties
|
||||
feat_value = decc$feature_get_value(feat_index, 1);
|
||||
feat_value_min = decc$feature_get_value(feat_index, 2);
|
||||
feat_value_max = decc$feature_get_value(feat_index, 3);
|
||||
|
||||
if ((decc_feat_array[i].value >= feat_value_min) && (decc_feat_array[i].value <= feat_value_max))
|
||||
// Valid value. Set it if necessary
|
||||
if (feat_value != decc_feat_array[i].value)
|
||||
sts = decc$feature_set_value(feat_index, 1, decc_feat_array[i].value);
|
||||
else
|
||||
// Invalid DECC feature value
|
||||
printf("INVALID DECC FEATURE VALUE, %d: %d <= %s <= %d.\n",
|
||||
feat_value, feat_value_min, decc_feat_array[i].name, feat_value_max);
|
||||
}
|
||||
else
|
||||
// Invalid DECC feature name
|
||||
printf("UNKNOWN DECC FEATURE: %s.\n", decc_feat_array[i].name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Get "vms_init()" into a valid, loaded LIB$INITIALIZE PSECT. */
|
||||
|
||||
#pragma nostandard
|
||||
|
||||
/* Establish the LIB$INITIALIZE PSECTs, with proper alignment and
|
||||
* other attributes. Note that "nopic" is significant only on VAX.
|
||||
*/
|
||||
#pragma extern_model save
|
||||
|
||||
#pragma extern_model strict_refdef "LIB$INITIALIZE" 2, nopic, nowrt
|
||||
void (*const x_vms_init)() = vms_init;
|
||||
|
||||
#pragma extern_model strict_refdef "LIB$INITIALIZ" 2, nopic, nowrt
|
||||
const int spare[ 8] = { 0 };
|
||||
|
||||
#pragma extern_model restore
|
||||
|
||||
// Fake reference to ensure loading the LIB$INITIALIZE PSECT
|
||||
|
||||
#pragma extern_model save
|
||||
int LIB$INITIALIZE(void);
|
||||
#pragma extern_model strict_refdef
|
||||
int dmy_lib$initialize = (int) LIB$INITIALIZE;
|
||||
#pragma extern_model restore
|
||||
|
||||
#pragma standard
|
||||
|
||||
#endif // !defined( __VAX) && (__CRTL_VER >= 70301000)
|
||||
|
@@ -9,6 +9,8 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <decc$types.h> // Required early for large-file support
|
||||
|
||||
#define CASE_INSENSITIVE_FILENAME // Open VMS is case insensitive
|
||||
#define SPACE_IN_FILENAME // There could be space between user and passwd
|
||||
#define FNAME_ILLEGAL "|*#?%" // Illegal characters in a file name
|
||||
@@ -146,6 +148,15 @@
|
||||
#define FEAT_IPV6
|
||||
#define FEAT_XTERM_SAVE
|
||||
|
||||
#define VIM_SIZEOF_INT 4
|
||||
#define VIM_SIZEOF_LONG 4
|
||||
|
||||
#if __USE_OFF64_T
|
||||
# define SIZEOF_OFF_T 8
|
||||
#else
|
||||
# define SIZEOF_OFF_T 4
|
||||
#endif
|
||||
|
||||
// Hardware specific
|
||||
#if defined(__VAX) || defined(VAX)
|
||||
#undef HAVE_GETTIMEOFDAY
|
||||
@@ -156,36 +167,31 @@
|
||||
#undef HAVE_ISNAN
|
||||
#undef HAVE_XOS_R_H
|
||||
#define HAVE_NO_LONG_LONG
|
||||
#define VIM_SIZEOF_INT 4
|
||||
#define VIM_SIZEOF_LONG 4
|
||||
#define LONG_LONG_MIN (-2147483647-1)
|
||||
#define LONG_LONG_MAX (2147483647)
|
||||
#define ULONG_LONG_MAX (4294967295U)
|
||||
|
||||
#else // ALPHA, IA64, X86_64
|
||||
#define HAVE_FSEEKO /* Use off_t. */
|
||||
#define HAVE_GETTIMEOFDAY
|
||||
#define HAVE_USLEEP
|
||||
#define HAVE_STRCASECMP
|
||||
#define HAVE_STRINGS_H
|
||||
#define HAVE_SIGSETJMP
|
||||
#define HAVE_ISNAN
|
||||
#undef HAVE_XOS_R_H
|
||||
#undef HAVE_NO_LONG_LONG
|
||||
#define VIM_SIZEOF_INT 4
|
||||
#define VIM_SIZEOF_LONG 8
|
||||
#define LONG_LONG_MIN (-9223372036854775807-1)
|
||||
#define LONG_LONG_MAX (9223372036854775807)
|
||||
#define ULONG_LONG_MAX (18446744073709551615U)
|
||||
|
||||
#if defined(__x86_64) || defined(__x86_64__)
|
||||
#if !defined(X86_64)
|
||||
#define X86_64
|
||||
#endif
|
||||
#define HAVE_ISNAN
|
||||
#if defined(__DECC) && (__CRTL_VER >= 80500000) && (__STDC_VERSION__ >= 199901L) /* C99 */
|
||||
#define HAVE_ISINF
|
||||
#define HAVE_ISNAN
|
||||
#endif
|
||||
|
||||
#define HAVE_XOS_R_H
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* VAX [else] */
|
||||
|
||||
// Compiler specific
|
||||
#if defined(VAXC) || defined(__VAXC)
|
||||
|
12
src/po/vim.pot
generated
12
src/po/vim.pot
generated
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-07-25 18:40+0200\n"
|
||||
"POT-Creation-Date: 2025-07-25 19:14+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -1540,7 +1540,13 @@ msgstr ""
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
"Where case is ignored prepend / to make flag upper case"
|
||||
"Where command is down-cased, prepend / (like: -/R) to treat flag as upper-"
|
||||
"case."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
"Or, where supported, SET PROC/PARSE=EXT, or else quote upper-case material."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
@@ -3386,7 +3392,7 @@ msgstr ""
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
"OpenVMS version"
|
||||
"OpenVMS (build) arch, version"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
|
@@ -719,6 +719,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1591,
|
||||
/**/
|
||||
1590,
|
||||
/**/
|
||||
@@ -4158,13 +4160,19 @@ list_version(void)
|
||||
#endif
|
||||
|
||||
#ifdef VMS
|
||||
msg_puts(_("\nOpenVMS version"));
|
||||
msg_puts(_("\nOpenVMS (build) arch, version"));
|
||||
# ifdef HAVE_PATHDEF
|
||||
if (*compiled_arch != NUL)
|
||||
{
|
||||
msg_puts(" - ");
|
||||
msg_puts(": ");
|
||||
msg_puts((char *)compiled_arch);
|
||||
if (*compiled_vers != NUL)
|
||||
{
|
||||
msg_puts(", ");
|
||||
msg_puts((char *)compiled_vers);
|
||||
}
|
||||
}
|
||||
|
||||
# endif
|
||||
|
||||
#endif
|
||||
|
@@ -24,7 +24,11 @@
|
||||
// ============ the header file puzzle: order matters =========
|
||||
|
||||
#ifdef HAVE_CONFIG_H // GNU autoconf (or something else) was here
|
||||
# ifdef VMS
|
||||
# include "config.h" /* Rely on /INCLUDE to find it. */
|
||||
# else
|
||||
# include "auto/config.h"
|
||||
# endif /* def VMS [else] */
|
||||
# define HAVE_PATHDEF
|
||||
|
||||
/*
|
||||
|
@@ -25,7 +25,7 @@
|
||||
// defines HAVE_ATTRIBUTE_UNUSED
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# ifdef VMS
|
||||
# include "[.auto]config.h"
|
||||
# include "config.h"
|
||||
# else
|
||||
# include "../auto/config.h"
|
||||
# endif
|
||||
|
@@ -1,7 +1,10 @@
|
||||
# VMS MM[KS] makefile for XXD
|
||||
# tested with MMK and MMS as well.
|
||||
#
|
||||
# Maintained by Zoltan Arpadffy <arpadffy@polarhome.com>
|
||||
# Maintained by Zoltan Arpadffy <zoltan.arpadffy@gmail.com>
|
||||
# 2025-05-24 Steven M. Schweda <sms@antinode.info>
|
||||
#
|
||||
######################################################################
|
||||
#
|
||||
# Edit the lines in the Configuration section below to select.
|
||||
#
|
||||
@@ -16,12 +19,6 @@
|
||||
######################################################################
|
||||
# Configuration section.
|
||||
######################################################################
|
||||
# Compiler selection.
|
||||
# Comment out if you use the VAXC compiler
|
||||
######################################################################
|
||||
# DECC = YES
|
||||
|
||||
#####################################################################
|
||||
# Uncomment if want a debug version. Resulting executable is DVIM.EXE
|
||||
######################################################################
|
||||
# DEBUG = YES
|
||||
@@ -32,41 +29,209 @@
|
||||
# Please, do not change anything below without programming experience.
|
||||
######################################################################
|
||||
|
||||
CC = cc
|
||||
# Define old MMK architecture macros when using MMS.
|
||||
#
|
||||
######################################################################
|
||||
# Architecture identification and product destination selection.
|
||||
# Define old MMK architecture macros when using MMS.
|
||||
#
|
||||
.IFDEF MMS$ARCH_NAME # MMS$ARCH_NAME
|
||||
ALPHA_X_ALPHA = 1
|
||||
IA64_X_IA64 = 1
|
||||
VAX_X_VAX = 1
|
||||
X86_64_X_X86_64 = 1
|
||||
.IFDEF ARCH # ARCH
|
||||
ARCH_NAME = $(ARCH)
|
||||
.ELSE # ARCH
|
||||
ARCH_NAME = $(MMS$ARCH_NAME)
|
||||
.ENDIF # ARCH
|
||||
.IFDEF $(ARCH_NAME)_X_ALPHA # $(ARCH_NAME)_X_ALPHA
|
||||
__ALPHA__ = 1
|
||||
.ENDIF # $(ARCH_NAME)_X_ALPHA
|
||||
.IFDEF $(ARCH_NAME)_X_IA64 # $(ARCH_NAME)_X_IA64
|
||||
__IA64__ = 1
|
||||
.ENDIF # $(ARCH_NAME)_X_IA64
|
||||
.IFDEF $(ARCH_NAME)_X_VAX # $(ARCH_NAME)_X_VAX
|
||||
__VAX__ = 1
|
||||
.ENDIF # $(ARCH_NAME)_X_VAX
|
||||
.IFDEF $(ARCH_NAME)_X_X86_64 # $(ARCH_NAME)_X_X86_64
|
||||
__X86_64__ = 1
|
||||
.ENDIF # $(ARCH_NAME)_X_X86_64
|
||||
.ELSE # MMS$ARCH_NAME
|
||||
.IFDEF __MMK__ # __MMK__
|
||||
.IFDEF ARCH # ARCH
|
||||
.IFDEF __$(ARCH)__ # __$(ARCH)__
|
||||
.ELSE # __$(ARCH)__
|
||||
__$(ARCH)__ = 1
|
||||
.ENDIF # __$(ARCH)__
|
||||
.ENDIF # ARCH
|
||||
.ENDIF # __MMK__
|
||||
.ENDIF # MMS$ARCH_NAME
|
||||
#
|
||||
# Combine command-line VAX C compiler macros.
|
||||
#
|
||||
.IFDEF VAXC # VAXC
|
||||
VAXC_OR_FORCE_VAXC = 1
|
||||
.ELSE # VAXC
|
||||
.IFDEF FORCE_VAXC # FORCE_VAXC
|
||||
VAXC_OR_FORCE_VAXC = 1
|
||||
.ENDIF # FORCE_VAXC
|
||||
.ENDIF # VAXC
|
||||
#
|
||||
# Analyze architecture-related and option macros.
|
||||
# (Sense x86_64 before IA64 for old MMK and x86_64 cross tools.)
|
||||
#
|
||||
.IFDEF __X86_64__ # __X86_64__
|
||||
DECC = 1
|
||||
DESTM = X86_64
|
||||
.ELSE # __X86_64__
|
||||
.IFDEF __IA64__ # __IA64__
|
||||
DECC = 1
|
||||
DESTM = IA64
|
||||
.ELSE # __IA64__
|
||||
.IFDEF __ALPHA__ # __ALPHA__
|
||||
DECC = 1
|
||||
DESTM = ALPHA
|
||||
.ELSE # __ALPHA__
|
||||
.IFDEF __VAX__ # __VAX__
|
||||
.IFDEF VAXC_OR_FORCE_VAXC # VAXC_OR_FORCE_VAXC
|
||||
DESTM = VAXV
|
||||
.ELSE # VAXC_OR_FORCE_VAXC
|
||||
DECC = 1
|
||||
DESTM = VAX
|
||||
.ENDIF # VAXC_OR_FORCE_VAXC
|
||||
.ELSE # __VAX__
|
||||
DESTM = UNK
|
||||
UNK_DEST = 1
|
||||
.ENDIF # __VAX__
|
||||
.ENDIF # __ALPHA__
|
||||
.ENDIF # __IA64__
|
||||
.ENDIF # __X86_64__
|
||||
|
||||
.IFDEF DECC
|
||||
CC_DEF = $(CC)/decc
|
||||
.IFDEF PROD # PROD
|
||||
DEST = $(PROD)
|
||||
.ELSE # PROD
|
||||
DEST = $(DESTM)
|
||||
.ENDIF # PROD
|
||||
|
||||
.FIRST
|
||||
.IFDEF __MMK__ # __MMK__
|
||||
@ write sys$output ""
|
||||
.ENDIF # __MMK__
|
||||
#
|
||||
# Create destination directory.
|
||||
@ write sys$output "Destination: [.$(DEST)]"
|
||||
@ write sys$output ""
|
||||
@ if (f$search( "$(DEST).DIR;1") .eqs. "") then -
|
||||
create /directory [.$(DEST)]
|
||||
#
|
||||
# Compiler setup
|
||||
|
||||
# Optimization. The .c.obj rule will override this for specific modules
|
||||
# where the VAX C compilers hang. See VAX_NOOPTIM_LIST, below.
|
||||
OPTIMIZE= /optim
|
||||
|
||||
.IFDEF __VAX__ # __VAX__
|
||||
|
||||
# List of modules for which "Compaq C V6.4-005 on OpenVMS VAX V7.3"
|
||||
# hangs. Add more as needed (plus-separated).
|
||||
VAX_NOOPTIM_LIST = blowfish+regexp+sha256
|
||||
|
||||
# Compiler command.
|
||||
# Default: CC /DECC. On non-VAX, or VAX with only DEC C installed,
|
||||
# /DECC is harmless. If both DEC C and VAX C are installed, and VAX C
|
||||
# was selected as the default, then /DECC must be specified explicitly.
|
||||
# If both are installed, and DEC C is the default, but VAX C is desired,
|
||||
# then define FORCE_VAXC to get VAX C (CC /VAXC). If only VAX C is
|
||||
# installed, then define VAXC to get (plain) CC.
|
||||
|
||||
.IFDEF DECC # DECC
|
||||
CC_DEF = cc /decc
|
||||
PREFIX = /prefix=all
|
||||
.ELSE # DECC
|
||||
.IFDEF FORCE_VAXC # FORCE_VAXC
|
||||
CC_DEF = cc /vaxc
|
||||
.ELSE # FORCE_VAXC
|
||||
CC_DEF = cc
|
||||
.ENDIF # FORCE_VAXC
|
||||
.ENDIF # DECC
|
||||
.ELSE # __VAX__
|
||||
|
||||
# Not VAX, therefore DEC C (/PREFIX).
|
||||
|
||||
CC_DEF = cc /decc
|
||||
PREFIX = /prefix=all
|
||||
|
||||
# These floating-point options are the defaults on IA64 and x86_64.
|
||||
# This makes Alpha consistent.
|
||||
FLOAT = /float = ieee_float /ieee_mode = denorm_results
|
||||
|
||||
# Large-file support. Unavailable on VAX and very old Alpha. To
|
||||
# disable, define NOLARGE.
|
||||
.IFDEF NOLARGE
|
||||
.ELSE
|
||||
CC_DEF = $(CC)
|
||||
PREFIX =
|
||||
.ENDIF
|
||||
LARGE_DEF = , "_LARGEFILE"
|
||||
.ENDIF # NOLARGE [ELSE]
|
||||
.ENDIF # __VAX__ [ELSE]
|
||||
|
||||
.IFDEF VAXC_OR_FORCE_VAXC # VAXC_OR_FORCE_VAXC
|
||||
.ELSE # VAXC_OR_FORCE_VAXC
|
||||
CCVER = YES # Unreliable with VAX C.
|
||||
.ENDIF # VAXC_OR_FORCE_VAXC [ELSE]
|
||||
|
||||
CDEFS = VMS $(LARGE_DEF)
|
||||
DEFS = /define = ($(CDEFS))
|
||||
|
||||
.IFDEF LIST # LIST
|
||||
LIST_OPT = /list=[.$(DEST)] /show=(all, nomessages)
|
||||
.ENDIF # LIST
|
||||
|
||||
.IFDEF DEBUG # DEBUG
|
||||
TARGET = [.$(DEST)]dxxd.exe
|
||||
CFLAGS = /debug/noopt$(PREFIX) $(LIST_OPT) /cross_reference/include=[]
|
||||
LDFLAGS = /debug
|
||||
.ELSE # DEBUG
|
||||
TARGET = [.$(DEST)]xxd.exe
|
||||
CFLAGS = $(OPTIMIZE) $(PREFIX) $(LIST_OPT) /include=[]
|
||||
|
||||
LDFLAGS =
|
||||
.ENDIF # DEBUG [ELSE]
|
||||
|
||||
CC = $(CC_DEF) $(CFLAGS)
|
||||
|
||||
LD_DEF = link
|
||||
|
||||
.IFDEF DEBUG
|
||||
TARGET = dxxd.exe
|
||||
CFLAGS = /debug/noopt$(PREFIX)/cross_reference/include=[]
|
||||
LDFLAGS = /debug
|
||||
.ELSE
|
||||
TARGET = xxd.exe
|
||||
CFLAGS = /opt$(PREFIX)/include=[]
|
||||
LDFLAGS =
|
||||
.ENDIF
|
||||
|
||||
.SUFFIXES : .obj .c
|
||||
|
||||
SOURCES = xxd.c
|
||||
OBJ = xxd.obj
|
||||
OBJ_BASE = xxd.obj
|
||||
OBJ = [.$(DEST)]$(OBJ_BASE)
|
||||
|
||||
.c.obj :
|
||||
$(CC_DEF) $(CFLAGS) $<
|
||||
$(CC) $(DEFS) $< /object = $@
|
||||
|
||||
$(TARGET) : $(OBJ)
|
||||
$(LD_DEF) $(LDFLAGS) /exe=$(TARGET) $+
|
||||
-@ def_dev_dir_orig = f$environment( "default")
|
||||
-@ target_name_type = -
|
||||
f$parse( "$(TARGET)", , , "NAME", "SYNTAX_ONLY")+ -
|
||||
f$parse( "$(TARGET)", , , "TYPE", "SYNTAX_ONLY")
|
||||
-@ set default [.$(DEST)]
|
||||
$(LD_DEF) $(LDFLAGS) /exe = 'target_name_type' $(OBJ_BASE)
|
||||
-@ set default 'def_dev_dir_orig'
|
||||
|
||||
clean :
|
||||
-@ if "''F$SEARCH("*.obj")'" .NES. "" then delete/noconfirm/nolog *.obj;*
|
||||
-@ if "''F$SEARCH("*.exe")'" .NES. "" then delete/noconfirm/nolog *.exe;*
|
||||
-@ if (f$search( "[.$(DEST)]*.*") .nes. "") then -
|
||||
delete /noconfirm [.$(DEST)]*.*;*
|
||||
-@ if (f$search( "$(DEST).DIR") .nes. "") then -
|
||||
set protection = w:d $(DEST).DIR;*
|
||||
-@ if (f$search( "$(DEST).DIR") .nes. "") then -
|
||||
delete /noconfirm $(DEST).DIR;*
|
||||
|
||||
xxd.obj : xxd.c
|
||||
help :
|
||||
mcr sys$disk:$(TARGET) -h
|
||||
|
||||
version :
|
||||
mcr sys$disk:$(TARGET) -v
|
||||
|
||||
|
||||
[.$(DEST)]xxd.obj : xxd.c
|
||||
|
Reference in New Issue
Block a user