#
CFLAGS-cobol/gcobolspec.o += $(DRIVER_DEFINES)
+CFLAGS-cobol/cobol1.o += -DLIBSUBDIR=\"$(libsubdir)\"
+
#
# This controls the build of the gcobol "driver"
#
int dummy;
};
+static const char dir_separator[] = {DIR_SEPARATOR, 0};
+
/*
* Language hooks.
*/
}
}
+static void
+libcompat_copybook(const char *dir)
+ {
+ char *gnu = concat(dir, NULL);
+
+ if (gnu[strlen(gnu) - 1] != DIR_SEPARATOR)
+ gnu = concat(gnu, dir_separator, NULL);
+
+ gnu = concat(gnu, "compat", dir_separator, "gnu", NULL);
+
+ char *paths[] =
+ {
+ concat(gnu, dir_separator, "lib", NULL),
+ concat(gnu, dir_separator, "cpy", NULL),
+ concat(gnu, dir_separator, "udf", NULL)
+ };
+
+ for (size_t i = 0; i < sizeof paths / sizeof *paths; i++)
+ {
+ // Inject the installation prefix paths to the libcompat copybooks.
+ copybook_directory_add(paths[i]);
+ free(paths[i]);
+ }
+
+ free(gnu);
+ }
+
+static void
+libposix_copybook(const char *dir)
+ {
+ char *posix = concat(dir, NULL);
+
+ if (posix[strlen(posix) - 1] != DIR_SEPARATOR)
+ posix = concat(posix, dir_separator, NULL);
+
+ posix = concat(posix, "posix", NULL);
+
+ char *paths[] =
+ {
+ concat(posix, dir_separator, "cpy", NULL),
+ concat(posix, dir_separator, "udf", NULL),
+ };
+
+ for (size_t i = 0; i < sizeof paths / sizeof *paths; i++)
+ {
+ copybook_directory_add(paths[i]);
+ free(paths[i]);
+ }
+
+ free(posix);
+ }
+
+static void
+append_copybook_prefix(const char *prefix, void (*fn)(const char *))
+ {
+ char *opts[] =
+ {
+ concat(prefix, dir_separator, "cobol", NULL),
+ concat(prefix, NULL),
+ NULL
+ };
+
+ for (char **s = opts; *s; ++s)
+ {
+ fn(*s);
+ free(*s);
+ }
+ }
+
void cobol_warning( cbl_diag_id_t id, int yn, bool );
void cobol_warning_suppress( cbl_dialect_t dialect );
switch(code)
{
+ case OPT_B:
+ append_copybook_prefix(arg, libcompat_copybook);
+ append_copybook_prefix(arg, libposix_copybook);
+ return true;
case OPT_D:
defined_cmd(arg);
return true;
copybook_directory_add(arg);
return true;
case OPT_copyext:
- copybook_extension_add(cobol_copyext);
+ case OPT_isystem:
+ case OPT_idirafter:
+ copybook_extension_add(arg);
return true;
case OPT_fexec_charset_:
return NULL;
}
+static bool
+cobol_langhook_post_options (const char **pfilename ATTRIBUTE_UNUSED)
+ {
+ append_copybook_prefix(LIBSUBDIR, libcompat_copybook);
+ append_copybook_prefix(LIBSUBDIR, libposix_copybook);
+ return false;
+ }
+
char *
cobol_name_mangler(const char *cobol_name_)
{
#undef LANG_HOOKS_GETDECLS
#undef LANG_HOOKS_GLOBAL_BINDINGS_P
#undef LANG_HOOKS_HANDLE_OPTION
+#undef LANG_HOOKS_POST_OPTIONS
#undef LANG_HOOKS_INIT
#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
#undef LANG_HOOKS_NAME
#define LANG_HOOKS_INIT_OPTIONS_STRUCT cobol_langhook_init_options_struct
#define LANG_HOOKS_HANDLE_OPTION cobol_langhook_handle_option
+#define LANG_HOOKS_POST_OPTIONS cobol_langhook_post_options
#define LANG_HOOKS_BUILTIN_FUNCTION cobol_langhook_builtin_function
#define LANG_HOOKS_GETDECLS cobol_langhook_getdecls
}
}
- char dir_separator[] = {DIR_SEPARATOR, 0},
- *tooldir = concat (STANDARD_EXEC_PREFIX, DEFAULT_TARGET_MACHINE,
- dir_separator, DEFAULT_TARGET_VERSION,
- dir_separator, "cobol", NULL);
-
/* As described above, we have empirically noticed that when the command line
explicitly specifies libgcobol.a as an input, a following -lgcobol causes
the "on exit" functions of the library to be executed twice. This can
}
if( need_libcompat )
{
- char *gnu = concat(tooldir, dir_separator, "compat", dir_separator, "gnu", NULL);
add_arg_lib(COMPAT_LIBRARY, static_libcompat);
-
- // Inject the installation prefix paths to the libcompat copybooks.
- // Note that these paths are inevitably leaked as append_option
- // takes a const char *, but does not copy the string.
- // Ideally, these paths could be constructed at preprocessor-time,
- // but unfortunately DIR_SEPARATOR defines an integer, not a string.
- // Maybe a DIR_SEPARATOR-like macro could be defined instead, but that
- // can be fragile in terms of portability, and the usual practice in
- // gcc is to dynamically define it as a 2-element array, anyway.
- append_option(OPT_I, concat(gnu, dir_separator, "lib", NULL), 1);
- append_option(OPT_I, concat(gnu, dir_separator, "cpy", NULL), 1);
- append_option(OPT_I, concat(gnu, dir_separator, "udf", NULL), 1);
- free(gnu);
}
if( need_libdl )
{
}
if( need_libposix )
{
- char *posix = concat(tooldir, dir_separator, "posix", NULL);
-
add_arg_lib(POSIX_LIBRARY, static_libposix);
- // Inject the paths to the libposix copybooks.
- // As explained above, note that these paths are inevitably leaked.
- append_option(OPT_I, concat(posix, dir_separator, "cpy", NULL), 1);
- append_option(OPT_I, concat(posix, dir_separator, "udf", NULL), 1);
- free(posix);
}
if( prior_main )
fatal_error(input_location, "%s", ach);
}
- free(tooldir);
-
// We now take the new_opt vector, and turn it into an array of
// cl_decoded_option
{".CBL", "@cobol", 0, 0, 0},
{"@cobol",
"cobol1 %i %(cc1_options) "
- "%{D*} %{E} %{I*} %{M} %{fmax-errors*} %{fsyntax-only*} "
+ "%I "
+ "%{B*} %{D*} %{E} %{I*} %{M} %{fmax-errors*} %{fsyntax-only*} "
+ "%{idirafter}"
"%{fcobol-exceptions*} "
"%{copyext} "
"%{fdefaultbyte} "
Language
Cobol
+B
+Cobol
+; Documented in c.opt
+
D
Cobol Joined Separate
; Documented in c.opt
Cobol Joined Separate
; Documented in C
+idirafter
+Cobol Joined Separate
+; Documented in c.opt
+
main
Cobol
-main The first program-id in the next source file is called by a generated main() entry point.
+++ /dev/null
- >> PUSH source format
- >>SOURCE format is fixed
-
- * The information is returned to the file-info argument, which
- * is defined as the following 16-byte area:
-
- 01 cblt-fileexist-buf typedef.
- 03 cblte-fe-filesize PIC X(8) COMP-X.
- 03 cblte-fe-date.
- 05 cblte-fe-day PIC X COMP-X.
- 05 cblte-fe-month PIC X COMP-X.
- 05 cblte-fe-year PIC X(2) comp-x.
- 03 cblte-fe-time.
- 05 cblte-fe-hours PIC X COMP-X.
- 05 cblte-fe-minutes PIC X COMP-X.
- 05 cblte-fe-seconds PIC X COMP-X.
- 05 cblte-fe-hundreths PIC X COMP-X.
-
- >> POP source format
mkdir -p `dirname $@`
cp $< $@
+# Bring posix copybooks into the build tree.
+LP_COPYDIR_BUILD = $(PWD)/posix/cpy
+LP_COPYBOOKS = \
+ $(LP_COPYDIR_BUILD)/posix-errno.cpy \
+ $(LP_COPYDIR_BUILD)/posix-exit.cpy \
+ $(LP_COPYDIR_BUILD)/posix-fstat.cpy \
+ $(LP_COPYDIR_BUILD)/posix-ftruncate.cpy \
+ $(LP_COPYDIR_BUILD)/posix-localtime.cpy \
+ $(LP_COPYDIR_BUILD)/posix-lseek.cpy \
+ $(LP_COPYDIR_BUILD)/posix-mkdir.cpy \
+ $(LP_COPYDIR_BUILD)/posix-open.cpy \
+ $(LP_COPYDIR_BUILD)/posix-read.cpy \
+ $(LP_COPYDIR_BUILD)/posix-stat.cpy \
+ $(LP_COPYDIR_BUILD)/psx-lseek.cpy \
+ $(LP_COPYDIR_BUILD)/psx-open.cpy \
+ $(LP_COPYDIR_BUILD)/statbuf.cpy \
+ $(LP_COPYDIR_BUILD)/tm.cpy
+
+$(LP_COPYDIR_BUILD)/%.cpy: ${srcdir}/posix/cpy/%.cpy
+ mkdir -p `dirname $@`
+ cp $< $@
+
# We want to link with the c++ runtime.
libgcobol_la_LINK = $(CXXLINK) $(libgcobol_la_LDFLAGS)
version_arg = -version-info $(LIBGCOBOL_VERSION)
libgcobol_la_LDFLAGS = $(LTLDFLAGS) $(LIBQUADLIB) $(LTLIBICONV) \
$(extra_ldflags_libgcobol) $(LIBS) $(LIBXML2_LIBS) $(version_arg)
-libgcobol_la_DEPENDENCIES = libgcobol.spec $(LIBQUADLIB_DEP) $(LC_COPYBOOKS)
+libgcobol_la_DEPENDENCIES = libgcobol.spec $(LIBQUADLIB_DEP)
# Rules for libgcobol_posix.so and libgcobol_compat_gnu.so, which have
# COBOL sources. They require gcobol and libgcobol to have already
libgcobol_posix_la_LINK = $(CXXLINK) $(libgcobol_posix_la_LDFLAGS)
libgcobol_posix_la_LDFLAGS = $(LTLDFLAGS) $(LIBQUADLIB) $(LTLIBICONV) \
$(extra_ldflags_libgcobol) $(LIBS) $(LIBXML2_LIBS) $(version_arg)
-libgcobol_posix_la_DEPENDENCIES = libgcobol.spec $(LIBQUADLIB_DEP)
+libgcobol_posix_la_DEPENDENCIES = libgcobol.spec $(LIBQUADLIB_DEP) \
+ $(LP_COPYBOOKS)
libgcobol_compat_gnu_la_LINK = $(CXXLINK) $(libgcobol_compat_gnu_la_LDFLAGS)
libgcobol_compat_gnu_la_LDFLAGS = $(LTLDFLAGS) $(LIBQUADLIB) $(LTLIBICONV) \
$(extra_ldflags_libgcobol) $(LIBS) $(LIBXML2_LIBS) $(version_arg)
-libgcobol_compat_gnu_la_DEPENDENCIES = libgcobol.spec $(LIBQUADLIB_DEP)
+libgcobol_compat_gnu_la_DEPENDENCIES = libgcobol.spec $(LIBQUADLIB_DEP) \
+ $(LC_COPYBOOKS)
LTCOBCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
@BUILD_LIBGCOBOL_TRUE@ $(LC_COPYDIR_BUILD)/stored-char-length.cpy
+# Bring posix copybooks into the build tree.
+@BUILD_LIBGCOBOL_TRUE@LP_COPYDIR_BUILD = $(PWD)/posix/cpy
+@BUILD_LIBGCOBOL_TRUE@LP_COPYBOOKS = \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/posix-errno.cpy \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/posix-exit.cpy \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/posix-fstat.cpy \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/posix-ftruncate.cpy \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/posix-localtime.cpy \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/posix-lseek.cpy \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/posix-mkdir.cpy \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/posix-open.cpy \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/posix-read.cpy \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/posix-stat.cpy \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/psx-lseek.cpy \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/psx-open.cpy \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/statbuf.cpy \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYDIR_BUILD)/tm.cpy
+
+
# We want to link with the c++ runtime.
@BUILD_LIBGCOBOL_TRUE@libgcobol_la_LINK = $(CXXLINK) $(libgcobol_la_LDFLAGS)
@BUILD_LIBGCOBOL_TRUE@version_arg = -version-info $(LIBGCOBOL_VERSION)
@BUILD_LIBGCOBOL_TRUE@libgcobol_la_LDFLAGS = $(LTLDFLAGS) $(LIBQUADLIB) $(LTLIBICONV) \
@BUILD_LIBGCOBOL_TRUE@ $(extra_ldflags_libgcobol) $(LIBS) $(LIBXML2_LIBS) $(version_arg)
-@BUILD_LIBGCOBOL_TRUE@libgcobol_la_DEPENDENCIES = libgcobol.spec $(LIBQUADLIB_DEP) $(LC_COPYBOOKS)
+@BUILD_LIBGCOBOL_TRUE@libgcobol_la_DEPENDENCIES = libgcobol.spec $(LIBQUADLIB_DEP)
# Rules for libgcobol_posix.so and libgcobol_compat_gnu.so, which have
# COBOL sources. They require gcobol and libgcobol to have already
@BUILD_LIBGCOBOL_TRUE@libgcobol_posix_la_LDFLAGS = $(LTLDFLAGS) $(LIBQUADLIB) $(LTLIBICONV) \
@BUILD_LIBGCOBOL_TRUE@ $(extra_ldflags_libgcobol) $(LIBS) $(LIBXML2_LIBS) $(version_arg)
-@BUILD_LIBGCOBOL_TRUE@libgcobol_posix_la_DEPENDENCIES = libgcobol.spec $(LIBQUADLIB_DEP)
+@BUILD_LIBGCOBOL_TRUE@libgcobol_posix_la_DEPENDENCIES = libgcobol.spec $(LIBQUADLIB_DEP) \
+@BUILD_LIBGCOBOL_TRUE@ $(LP_COPYBOOKS)
+
@BUILD_LIBGCOBOL_TRUE@libgcobol_compat_gnu_la_LINK = $(CXXLINK) $(libgcobol_compat_gnu_la_LDFLAGS)
@BUILD_LIBGCOBOL_TRUE@libgcobol_compat_gnu_la_LDFLAGS = $(LTLDFLAGS) $(LIBQUADLIB) $(LTLIBICONV) \
@BUILD_LIBGCOBOL_TRUE@ $(extra_ldflags_libgcobol) $(LIBS) $(LIBXML2_LIBS) $(version_arg)
-@BUILD_LIBGCOBOL_TRUE@libgcobol_compat_gnu_la_DEPENDENCIES = libgcobol.spec $(LIBQUADLIB_DEP)
+@BUILD_LIBGCOBOL_TRUE@libgcobol_compat_gnu_la_DEPENDENCIES = libgcobol.spec $(LIBQUADLIB_DEP) \
+@BUILD_LIBGCOBOL_TRUE@ $(LC_COPYBOOKS)
+
@BUILD_LIBGCOBOL_TRUE@LTCOBCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
@BUILD_LIBGCOBOL_TRUE@ --mode=compile $(AM_COBC) $(AM_COBFLAGS)
@BUILD_LIBGCOBOL_TRUE@ mkdir -p `dirname $@`
@BUILD_LIBGCOBOL_TRUE@ cp $< $@
+@BUILD_LIBGCOBOL_TRUE@$(LP_COPYDIR_BUILD)/%.cpy: ${srcdir}/posix/cpy/%.cpy
+@BUILD_LIBGCOBOL_TRUE@ mkdir -p `dirname $@`
+@BUILD_LIBGCOBOL_TRUE@ cp $< $@
+
@BUILD_LIBGCOBOL_TRUE@.cbl.o:
@BUILD_LIBGCOBOL_TRUE@ $(COBC) -o $@ $(COBFLAGS) -c $<