Affix

 view release on metacpan or  search on metacpan

t/017_affix_build.t  view on Meta::CPAN

    end function

run_test( 'nim', 'Nim', <<~'', 'add_nim', 'nim' );
    proc add_nim(a, b: cint): cint {.exportc, dynlib.} =
        return a + b

run_test( 'v', 'V', <<~'', 'add_v', 'v' );
    [export: 'add_v']
    fn add_v(a int, b int) int {
        return a + b
    }

run_test( 'pascal', 'Pascal', <<~'', 'add_pas', 'fpc' );
    library test_pas;
    function add_pas(a, b: LongInt): LongInt; cdecl; export;
    begin
        add_pas := a + b;
    end;
    exports add_pas;
    begin end.

run_test( 'cr', 'Crystal', <<~'', 'add_cr', 'crystal' );
    fun add_cr(a : Int32, b : Int32) : Int32
      a + b
    end

run_test( 'swift', 'Swift', <<~'', 'add_swift', 'swiftc' );
    @_cdecl("add_swift")
    public func add_swift(a: Int32, b: Int32) -> Int32 {
        return a + b
    }

run_test( 'assembly', 'Assembly', $Config{archname} =~ /arm64|aarch64/ ? <<~'' : $^O eq 'MSWin32' ? <<~'': <<~'', 'add_asm', 'nasm' );
        ; ARM64: add w0, w0, w1
        .global add_asm
        .text
        .align 2
        add_asm:
            add w0, w0, w1
            ret

        ; Win64 x86_64: RCX + RDX -> RAX
        global add_asm
        section .text
        add_asm:
            mov eax, ecx
            add eax, edx
            ret

        ; SysV x86_64: RDI + RSI -> RAX
        global add_asm
        section .text
        add_asm:
            mov eax, edi
            add eax, esi
            ret

run_test( 'cobol', 'Cobol', <<~'', 'add_cob', 'cobc' );
           IDENTIFICATION DIVISION.
           PROGRAM-ID. add_cob.
           DATA DIVISION.
           LINKAGE SECTION.
           01 A PIC 9(9) USAGE COMP-5.
           01 B PIC 9(9) USAGE COMP-5.
           01 R PIC 9(9) USAGE COMP-5.
           PROCEDURE DIVISION USING A, B, R.
               ADD A TO B GIVING R.
               GOBACK.
           END PROGRAM add_cob.

subtest 'Polyglot: Number Cruncher (C + Fortran + ASM)' => sub {
    skip_all "Missing compilers" unless bin_path( $Config{cc} ) && bin_path('gfortran');

    # C is our orchestrator
    my $c_src = $TMP_DIR->child('math_core.c');
    $c_src->spew_utf8(<<~'C');
        #include <stdio.h>
        #ifdef _WIN32
        __declspec(dllexport)
        #endif
        int core_version() { return 1; }
        C

    # Fortran does the math
    my $f_src = $TMP_DIR->child('math_algos.f90');
    $f_src->spew_utf8(<<~'F90');
        function fortran_add(a, b) bind(c, name='fortran_add')
            use iso_c_binding
            integer(c_int), value :: a, b
            integer(c_int) :: fortran_add
            fortran_add = a + b
        end function
        F90

    # Assembly for optimization
    my $asm_bin;
    my $asm_src;
    my $asm_file_name;
    if ( $Config{archname} =~ /arm64|aarch64/ ) {
        $asm_bin       = $Config{cc};
        $asm_file_name = 'fast.s';
        $asm_src       = <<~'' }
            .global asm_inc
            .text
            .align 2
            asm_inc:
                add w0, w0, #1
                ret

    elsif ( $^O eq 'MSWin32' ) {
        $asm_bin       = 'nasm';
        $asm_file_name = 'fast.asm';
        $asm_src       = <<~'' }
            global asm_inc
            section .text
            asm_inc:
                mov eax, ecx
                inc eax
                ret

    else {



( run in 0.336 second using v1.01-cache-2.11-cpan-140bd7fdf52 )