| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340 | #! /bin/sh# Copyright (C) 2012-2017 Free Software Foundation, Inc.## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2, or (at your option)# any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program.  If not, see <http://www.gnu.org/licenses/>.# Stress test on Objective C/C++.required=libtoolizeam_create_testdir=empty. test-init.sh## Autotools Input Files.cat > configure.ac << 'END'AC_INIT([play], [1.3], [bug-automake@gnu.org])AC_CONFIG_SRCDIR([play.c])AC_CONFIG_AUX_DIR([build-aux])AC_CONFIG_MACRO_DIR([m4])AM_INIT_AUTOMAKEAM_PROG_ARLT_INITAC_PROG_CCAC_PROG_CXXAC_PROG_OBJCAC_PROG_OBJCXXAC_LANG_PUSH([Objective C])AC_CACHE_CHECK(  [whether the Objective C compiler really works],  [my_cv_objc_works],  [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#import <stdio.h>]],                                   [[printf ("foo\n");]])],                  [my_cv_objc_works=yes],                  [my_cv_objc_works=no])])AC_LANG_POP([Objective C])AC_LANG_PUSH([Objective C++])AC_CACHE_CHECK(  [whether the Objective C++ compiler really works],  [my_cv_objcxx_works],  [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#import <iostream>]],                                   [[std::cout << "foo" << "\n";]])],                  [my_cv_objcxx_works=yes],                  [my_cv_objcxx_works=no])])AC_LANG_POP([Objective C++])if test $my_cv_objc_works != yes; then  AC_MSG_ERROR([couldn't find a working Objective C compiler], [77])fiif test $my_cv_objcxx_works != yes; then  AC_MSG_ERROR([couldn't find a working Objective C++ compiler], [77])fiAC_CONFIG_HEADERS([config.h])AC_CONFIG_FILES([Makefile])AC_OUTPUTENDcat > Makefile.am << 'END'bin_PROGRAMS = playplay_SOURCES = play.h play.c playxx.cxx playo.m playoxx.mmplay_LDADD = libfoo.laplay_LDFLAGS = -lobjclib_LTLIBRARIES = libfoo.lalibfoo_la_SOURCES = foo.h foo.c fooxx.cxx fooo.m foooxx.mmEND## Run Autotools.libtoolize$ACLOCAL$AUTOHEADER$AUTOCONF$AUTOMAKE --add-missing## Program Sources.cat > play.h << 'END'#ifndef PLAY_H#define PLAY_H#include "foo.h"#ifdef __cplusplusextern "C" {#endifvoid hello_cxx (void);void hello_objc (void);void hello_objcxx (void);#ifdef __OBJC__@interface Hello_ObjC{ }+ (void)display;@end#endif /* __OBJC__ */#ifdef __cplusplus}class Hello_CXX{  public:    Hello_CXX() { }    virtual ~Hello_CXX () { }    void hello_cxx ();};#ifdef __OBJC__@interface Hello_ObjCXX{ }+ (void)display;@endclass Hello_OBJCXX{  public:    Hello_OBJCXX () { }    virtual ~Hello_OBJCXX () { }    void hello_objcxx();};#endif /* __OBJC__ */#endif /* __cplusplus */#endif /* PLAY_H */ENDcat > play.c << 'END'#include "play.h"int main (void){  printf ("[Hello C,");  world_c ();  hello_cxx ();  hello_objc ();  hello_objcxx ();  return 0;}ENDcat > playxx.cxx << 'END'#include "play.h"void hello_cxx(void){  Hello_CXX *hello = new Hello_CXX;  hello->hello_cxx();}void Hello_CXX::hello_cxx(){  std::cout << "[Hello C++,";  World_CXX *world = new World_CXX;  world->world_cxx();}ENDcat > playo.m << 'END'#import "play.h"void hello_objc (void){  [Hello_ObjC display];}@implementation Hello_ObjC+ (void)display{  printf ("[Hello ObjC,");  [World_ObjC display];}@endENDcat > playoxx.mm << 'END'#import "play.h"// Calling: C -> C++ -> ObjCvoid hello_objcxx (void){  Hello_OBJCXX *hello = new Hello_OBJCXX;  hello->hello_objcxx ();}void Hello_OBJCXX::hello_objcxx (){  [Hello_ObjCXX display];}@implementation Hello_ObjCXX+ (void)display{  std::cout << "[Hello ObjC++,";  [World_ObjCXX display];}@endEND## Library Sources.cat > foo.h << 'END'#ifndef FOO_H#define FOO_H#ifdef __cplusplus#include <iostream>extern "C" {#else#include <stdio.h>#endifvoid world_c (void);#ifdef __OBJC__@interface World_ObjC{ }+ (void)display;@end#endif /* __OBJC__ */#ifdef __cplusplus}class World_CXX{  public:    World_CXX() { }    virtual ~World_CXX () { }    void world_cxx ();};#ifdef __OBJC__class World_OBJCXX{  public:    World_OBJCXX () { }    virtual ~World_OBJCXX () { }    void world_objcxx ();};@interface World_ObjCXX{ }+ (void)display;@end#endif /* __OBJC__ */#endif /* __cplusplus */#endif /* FOO_H */ENDcat > foo.c << 'END'#include "foo.h"void world_c (void){  printf (" world C]\n");}ENDcat > fooxx.cxx << 'END'#include "foo.h"void World_CXX::world_cxx (){  std::cout << " world C++]" << "\n";}ENDcat > fooo.m << 'END'#import "foo.h"@implementation World_ObjC+ (void)display{  printf (" world ObjC]\n");}@endENDcat > foooxx.mm << 'END'#import "foo.h"// Calling: ObjC -> C++@implementation World_ObjCXX+ (void)display{  World_OBJCXX *world = new World_OBJCXX;  world->world_objcxx ();}@endvoid World_OBJCXX::world_objcxx (){  std::cout << " world ObjC++]" << "\n";}END## Configure and build../configure$MAKEif ! cross_compiling; then  unindent > exp << 'END'    [Hello C, world C]    [Hello C++, world C++]    [Hello ObjC, world ObjC]    [Hello ObjC++, world ObjC++]END  ./play > got || { cat got; exit 1; }  cat exp  cat got  diff exp gotfi$MAKE distcheck:
 |