This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix .gitignore: only ignore 'perl' in root of repo, not U/perl subdir
[metaconfig.git] / U / perl / usensgetexecutablepath.U
CommitLineData
c0f9c291
MB
1?MAKE:usensgetexecutablepath: cat rm_try Compile run Setvar
2?MAKE: -pick add $@ %<
3?S:usensgetexecutablepath:
4?S: This symbol, if defined, indicates that we can use _NSGetExecutablePath
5?S: and realpath to get a full path for the executable, and hence convert
6?S: $^X to an absolute path.
7?S:.
8?C:USE_NSGETEXECUTABLEPATH:
9?C: This symbol, if defined, indicates that we can use _NSGetExecutablePath
10?C: and realpath to get a full path for the executable, and hence convert
11?C: $^X to an absolute path.
12?C:.
13?H:#$usensgetexecutablepath USE_NSGETEXECUTABLEPATH /**/
14?H:.
15?LINT:set usensgetexecutablepath
16?F:!try
17: Determine if we can use _NSGetExecutablePath to find executing program
18echo " "
19echo "Determining whether we can use _NSGetExecutablePath to find executing program..." >&4
20$cat >try.c <<'EOM'
21/* Intentionally a long probe as I'd like to sanity check that the exact
22 approach is going to work, as thinking it will work, but only having it
23 part working at runtime is worse than not having it. */
24#include <mach-o/dyld.h>
25#include <stdio.h>
26#include <stdlib.h>
27#include <sys/param.h>
28#include <string.h>
29
30int
31main(int argc, char **argv) {
32 char buf[1];
33 uint32_t size = sizeof(buf);
34 int result;
35 char *buffer;
36 char *tidied;
37 char *argv_leaf = strrchr(argv[0], '/');
38 char *tidied_leaf;
39
40 if (!argv_leaf) {
41 fprintf(stderr, "Can't locate / in '%s'\n", argv[0]);
42 return 1;
43 }
44
45 _NSGetExecutablePath(buf, &size);
46 if (size > MAXPATHLEN * MAXPATHLEN) {
47 fprintf(stderr, "_NSGetExecutablePath size %u is too long for a path\n",
48 (unsigned int) size);
49 return 2;
50 }
51
fcd0577a 52 buffer = (char *)malloc(size);
c0f9c291
MB
53 if (!buffer) {
54 perror("malloc");
55 return 3;
56 }
57
58 result = _NSGetExecutablePath(buffer, &size);
59 if (result != 0) {
60 fprintf(stderr, "_NSGetExecutablePath returned %i for a size of %u\n",
61 result, (unsigned int) size);
62 return 4;
63 }
64
65 tidied = realpath(buffer, NULL);
66 if (!tidied) {
67 perror("realpath");
68 return 5;
69 }
70
71 free(buffer);
72
73 if (*tidied != '/') {
74 fprintf(stderr, "Not an absolute path: '%s'\n", tidied);
75 return 6;
76 }
77
78 if (strstr(tidied, "/./")) {
79 fprintf(stderr, "Contains /./: '%s'\n", tidied);
80 return 7;
81 }
82
83 if (strstr(tidied, "/../")) {
84 fprintf(stderr, "Contains /../: '%s'\n", tidied);
85 return 8;
86 }
87
88 tidied_leaf = strrchr(tidied, '/');
89 if (strcmp(tidied_leaf, argv_leaf) != 0) {
90 fprintf(stderr, "Leafnames differ: '%s' vs '%s'\n", argv[0], tidied);
91 return 9;
92 }
93
94 free(tidied);
95
96 return 0;
97}
98EOM
99
100val=$undef
101set try
c6c92559 102if eval $compile; then
c0f9c291
MB
103 if $run ./try; then
104 echo "You can use _NSGetExecutablePath to find the executing program." >&4
105 val="$define"
106 else
107 echo "Nope, _NSGetExecutablePath doesn't work here." >&4
108 fi
109else
110 echo "I'm unable to compile the test program." >&4
111 echo "I'll assume no _NSGetExecutablePath here." >&4
112fi
113$rm_try
114set usensgetexecutablepath
115eval $setvar
116