1 |
106 |
markom |
/*
|
2 |
|
|
* Program to generate the so-thresh testcase,
|
3 |
|
|
* including associated linked-against shared libraries.
|
4 |
|
|
* Build as:
|
5 |
|
|
*
|
6 |
|
|
* cc -g -o genso-thresh genso-thresh.c
|
7 |
|
|
*
|
8 |
|
|
* Invoke as:
|
9 |
|
|
*
|
10 |
|
|
* genso-thresh
|
11 |
|
|
*
|
12 |
|
|
* It will put all the code in the current directory (".").
|
13 |
|
|
*
|
14 |
|
|
* A makefile can also be generated if the -makemake option is used.
|
15 |
|
|
* To use the makefile:
|
16 |
|
|
*
|
17 |
|
|
* make -f so-thresh.mk all
|
18 |
|
|
*
|
19 |
|
|
* The name of the application is
|
20 |
|
|
*
|
21 |
|
|
* so-thresh
|
22 |
|
|
*
|
23 |
|
|
* (Revised from a program by John Bishop. --rehrauer)
|
24 |
|
|
*/
|
25 |
|
|
|
26 |
|
|
#include <stdio.h>
|
27 |
|
|
#include <sys/stat.h>
|
28 |
|
|
#include <sys/fcntl.h>
|
29 |
|
|
|
30 |
|
|
int main (argc, argv)
|
31 |
|
|
int argc;
|
32 |
|
|
char **argv;
|
33 |
|
|
{
|
34 |
|
|
#define NUMBER_OF_INT_VARS 1500
|
35 |
|
|
#define NUMBER_OF_LIBS 3
|
36 |
|
|
int lib_num = NUMBER_OF_LIBS;
|
37 |
|
|
int i;
|
38 |
|
|
int i2;
|
39 |
|
|
FILE *main_file;
|
40 |
|
|
FILE *lib_file;
|
41 |
|
|
FILE *make_file;
|
42 |
|
|
FILE *link_file;
|
43 |
|
|
|
44 |
|
|
char testcase_name [1000];
|
45 |
|
|
char linkfile_name [1000];
|
46 |
|
|
char makefile_name [1000];
|
47 |
|
|
char mainfile_name [1000];
|
48 |
|
|
|
49 |
|
|
char file_name[100];
|
50 |
|
|
/*
|
51 |
|
|
* 0123456789 <-- length of field
|
52 |
|
|
* "./fil0000000002.c"; <-- typical filename
|
53 |
|
|
* 12345678901234567890 <-- length of string
|
54 |
|
|
* 10 20
|
55 |
|
|
* ^where null goes
|
56 |
|
|
*/
|
57 |
|
|
char file_name_core[100];
|
58 |
|
|
|
59 |
|
|
/* Verify input.
|
60 |
|
|
*/
|
61 |
|
|
if ((argc < 1) || (argc > 2) || (argv == NULL) ||
|
62 |
|
|
((argc == 2) && (strcmp (argv[1], "-makemake") != 0)))
|
63 |
|
|
{
|
64 |
|
|
printf ("** Syntax: %s [-makemake]\n", argv[0]);
|
65 |
|
|
return;
|
66 |
|
|
}
|
67 |
|
|
|
68 |
|
|
if (strncmp (argv[0], "gen", 3) != 0)
|
69 |
|
|
{
|
70 |
|
|
printf ("** This tool expected to be named \"gen<something>\"\n");
|
71 |
|
|
return;
|
72 |
|
|
}
|
73 |
|
|
strcpy (testcase_name, argv[0]+3);
|
74 |
|
|
|
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);
|
79 |
|
|
|
80 |
|
|
/* Generate the makefile, if requested.
|
81 |
|
|
*/
|
82 |
|
|
if (argc == 2)
|
83 |
|
|
{
|
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++)
|
105 |
|
|
{
|
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");
|
109 |
|
|
}
|
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++)
|
114 |
|
|
{
|
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);
|
119 |
|
|
}
|
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");
|
160 |
|
|
fclose (make_file);
|
161 |
|
|
}
|
162 |
|
|
|
163 |
|
|
/* Generate the code for the libraries.
|
164 |
|
|
*/
|
165 |
|
|
for (i=0; i < lib_num; i++) {
|
166 |
|
|
|
167 |
|
|
/* Generate the names for the library.
|
168 |
|
|
*/
|
169 |
|
|
sprintf (file_name, "lib%2.2d-%s.c", i, testcase_name);
|
170 |
|
|
sprintf (file_name_core, "lib%2.2d-%s", i, testcase_name);
|
171 |
|
|
|
172 |
|
|
/* Generate the source code.
|
173 |
|
|
*/
|
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");
|
188 |
|
|
fclose (lib_file);
|
189 |
|
|
|
190 |
|
|
/* Add a linker options line
|
191 |
|
|
*/
|
192 |
|
|
fprintf (link_file, "-l%2.2d-%s\n", i, testcase_name);
|
193 |
|
|
}
|
194 |
|
|
|
195 |
|
|
/* Generate the "main" file.
|
196 |
|
|
*/
|
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",
|
201 |
|
|
lib_num);
|
202 |
|
|
fprintf (main_file, "#include <stdio.h>\n\n");
|
203 |
|
|
|
204 |
|
|
for (i = 0; i < lib_num; i++) {
|
205 |
|
|
fprintf (main_file, "extern int r_%d();\n", i);
|
206 |
|
|
}
|
207 |
|
|
|
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);
|
213 |
|
|
|
214 |
|
|
for (i = 0; i < lib_num; i++) {
|
215 |
|
|
fprintf (main_file, " accum += r_%d();\n", i);
|
216 |
|
|
}
|
217 |
|
|
|
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");
|
222 |
|
|
fclose (main_file);
|
223 |
|
|
|
224 |
|
|
/* Finish up the link file and the build file
|
225 |
|
|
*/
|
226 |
|
|
fclose (link_file);
|
227 |
|
|
}
|
228 |
|
|
|
229 |
|
|
/* End of file */
|