2 * Program to generate the so-thresh testcase,
3 * including associated linked-against shared libraries.
6 * cc -g -o genso-thresh genso-thresh.c
12 * It will put all the code in the current directory (".").
14 * A makefile can also be generated if the -makemake option is used.
15 * To use the makefile:
17 * make -f so-thresh.mk all
19 * The name of the application is
23 * (Revised from a program by John Bishop. --rehrauer)
28 #include <sys/fcntl.h>
34 #define NUMBER_OF_INT_VARS 1500
35 #define NUMBER_OF_LIBS 3
36 int lib_num
= NUMBER_OF_LIBS
;
44 char testcase_name
[1000];
45 char linkfile_name
[1000];
46 char makefile_name
[1000];
47 char mainfile_name
[1000];
51 * 0123456789 <-- length of field
52 * "./fil0000000002.c"; <-- typical filename
53 * 12345678901234567890 <-- length of string
57 char file_name_core
[100];
61 if ((argc
< 1) || (argc
> 2) || (argv
== NULL
) ||
62 ((argc
== 2) && (strcmp (argv
[1], "-makemake") != 0)))
64 printf ("** Syntax: %s [-makemake]\n", argv
[0]);
68 if (strncmp (argv
[0], "gen", 3) != 0)
70 printf ("** This tool expected to be named \"gen<something>\"\n");
73 strcpy (testcase_name
, argv
[0]+3);
75 strcpy (linkfile_name
, testcase_name
);
76 strcat (linkfile_name
, ".lopt");
77 link_file
= fopen (linkfile_name
, "w");
78 fprintf (link_file
, "# Linker options for %s test\n", testcase_name
);
80 /* Generate the makefile, if requested.
84 strcpy (makefile_name
, testcase_name
);
85 strcat (makefile_name
, ".mk.new");
86 make_file
= fopen (makefile_name
, "w");
87 printf (" Note: New makefile (%s) generated.\n", makefile_name
);
88 printf (" May want to update existing makefile, if any.\n");
89 fprintf (make_file
, "# Generated automatically by %s\n", argv
[0]);
90 fprintf (make_file
, "# Make file for %s test\n", testcase_name
);
91 fprintf (make_file
, "\n");
92 fprintf (make_file
, "CFLAGS = +DA1.1 -g\n");
93 fprintf (make_file
, "\n");
94 fprintf (make_file
, "# This is how to build this generator.\n");
95 fprintf (make_file
, "%s.o: %s.c\n", argv
[0], argv
[0]);
96 fprintf (make_file
, "\t$(CC) $(CFLAGS) -o %s.o -c %s.c\n", argv
[0], argv
[0]);
97 fprintf (make_file
, "%s: %s.o\n", argv
[0], argv
[0]);
98 fprintf (make_file
, "\t$(CC) $(CFLAGS) -o %s %s.o\n", argv
[0], argv
[0]);
99 fprintf (make_file
, "\n");
100 fprintf (make_file
, "# This is how to run this generator.\n");
101 fprintf (make_file
, "# This target should be made before the 'all' target,\n");
102 fprintf (make_file
, "# to ensure that the shlib sources are all available.\n");
103 fprintf (make_file
, "require_shlibs: %s\n", argv
[0]);
104 for (i
=0; i
< lib_num
; i
++)
106 fprintf (make_file
, "\tif ! [ -a lib%2.2d_%s.c ] ; then \\\n", i
, testcase_name
);
107 fprintf (make_file
, "\t %s ; \\\n", argv
[0]);
108 fprintf (make_file
, "\tfi\n");
110 fprintf (make_file
, "\n");
111 fprintf (make_file
, "# This is how to build all the shlibs.\n");
112 fprintf (make_file
, "# Be sure to first make the require_shlibs target!\n");
113 for (i
=0; i
< lib_num
; i
++)
115 fprintf (make_file
, "lib%2.2d_%s.o: lib%2.2d_%s.c\n", i
, testcase_name
, i
, testcase_name
);
116 fprintf (make_file
, "\t$(CC) $(CFLAGS) +Z -o lib%2.2d_%s.o -c lib%2.2d_%s.c\n", i
, testcase_name
, i
, testcase_name
);
117 fprintf (make_file
, "lib%2.2d-%s.sl: lib%2.2d-%s.o\n", i
, testcase_name
, i
, testcase_name
);
118 fprintf (make_file
, "\t$(LD) $(LDFLAGS) -b -o lib%2.2d-%s.sl lib%2.2d-%s.o\n", i
, testcase_name
, i
, testcase_name
);
120 fprintf (make_file
, "\n");
121 fprintf (make_file
, "# For convenience, here's names for all pieces of all shlibs.\n");
122 fprintf (make_file
, "SHLIB_SOURCES = \\\n");
123 for (i
=0; i
< lib_num
-1; i
++)
124 fprintf (make_file
, "\tlib%2.2d-%s.c \\\n", i
, testcase_name
);
125 fprintf (make_file
, "\tlib%2.2d-%s.c\n", lib_num
-1, testcase_name
);
126 fprintf (make_file
, "SHLIB_OBJECTS = $(SHLIB_SOURCES:.c=.o)\n");
127 fprintf (make_file
, "SHLIBS = $(SHLIB_SOURCES:.c=.sl)\n");
128 fprintf (make_file
, "SHLIB_NAMES = $(SHLIB_SOURCES:.c=)\n");
129 fprintf (make_file
, "EXECUTABLES = $(SHLIBS) %s %s\n", argv
[0], testcase_name
);
130 fprintf (make_file
, "OBJECT_FILES = $(SHLIB_OBJECTS) %s.o %s.o\n", argv
[0], testcase_name
);
131 fprintf (make_file
, "\n");
132 fprintf (make_file
, "shlib_objects: $(SHLIB_OBJECTS)\n");
133 fprintf (make_file
, "shlibs: $(SHLIBS)\n");
134 fprintf (make_file
, "\n");
135 fprintf (make_file
, "# This is how to build the debuggable testcase that uses the shlibs.\n");
136 fprintf (make_file
, "%s.o: %s.c\n", testcase_name
, testcase_name
);
137 fprintf (make_file
, "\t$(CC) $(CFLAGS) -o %s.o -c %s.c\n", testcase_name
, testcase_name
);
138 fprintf (make_file
, "%s: shlibs %s.o\n", testcase_name
, testcase_name
);
139 fprintf (make_file
, "\t$(LD) $(LDFLAGS) -o %s -lc -L. ", testcase_name
);
140 fprintf (make_file
, "-c %s /opt/langtools/lib/end.o /lib/crt0.o %s.o\n", linkfile_name
, testcase_name
);
141 fprintf (make_file
, "\n");
142 fprintf (make_file
, "# Yeah, but you should first make the require_shlibs target!\n");
143 fprintf (make_file
, "all: %s %s\n", testcase_name
, argv
[0]);
144 fprintf (make_file
, "\n");
145 fprintf (make_file
, "# To remove everything built via this makefile...\n");
146 fprintf (make_file
, "clean:\n");
147 /* Do this carefully, to avoid hitting silly HP-UX ARG_MAX limits... */
148 fprintf (make_file
, "\trm -f lib0*-%s.*\n", testcase_name
);
149 fprintf (make_file
, "\trm -f lib1*-%s.*\n", testcase_name
);
150 fprintf (make_file
, "\trm -f lib2*-%s.*\n", testcase_name
);
151 fprintf (make_file
, "\trm -f lib3*-%s.*\n", testcase_name
);
152 fprintf (make_file
, "\trm -f lib4*-%s.*\n", testcase_name
);
153 fprintf (make_file
, "\trm -f lib5*-%s.*\n", testcase_name
);
154 fprintf (make_file
, "\trm -f lib6*-%s.*\n", testcase_name
);
155 fprintf (make_file
, "\trm -f lib7*-%s.*\n", testcase_name
);
156 fprintf (make_file
, "\trm -f lib8*-%s.*\n", testcase_name
);
157 fprintf (make_file
, "\trm -f lib9*-%s.*\n", testcase_name
);
158 fprintf (make_file
, "\trm -f %s %s %s %s.c\n", argv
[0], testcase_name
, linkfile_name
, testcase_name
);
159 fprintf (make_file
, "\n");
163 /* Generate the code for the libraries.
165 for (i
=0; i
< lib_num
; i
++) {
167 /* Generate the names for the library.
169 sprintf (file_name
, "lib%2.2d-%s.c", i
, testcase_name
);
170 sprintf (file_name_core
, "lib%2.2d-%s", i
, testcase_name
);
172 /* Generate the source code.
174 lib_file
= fopen (file_name
, "w");
175 fprintf (lib_file
, "/* Shared library file number %d */\n", i
);
176 fprintf (lib_file
, "#include <stdio.h>\n\n");
177 fprintf (lib_file
, "/* The following variables largely exist to bloat this library's debug info. */\n");
178 fprintf (lib_file
, "static char c_static_buf_%d [100];\n", i
);
179 for (i2
=0; i2
<NUMBER_OF_INT_VARS
; i2
++)
180 fprintf (lib_file
, "int i_%d_%d;\n", i
, i2
);
181 fprintf (lib_file
, "\nint r_%d ()\n", i
);
182 fprintf (lib_file
, "{\n");
183 for (i2
=0; i2
<NUMBER_OF_INT_VARS
; i2
++)
184 fprintf (lib_file
, " i_%d_%d = %d*%d;\n", i
, i2
, i2
, i2
);
185 fprintf (lib_file
, " return 1;\n");
186 fprintf (lib_file
, "}\n\n");
187 fprintf (lib_file
, "/* end of generated file */\n");
190 /* Add a linker options line
192 fprintf (link_file
, "-l%2.2d-%s\n", i
, testcase_name
);
195 /* Generate the "main" file.
197 strcpy (mainfile_name
, testcase_name
);
198 strcat (mainfile_name
, ".c");
199 main_file
= fopen (mainfile_name
, "w");
200 fprintf (main_file
, "/* Generated test progam with %d shared libraries. */\n\n",
202 fprintf (main_file
, "#include <stdio.h>\n\n");
204 for (i
= 0; i
< lib_num
; i
++) {
205 fprintf (main_file
, "extern int r_%d();\n", i
);
208 fprintf (main_file
, "\n");
209 fprintf (main_file
, "int main()\n");
210 fprintf (main_file
, "{\n");
211 fprintf (main_file
, " int accum;\n");
212 fprintf (main_file
, " int lib_num = %d;\n", lib_num
);
214 for (i
= 0; i
< lib_num
; i
++) {
215 fprintf (main_file
, " accum += r_%d();\n", i
);
218 fprintf (main_file
, " printf( \"Final value: %%d, should be %%d\\n\", accum, lib_num );\n\n");
219 fprintf (main_file
, " return 0;\n");
220 fprintf (main_file
, "}\n\n");
221 fprintf (main_file
, "/* end of generated file */\n");
224 /* Finish up the link file and the build file