####################################################################### # SWIG test suite makefile. # The test suite comprises many different test cases, which have # typically produced bugs in the past. The aim is to have the test # cases compiling for every language modules. Some testcase have # a runtime test which is written in each of the module's language. # # This makefile runs SWIG on the testcases, compiles the c/c++ code # then builds the object code for use by the language. # To complete a test in a language follow these guidelines: # 1) Add testcases to CPP_TEST_CASES (c++) or C_TEST_CASES (c) or # MULTI_CPP_TEST_CASES (multi-module c++ tests) # 2) If not already done, create a makefile which: # a) Defines LANGUAGE matching a language rule in Examples/Makefile, # for example LANGUAGE = java # b) Define rules for %.ctest, %.cpptest, %.multicpptest and %.clean. # c) Define srcdir, top_srcdir and top_builddir (these are the # equivalent to configure's variables of the same name). # 3) One off special commandline options can be achieved by adding a # test case to CUSTOM_TEST_CASES and defining rules to run and test. # # The 'check' target runs the testcases including SWIG invocation, # C/C++ compilation, target language compilation (if any) and runtime # test (if there is an associated 'runme' test). # The 'partialcheck' target only invokes SWIG. # The 'all' target is the same as the 'check' target but also includes # known broken testcases. # The 'clean' target cleans up. # # Note that the RUNTOOL, COMPILETOOL and SWIGTOOL variables can be used # for # invoking tools for the runtime tests and target language # compiler (eg javac) respectively. For example, valgrind can be used # for memory checking of the runtime tests using: # make RUNTOOL="valgrind --leak-check-full" # and valgrind can be used when invoking SWIG using: # make SWIGTOOL="valgrind --tool=memcheck" # # The variables below can be overridden after including this makefile ####################################################################### ####################################################################### # Variables ####################################################################### ifneq (,$(USE_VALGRIND)) VALGRIND_OPT = --leak-check=full RUNTOOL = valgrind $(VALGRIND_OPT) else RUNTOOL = endif COMPILETOOL= SWIGTOOL = SWIG = $(SWIGTOOL) $(top_builddir)/preinst-swig SWIG_LIB = $(top_srcdir)/Lib TEST_SUITE = test-suite EXAMPLES = Examples CXXSRCS = CSRCS = TARGETPREFIX = TARGETSUFFIX = SWIGOPT = -outcurrentdir -I$(top_srcdir)/$(EXAMPLES)/$(TEST_SUITE) INCLUDES = -I$(top_srcdir)/$(EXAMPLES)/$(TEST_SUITE) LIBS = -L. LIBPREFIX = lib ACTION = check INTERFACEDIR = ../ # # Please keep test cases in alphabetical order. # Note that any whitespace after the last entry in each list will break make # # Broken C++ test cases. (Can be run individually using make testcase.cpptest.) CPP_TEST_BROKEN += \ constants \ cpp_broken \ exception_partial_info \ extend_variable \ li_std_vector_ptr \ namespace_union \ nested_struct \ overload_complicated \ template_default_pointer \ template_expr \ $(CPP0X_TEST_BROKEN) # Broken C test cases. (Can be run individually using make testcase.ctest.) C_TEST_BROKEN += \ tag_no_clash_with_variable # C++ test cases. (Can be run individually using make testcase.cpptest.) CPP_TEST_CASES += \ $(CPP0X_TEST_CASES) \ abstract_access \ abstract_inherit \ abstract_inherit_ok \ abstract_signature \ abstract_typedef \ abstract_typedef2 \ abstract_virtual \ access_change \ add_link \ aggregate \ allowexcept \ allprotected \ anonymous_bitfield \ apply_signed_char \ apply_strings \ argout \ array_member \ array_typedef_memberin \ arrayref \ arrays_dimensionless \ arrays_global \ arrays_global_twodim \ arrays_scope \ bloody_hell \ bools \ cast_operator \ casts \ char_strings \ class_ignore \ class_scope_weird \ compactdefaultargs \ const_const_2 \ constant_pointers \ constover \ constructor_copy \ constructor_exception \ constructor_explicit \ constructor_ignore \ constructor_value \ contract \ conversion \ conversion_namespace \ conversion_ns_template \ cplusplus_throw \ cpp_basic \ cpp_enum \ cpp_namespace \ cpp_nodefault \ cpp_static \ cpp_typedef \ default_args \ default_constructor \ defvalue_constructor \ derived_byvalue \ derived_nested \ destructor_reprotected \ director_abstract \ director_basic \ director_classes \ director_classic \ director_constructor \ director_default \ director_detect \ director_enum \ director_exception \ director_extend \ director_finalizer \ director_frob \ director_ignore \ director_namespace_clash \ director_nested \ director_overload \ director_primitives \ director_protected \ director_protected_overloaded \ director_redefined \ director_thread \ director_unroll \ director_using \ director_wombat \ disown \ dynamic_cast \ empty \ enum_scope_template \ enum_template \ enum_thorough \ enum_var \ evil_diamond \ evil_diamond_ns \ evil_diamond_prop \ exception_order \ extend \ extend_default \ extend_placement \ extend_template \ extend_template_ns \ extern_namespace \ extern_throws \ features \ fragments \ friends \ fvirtual \ global_namespace \ global_ns_arg \ global_vars \ grouping \ ignore_parameter \ import_nomodule \ inherit \ inherit_missing \ inherit_same_name \ inherit_target_language \ inherit_void_arg \ inline_initializer \ insert_directive \ keyword_rename \ kind \ langobj \ li_attribute \ li_boost_shared_ptr \ li_boost_shared_ptr_bits \ li_carrays \ li_cdata \ li_cpointer \ li_stdint \ li_typemaps \ li_windows \ long_long_apply \ member_pointer \ member_template \ minherit \ minherit2 \ mixed_types \ multiple_inheritance \ name_cxx \ name_warnings \ namespace_class \ namespace_enum \ namespace_extend \ namespace_nested \ namespace_spaces \ namespace_template \ namespace_typedef_class \ namespace_typemap \ namespace_virtual_method \ naturalvar \ nested_comment \ newobject1 \ null_pointer \ operator_overload \ operator_overload_break \ operbool \ ordering \ overload_copy \ overload_extend \ overload_rename \ overload_simple \ overload_subtype \ overload_template \ overload_template_fast \ pointer_reference \ primitive_ref \ private_assign \ protected_rename \ pure_virtual \ redefined \ refcount \ reference_global_vars \ register_par \ rename1 \ rename2 \ rename3 \ rename4 \ rename_scope \ rename_strip_encoder \ restrict_cplusplus \ return_const_value \ return_value_scope \ rname \ samename \ sizet \ smart_pointer_const \ smart_pointer_const2 \ smart_pointer_extend \ smart_pointer_member \ smart_pointer_multi \ smart_pointer_multi_typedef \ smart_pointer_namespace \ smart_pointer_namespace2 \ smart_pointer_not \ smart_pointer_overload \ smart_pointer_protected \ smart_pointer_rename \ smart_pointer_simple \ smart_pointer_static \ smart_pointer_templatemethods \ smart_pointer_templatevariables \ smart_pointer_typedef \ special_variables \ static_array_member \ static_const_member \ static_const_member_2 \ struct_value \ template \ template_arg_replace \ template_arg_scope \ template_arg_typename \ template_array_numeric \ template_base_template \ template_classes \ template_const_ref \ template_construct \ template_default \ template_default2 \ template_default_arg \ template_default_class_parms \ template_default_inherit \ template_default_qualify \ template_default_vw \ template_enum \ template_enum_ns_inherit \ template_enum_typedef \ template_explicit \ template_extend1 \ template_extend2 \ template_extend_overload \ template_extend_overload_2 \ template_forward \ template_inherit \ template_inherit_abstract \ template_int_const \ template_methods \ template_ns \ template_ns2 \ template_ns3 \ template_ns4 \ template_ns_enum \ template_ns_enum2 \ template_ns_inherit \ template_ns_scope \ template_partial_arg \ template_qualifier \ template_qualifier \ template_ref_type \ template_rename \ template_retvalue \ template_specialization \ template_specialization_defarg \ template_specialization_enum \ template_static \ template_tbase_template \ template_template_parameters \ template_typedef \ template_typedef_cplx \ template_typedef_cplx2 \ template_typedef_cplx3 \ template_typedef_cplx4 \ template_typedef_cplx5 \ template_typedef_funcptr \ template_typedef_ns \ template_typedef_ptr \ template_typedef_rec \ template_using \ template_virtual \ template_whitespace \ threads \ throw_exception \ typedef_array_member \ typedef_class \ typedef_funcptr \ typedef_inherit \ typedef_mptr \ typedef_reference \ typedef_scope \ typedef_sizet \ typedef_struct \ typemap_namespace \ typemap_ns_using \ typemap_numinputs \ typemap_out_optimal \ typemap_variables \ typemap_various \ typename \ types_directive \ union_scope \ using1 \ using2 \ using_composition \ using_extend \ using_inherit \ using_namespace \ using_pointers \ using_private \ using_protected \ valuewrapper \ valuewrapper_base \ valuewrapper_const \ valuewrapper_opaque \ varargs \ virtual_destructor \ virtual_poly \ voidtest \ wrapmacro # C++0x test cases. CPP0X_TEST_CASES = \ cpp0x_template_double_brackets \ cpp0x_explicit_conversion_operators \ cpp0x_raw_string_literals \ cpp0x_static_assert \ cpp0x_template_explicit \ cpp0x_uniform_initialization \ cpp0x_function_objects \ cpp0x_strongly_typed_enumerations \ cpp0x_rvalue_reference \ cpp0x_variadic_templates \ cpp0x_alternate_function_syntax \ cpp0x_userdefined_literals \ cpp0x_decltype \ cpp0x_result_of \ cpp0x_default_delete \ cpp0x_sizeof_object \ cpp0x_initializer_list # cpp0x_template_typedefs # not supported by any compiler yet # cpp0x_hash_types # not fully implemented yet # cpp0x_constructors # not supported by any compiler yet # cpp0x_lambda_functions # not supported by GCC or MSVC yet # cpp0x_null_pointer_constant # not supported by any compiler yet # cpp0x_unrestricted_unions # not supported by any compiler yet # cpp0x_smart_pointers # not supported by standard library yet # cpp0x_constexpr # not supported by any compiler yet # cpp0x_thread_local # not supported by any compiler yet # Broken C++0x test cases. CPP0X_TEST_BROKEN = # # Put all the heavy STD/STL cases here, where they can be skipped if needed # CPP_STD_TEST_CASES += \ director_string \ ignore_template_constructor \ li_std_deque \ li_std_except \ li_std_pair \ li_std_string \ li_std_vector \ naturalvar \ smart_pointer_inherit \ template_typedef_fnc \ template_type_namespace \ template_opaque # li_std_list ifndef SKIP_CPP_STD_CASES CPP_TEST_CASES += ${CPP_STD_TEST_CASES} endif # C test cases. (Can be run individually using make testcase.ctest.) C_TEST_CASES += \ arrays \ char_constant \ const_const \ empty \ enums \ extern_declaration \ funcptr \ function_typedef \ immutable \ inctest \ integers \ keyword_rename \ lextype \ li_carrays \ li_cdata \ li_cmalloc \ li_constraints \ li_cpointer \ li_math \ long_long \ name \ nested \ newobject2 \ overload_extend \ overload_extendc \ preproc \ ret_by_value \ simple_array \ sizeof_pointer \ sneaky1 \ struct_rename \ typedef_struct \ typemap_subst \ union_parameter \ unions # Multi-module C++ test cases . (Can be run individually using make testcase.multicpptest.) MULTI_CPP_TEST_CASES += \ clientdata_prop \ imports \ packageoption \ mod \ template_typedef_import \ multi_import NOT_BROKEN_TEST_CASES = $(CPP_TEST_CASES:=.cpptest) \ $(C_TEST_CASES:=.ctest) \ $(MULTI_CPP_TEST_CASES:=.multicpptest) \ $(CUSTOM_TEST_CASES:=.customtest) \ $(EXTRA_TEST_CASES) BROKEN_TEST_CASES = $(CPP_TEST_BROKEN:=.cpptest) \ $(C_TEST_BROKEN:=.ctest) ALL_CLEAN = $(CPP_TEST_CASES:=.clean) \ $(C_TEST_CASES:=.clean) \ $(MULTI_CPP_TEST_CASES:=.clean) \ $(CUSTOM_TEST_CASES:=.clean) \ $(CPP_TEST_BROKEN:=.clean) \ $(C_TEST_BROKEN:=.clean) ####################################################################### # The following applies for all module languages ####################################################################### all: $(NOT_BROKEN_TEST_CASES) $(BROKEN_TEST_CASES) check: $(NOT_BROKEN_TEST_CASES) # partialcheck target runs SWIG only, ie no compilation or running of tests (for a subset of languages) partialcheck: $(MAKE) check CC=true CXX=true LDSHARED=true CXXSHARED=true RUNTOOL=true COMPILETOOL=true broken: $(BROKEN_TEST_CASES) swig_and_compile_cpp = \ $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile CXXSRCS="$(CXXSRCS)" \ SWIG_LIB="$(SWIG_LIB)" SWIG="$(SWIG)" \ INCLUDES="$(INCLUDES)" SWIGOPT="$(SWIGOPT)" NOLINK=true \ TARGET="$(TARGETPREFIX)$*$(TARGETSUFFIX)" INTERFACEDIR="$(INTERFACEDIR)" INTERFACE="$*.i" \ $(LANGUAGE)$(VARIANT)_cpp swig_and_compile_c = \ $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile CSRCS="$(CSRCS)" \ SWIG_LIB="$(SWIG_LIB)" SWIG="$(SWIG)" \ INCLUDES="$(INCLUDES)" SWIGOPT="$(SWIGOPT)" NOLINK=true \ TARGET="$(TARGETPREFIX)$*$(TARGETSUFFIX)" INTERFACEDIR="$(INTERFACEDIR)" INTERFACE="$*.i" \ $(LANGUAGE)$(VARIANT) swig_and_compile_multi_cpp = \ for f in `cat $(top_srcdir)/$(EXAMPLES)/$(TEST_SUITE)/$*.list` ; do \ $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile CXXSRCS="$(CXXSRCS)" \ SWIG_LIB="$(SWIG_LIB)" SWIG="$(SWIG)" LIBS='$(LIBS)' \ INCLUDES="$(INCLUDES)" SWIGOPT="$(SWIGOPT)" NOLINK=true \ TARGET="$(TARGETPREFIX)$${f}$(TARGETSUFFIX)" INTERFACEDIR="$(INTERFACEDIR)" INTERFACE="$$f.i" \ $(LANGUAGE)$(VARIANT)_cpp; \ done swig_and_compile_external = \ $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile \ SWIG_LIB="$(SWIG_LIB)" SWIG="$(SWIG)" \ TARGET="$*_wrap_hdr.h" \ $(LANGUAGE)$(VARIANT)_externalhdr; \ $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile CXXSRCS="$(CXXSRCS) $*_external.cxx" \ SWIG_LIB="$(SWIG_LIB)" SWIG="$(SWIG)" \ INCLUDES="$(INCLUDES)" SWIGOPT="$(SWIGOPT)" NOLINK=true \ TARGET="$(TARGETPREFIX)$*$(TARGETSUFFIX)" INTERFACEDIR="$(INTERFACEDIR)" INTERFACE="$*.i" \ $(LANGUAGE)$(VARIANT)_cpp swig_and_compile_runtime = \ setup = \ if [ -f $(srcdir)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \ echo "$(ACTION)ing testcase $* (with run test) under $(LANGUAGE)" ; \ else \ echo "$(ACTION)ing testcase $* under $(LANGUAGE)" ; \ fi; ####################################################################### # Clean ####################################################################### clean: $(ALL_CLEAN) distclean: clean @rm -f Makefile .PHONY: all check partialcheck broken clean distclean