1 # $NetBSD: t_hello.sh,v 1.8 2025/04/16 01:52:42 riastradh Exp $ 2 # 3 # Copyright (c) 2011 The NetBSD Foundation, Inc. 4 # All rights reserved. 5 # 6 # Redistribution and use in source and binary forms, with or without 7 # modification, are permitted provided that the following conditions 8 # are met: 9 # 1. Redistributions of source code must retain the above copyright 10 # notice, this list of conditions and the following disclaimer. 11 # 2. Redistributions in binary form must reproduce the above copyright 12 # notice, this list of conditions and the following disclaimer in the 13 # documentation and/or other materials provided with the distribution. 14 # 15 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 # POSSIBILITY OF SUCH DAMAGE. 26 # 27 28 atf_test_case hello 29 hello_head() { 30 atf_set "descr" "compile and run \"hello world\"" 31 atf_set "require.progs" "c++" 32 } 33 34 atf_test_case hello_profile 35 hello_profile_head() { 36 atf_set "descr" "compile and run \"hello world\" with profiling option" 37 atf_set "require.progs" "c++" 38 } 39 40 atf_test_case hello_profile 41 hello_profile_32_head() { 42 atf_set "descr" "compile and run 32-bit \"hello world\" with profiling option" 43 atf_set "require.progs" "c++" 44 } 45 46 atf_test_case hello_static 47 hello_static_head() { 48 atf_set "descr" "compile and run \"hello world\" with static option" 49 atf_set "require.progs" "c++" 50 } 51 52 atf_test_case hello_pic 53 hello_pic_head() { 54 atf_set "descr" "compile and run PIC \"hello world\"" 55 atf_set "require.progs" "c++" 56 } 57 58 atf_test_case hello_pic_32 59 hello_pic_32_head() { 60 atf_set "descr" "compile and run 32-bit PIC \"hello world\"" 61 atf_set "require.progs" "c++" 62 } 63 64 atf_test_case hello_pic_profile 65 hello_pic_profile_head() { 66 atf_set "descr" "compile and run PIC \"hello world\" with profiling option" 67 atf_set "require.progs" "c++" 68 } 69 70 atf_test_case hello_pic_profile_32 71 hello_pic_profile_32_head() { 72 atf_set "descr" "compile and run 32-bit PIC \"hello world\" with profiling option" 73 atf_set "require.progs" "c++" 74 } 75 76 atf_test_case hello_pie 77 hello_pie_head() { 78 atf_set "descr" "compile and run position independent (PIE) \"hello world\"" 79 atf_set "require.progs" "c++" 80 } 81 82 atf_test_case hello32 83 hello32_head() { 84 atf_set "descr" "compile and run \"hello world\" for/in netbsd32 emulation" 85 atf_set "require.progs" "c++ file diff cat" 86 } 87 88 hello_body() { 89 cat > test.cpp << EOF 90 #include <stdio.h> 91 #include <stdlib.h> 92 int main(void) {printf("hello world\n");exit(0);} 93 EOF 94 atf_check -s exit:0 -o ignore -e ignore c++ -o hello test.cpp 95 atf_check -s exit:0 -o inline:"hello world\n" ./hello 96 } 97 98 hello_profile_body() { 99 case `uname -m` in 100 riscv) atf_expect_fail "PR port-riscv/59301:" \ 101 " riscv: missing MKPROFILE=yes support" 102 ;; 103 esac 104 105 cat > test.cpp << EOF 106 #include <stdio.h> 107 #include <stdlib.h> 108 int main(void) {printf("hello world\n");exit(0);} 109 EOF 110 atf_check -s exit:0 -o ignore -e ignore c++ -static -pg -o hello test.cpp 111 atf_check -s exit:0 -o inline:"hello world\n" ./hello 112 } 113 114 hello_profile_32_body() { 115 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 116 atf_skip "this is not a 64 bit architecture" 117 fi 118 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 119 atf_skip "c++ -m32 not supported on this architecture" 120 else 121 if fgrep -q _LP64 ./def32; then 122 atf_fail "c++ -m32 does not generate netbsd32 binaries" 123 fi 124 fi 125 126 case `uname -m` in 127 riscv) atf_expect_fail "PR port-riscv/59301:" \ 128 " riscv: missing MKPROFILE=yes support" 129 ;; 130 esac 131 132 cat > test.cpp << EOF 133 #include <stdio.h> 134 #include <stdlib.h> 135 int main(void) {printf("hello world\n");exit(0);} 136 EOF 137 atf_check -s exit:0 -o ignore -e ignore c++ -static -m32 -pg -o hello test.cpp 138 atf_check -s exit:0 -o inline:"hello world\n" ./hello 139 } 140 141 142 hello_static_body() { 143 cat > test.cpp << EOF 144 #include <stdio.h> 145 #include <stdlib.h> 146 int main(void) {printf("hello world\n");exit(0);} 147 EOF 148 atf_check -s exit:0 -o ignore -e ignore c++ -static -o hello test.cpp 149 atf_check -s exit:0 -o inline:"hello world\n" ./hello 150 } 151 152 hello_pic_body() { 153 cat > test.cpp << EOF 154 #include <stdlib.h> 155 int callpic(void); 156 int main(void) {callpic();exit(0);} 157 EOF 158 cat > pic.cpp << EOF 159 #include <stdio.h> 160 int callpic(void) {printf("hello world\n");return 0;} 161 EOF 162 163 atf_check -s exit:0 -o ignore -e ignore \ 164 c++ -fPIC -shared -o libtest.so pic.cpp 165 atf_check -s exit:0 -o ignore -e ignore \ 166 c++ -o hello test.cpp -L. -ltest 167 168 export LD_LIBRARY_PATH=. 169 atf_check -s exit:0 -o inline:"hello world\n" ./hello 170 } 171 172 hello_pic_32_body() { 173 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 174 atf_skip "this is not a 64 bit architecture" 175 fi 176 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 177 atf_skip "c++ -m32 not supported on this architecture" 178 else 179 if fgrep -q _LP64 ./def32; then 180 atf_fail "c++ -m32 does not generate netbsd32 binaries" 181 fi 182 fi 183 cat > test.cpp << EOF 184 #include <stdlib.h> 185 int callpic(void); 186 int main(void) {callpic();exit(0);} 187 EOF 188 cat > pic.cpp << EOF 189 #include <stdio.h> 190 int callpic(void) {printf("hello world\n");return 0;} 191 EOF 192 193 atf_check -s exit:0 -o ignore -e ignore \ 194 c++ -m32 -fPIC -shared -o libtest.so pic.cpp 195 atf_check -s exit:0 -o ignore -e ignore \ 196 c++ -m32 -o hello test.cpp -L. -ltest 197 198 export LD_LIBRARY_PATH=. 199 atf_check -s exit:0 -o inline:"hello world\n" ./hello 200 } 201 202 hello_pic_profile_body() { 203 case `uname -m` in 204 riscv) atf_expect_fail "PR port-riscv/59301:" \ 205 " riscv: missing MKPROFILE=yes support" 206 ;; 207 esac 208 209 cat > test.cpp << EOF 210 #include <stdlib.h> 211 int callpic(void); 212 int main(void) {callpic();exit(0);} 213 EOF 214 cat > pic.cpp << EOF 215 #include <stdio.h> 216 int callpic(void) {printf("hello world\n");return 0;} 217 EOF 218 219 atf_check -s exit:0 -o ignore -e ignore \ 220 c++ -pg -fPIC -shared -o libtest.so pic.cpp 221 atf_check -s exit:0 -o ignore -e ignore \ 222 c++ -pg -o hello test.cpp -L. -ltest 223 224 export LD_LIBRARY_PATH=. 225 atf_check -s exit:0 -o inline:"hello world\n" ./hello 226 } 227 228 hello_pic_profile_32_body() { 229 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 230 atf_skip "this is not a 64 bit architecture" 231 fi 232 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 233 atf_skip "c++ -m32 not supported on this architecture" 234 else 235 if fgrep -q _LP64 ./def32; then 236 atf_fail "c++ -m32 does not generate netbsd32 binaries" 237 fi 238 fi 239 240 case `uname -m` in 241 riscv) atf_expect_fail "PR port-riscv/59301:" \ 242 " riscv: missing MKPROFILE=yes support" 243 ;; 244 esac 245 246 cat > test.cpp << EOF 247 #include <stdlib.h> 248 int callpic(void); 249 int main(void) {callpic();exit(0);} 250 EOF 251 cat > pic.cpp << EOF 252 #include <stdio.h> 253 int callpic(void) {printf("hello world\n");return 0;} 254 EOF 255 256 atf_check -s exit:0 -o ignore -e ignore \ 257 c++ -m32 -pg -fPIC -shared -o libtest.so pic.cpp 258 atf_check -s exit:0 -o ignore -e ignore \ 259 c++ -m32 -pg -o hello test.cpp -L. -ltest 260 261 export LD_LIBRARY_PATH=. 262 atf_check -s exit:0 -o inline:"hello world\n" ./hello 263 } 264 265 hello_pie_body() { 266 # check whether this arch supports -pie 267 if ! c++ -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then 268 atf_skip "c++ -pie not supported on this architecture" 269 fi 270 cat > test.cpp << EOF 271 #include <stdio.h> 272 #include <stdlib.h> 273 int main(void) {printf("hello world\n");exit(0);} 274 EOF 275 atf_check -s exit:0 -o ignore -e ignore c++ -fpie -pie -o hello test.cpp 276 atf_check -s exit:0 -o inline:"hello world\n" ./hello 277 } 278 279 hello32_body() { 280 # check whether this arch is 64bit 281 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 282 atf_skip "this is not a 64 bit architecture" 283 fi 284 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 285 atf_skip "c++ -m32 not supported on this architecture" 286 else 287 if fgrep -q _LP64 ./def32; then 288 atf_fail "c++ -m32 does not generate netbsd32 binaries" 289 fi 290 fi 291 292 cat > test.cpp << EOF 293 #include <stdio.h> 294 #include <stdlib.h> 295 int main(void) {printf("hello world\n");exit(0);} 296 EOF 297 atf_check -s exit:0 -o ignore -e ignore c++ -o hello32 -m32 test.cpp 298 atf_check -s exit:0 -o ignore -e ignore c++ -o hello64 test.cpp 299 file -b ./hello32 > ./ftype32 300 file -b ./hello64 > ./ftype64 301 if diff ./ftype32 ./ftype64 >/dev/null; then 302 atf_fail "generated binaries do not differ" 303 fi 304 echo "32bit binaries on this platform are:" 305 cat ./ftype32 306 echo "While native (64bit) binaries are:" 307 cat ./ftype64 308 atf_check -s exit:0 -o inline:"hello world\n" ./hello32 309 310 # do another test with static 32bit binaries 311 cat > test.cpp << EOF 312 #include <stdio.h> 313 #include <stdlib.h> 314 int main(void) {printf("hello static world\n");exit(0);} 315 EOF 316 atf_check -s exit:0 -o ignore -e ignore c++ -o hello -m32 \ 317 -static test.cpp 318 atf_check -s exit:0 -o inline:"hello static world\n" ./hello 319 } 320 321 atf_init_test_cases() 322 { 323 324 atf_add_test_case hello 325 atf_add_test_case hello_profile 326 atf_add_test_case hello_pic 327 atf_add_test_case hello_pie 328 atf_add_test_case hello32 329 atf_add_test_case hello_static 330 atf_add_test_case hello_pic_32 331 atf_add_test_case hello_pic_profile 332 atf_add_test_case hello_pic_profile_32 333 atf_add_test_case hello_profile_32 334 } 335