Results 1 to 10 of 10

Thread: Android, FPC and lazarus corss-compilation

  1. #1
    PGD Staff code_glitch's Avatar
    Join Date
    Oct 2009
    Location
    UK (England, the bigger bit)
    Posts
    933
    Blog Entries
    45

    Android, FPC and lazarus corss-compilation

    Yup, its come this... The article for PGD gamer has taken a turn for the worse. The wiki instructions worked once and once only - I got one APK out and the next F8 key later it was crash this, error that... Of course, I tried trawling over the darn pages again and again, but a human can only hit his head against a wall so many times before going insane, so here's where I'm at (where I think I know it all works well):

    Setup:
    Virtual machine of x86 Linux Mint 11 (its 100% ubuntu compatible so no problems there, just better performance )
    A copy of the Android NDK and SDK (its possible the NDK is a little iffy but the emulator and what not works)
    A copy of freepascal 2.6.0 for x86 from the freepascal.org deb files
    A copy of the Sun java 6 sdk from the APT repo

    What doesn't seem to work:
    The scripts detailed on this page: http://wiki.lazarus.freepascal.org/S...ompile_For_ARM seem to be a little dated. I had a go at fixing up the paths and running through it manually but I get hangs during compilations, random errors from code and missing files... Reminds one of the DLL hell you could get from windows 95....

    Anyone here have a detailed procedure on their setup with FPC (or lazarus) for cross compiling to android they'd be willing to share by any chance? I'm in a state of denial about surrendering my article to the trash can because FPC is playing hard to get - as am I about publishing faulty instructions!

    Frustration....
    I once tried to change the world. But they wouldn't give me the source code. Damned evil cunning.

  2. #2
    For FreePascal 2.6.0 I use this script to build crosscompiler and install it into /opt/fpc:
    Code:
    export PPCBIN=/usr/lib/fpc/2.6.0/ppcx64
    export ANDROID_BIN=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/bin
    
    if [ -d ./fixes_2_6 ]; then
      svn update ./fixes_2_6
    else
      svn co http://svn.freepascal.org/svn/fpc/branches/fixes_2_6 ./fixes_2_6
    fi
    
    svn export ./fixes_2_6 /tmp/fixes_2_6
    
    cd /tmp/fixes_2_6
    
    make distclean
    make FPC=$PPCBIN build OS_TARGET=linux CPU_TARGET=arm OPT="-dFPC_ARMEL" CROSSBINDIR=$ANDROID_BIN
    sudo make FPC=`pwd`/compiler/ppcrossarm PREFIX=/opt/fpc crossinstall OS_TARGET=linux CPU_TARGET=arm OPT="-dFPC_ARMEL" CROSSBINDIR=$ANDROID_BIN
    rm -Rf /tmp/fixes_2_6
    Instead of $ANDROID_NDK you should put your own path, because this variable available only in ArchLinux. Also don't forget to change ppcx64 to ppc386 if you use 32-bit system.

  3. #3
    PGD Staff code_glitch's Avatar
    Join Date
    Oct 2009
    Location
    UK (England, the bigger bit)
    Posts
    933
    Blog Entries
    45
    Andru: Thanks a ton for that... I have to admit its not quite what I'd expected (maybe the wikis have a tendency for overcomplication?)

    I'll give this a spin right as soon as my virtualbox loads up
    I once tried to change the world. But they wouldn't give me the source code. Damned evil cunning.

  4. #4
    PGD Staff code_glitch's Avatar
    Join Date
    Oct 2009
    Location
    UK (England, the bigger bit)
    Posts
    933
    Blog Entries
    45
    Oo ??

    Just went to run that script, ran a mkdir FPC_Try2 and out of space... I woooonder...... Oh, well, script time since its simpler than the wiki approach Have to admit, arch seems like a very tempting OS, slim, extra variables by default...
    Last edited by code_glitch; 20-01-2012 at 05:12 PM.
    I once tried to change the world. But they wouldn't give me the source code. Damned evil cunning.

  5. #5
    PGD Staff code_glitch's Avatar
    Join Date
    Oct 2009
    Location
    UK (England, the bigger bit)
    Posts
    933
    Blog Entries
    45
    Hmm... Now lets see if it works; It seems theres no ppcarm so I wonder if fpc xyz.pas goes straight to arm then?

    Edit:
    !? WHAAA!!!??

    Ran the sript through, a few error 2s but I find them quite common and nothing serious occured. Seems to have worked anyway. So I ran a 'sudo find / -name ppcrossarm' and I get /usr/lib/fpc/2.7.1/ppcrossarm spat back at me.

    Does that mean all my faff was for nothing and a previous procedure had worked despite the errors? I guess its test time!
    Last edited by code_glitch; 20-01-2012 at 06:00 PM.
    I once tried to change the world. But they wouldn't give me the source code. Damned evil cunning.

  6. #6
    PGD Staff code_glitch's Avatar
    Join Date
    Oct 2009
    Location
    UK (England, the bigger bit)
    Posts
    933
    Blog Entries
    45
    Verdict: no luck...

    running fpc -Parm -Tlinux test.pas just gives me a can't run ppcarm error code 127
    I once tried to change the world. But they wouldn't give me the source code. Damned evil cunning.

  7. #7
    I get /usr/lib/fpc/2.7.1/ppcrossarm spat back at me.
    My script will build FreePascal 2.6.x from fixes_2_6 branch, so it should be 2.6.x version. And my script install everything to /opt/fpc, not to /usr. So I use some scripts for switching between different versions of FreePascal(this one is for switching to version from fixes_2_6 branch):
    Code:
    sudo ln -sf /opt/fpc/lib/fpc/2.6.1/ppcx64 /usr/bin/ppcx64
    sudo ln -sf /opt/fpc/lib/fpc/2.6.1/ppcross386 /usr/bin/ppc386
    sudo ln -sf /opt/fpc/lib/fpc/2.6.1/ppcrossarm /usr/bin/ppcarm
    mv ~/fpc.cfg ~/.fpc.cfg
    Content of mine ~/fpc.cfg:
    Code:
    #
    # Config file generated by fpcmkcfg on 9-11-11 - 22:08:31
    # Example fpc.cfg for Free Pascal Compiler
    #
    
    # ----------------------
    # Defines (preprocessor)
    # ----------------------
    
    #
    # nested #IFNDEF, #IFDEF, #ENDIF, #ELSE, #DEFINE, #UNDEF are allowed
    #
    # -d is the same as #DEFINE
    # -u is the same as #UNDEF
    #
    
    #
    # Some examples (for switches see below, and the -? helppages)
    #
    # Try compiling with the -dRELEASE or -dDEBUG on the commandline
    #
    
    # For a release compile with optimizes and strip debuginfo
    #IFDEF RELEASE
      -O2
      -Xs
      #WRITE Compiling Release Version
    #ENDIF
    
    # For a debug version compile with debuginfo and all codegeneration checks on
    #IFDEF DEBUG
      -glh
      -Crtoi
      #WRITE Compiling Debug Version
    #ENDIF
    
    # ----------------
    # Parsing switches
    # ----------------
    
    # Pascal language mode
    #      -Mfpc      free pascal dialect (default)
    #      -Mobjfpc   switch some Delphi 2 extensions on
    #      -Mdelphi   tries to be Delphi compatible
    #      -Mtp       tries to be TP/BP 7.0 compatible
    #      -Mgpc      tries to be gpc compatible
    #      -Mmacpas   tries to be compatible to the macintosh pascal dialects
    #
    # Turn on Object Pascal extensions by default
    #-Mobjfpc
    
    # Assembler reader mode
    #      -Rdefault  use default assembler
    #      -Ratt      read AT&T style assembler
    #      -Rintel    read Intel style assembler
    #
    # All assembler blocks are AT&T styled by default
    #-Ratt
    
    # Semantic checking
    #      -S2        same as -Mobjfpc
    #      -Sc        supports operators like C (*=,+=,/= and -=)
    #      -Sa        include assertion code.
    #      -Sd        same as -Mdelphi
    #      -Se<x>     compiler stops after the <x> errors (default is 1)
    #      -Sg        allow LABEL and GOTO
    #      -Sh        Use ansistrings
    #      -Si        support C++ styled INLINE
    #      -SI<x>     set interface style to <x>
    #         -SIcomCOM compatible interface (default)
    #         -SIcorbaCORBA compatible interface
    #      -Sm        support macros like C (global)
    #      -So        same as -Mtp
    #      -Sp        same as -Mgpc
    #      -Ss        constructor name must be init (destructor must be done)
    #
    # Allow goto, inline, C-operators, C-vars
    -Sgic
    
    # ---------------
    # Code generation
    # ---------------
    
    # Uncomment the next line if you always want static/dynamic units by default
    # (can be overruled with -CD, -CS at the commandline)
    #-CS
    #-CD
    
    # Set the default heapsize to 8Mb
    #-Ch8000000
    
    # Set default codegeneration checks (iocheck, overflow, range, stack)
    #-Ci
    #-Co
    #-Cr
    #-Ct
    
    # Optimizer switches for i386 compiler
    # -Os        generate smaller code
    # -O1        level 1 optimizations (quick optimizations)
    # -O2        level 2 optimizations (-O1 + slower optimizations)
    # -O3        level 3 optimizations (same as -O2u)
    # -Oa=N      set alignment to N
    # -OoX       switch on optimalization X. 
    # -OoNOX     switch off optimalization X.
    #               X is one of REGVAR UNCERTAIN STACKFRAME PEEPHOLE ASMCSE LOOPUNROLL
    # -OpCPU     set target processor.
    #             CPU is one of 386, PENTIUM, PENTIUM2, PENTIUM3, PENTIUM4, PENTIUMM 
    
    
    # -----------------------
    # Set Filenames and Paths
    # -----------------------
    
    # Both slashes and backslashes are allowed in paths
    
    # path to the messagefile, not necessary anymore but can be used to override
    # the default language
    #-Fr/opt/fpc/lib/fpc/$fpcversion/msg/errore.msg
    #-Fr/opt/fpc/lib/fpc/$fpcversion/msg/errorn.msg
    #-Fr/opt/fpc/lib/fpc/$fpcversion/msg/errores.msg
    #-Fr/opt/fpc/lib/fpc/$fpcversion/msg/errord.msg
    #-Fr/opt/fpc/lib/fpc/$fpcversion/msg/errorr.msg
    
    # searchpath for units and other system dependent things
    -Fu/opt/fpc/lib/fpc/$fpcversion/units/$FPCTARGET/
    -Fu/opt/fpc/lib/fpc/$fpcversion/units/$FPCTARGET/*
    -Fu/opt/fpc/lib/fpc/$fpcversion/units/$FPCTARGET/rtl
    
    #IFDEF FPCAPACHE_1_13
    -Fu/opt/fpc/lib/fpc/$fpcversion/units/$FPCTARGET/httpd13/
    #ELSE
    #IFDEF FPCAPACHE_2_0
    -Fu/opt/fpc/lib/fpc/$fpcversion/units/$FPCTARGET/httpd20
    #ELSE
    -Fu/opt/fpc/lib/fpc/$fpcversion/units/$FPCTARGET/httpd22
    #ENDIF
    #ENDIF
    
    # path to the gcclib
    #ifdef cpui386
    -Fl/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/32
    -Fl/usr/lib32
    #endif
    #ifdef cpux86_64
    -Fl/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.2
    #endif
    
    # searchpath for libraries
    #-Fl/opt/fpc/lib/fpc/$fpcversion/lib
    #-Fl/lib;/usr/lib
    
    # searchpath for tools
    -FD/opt/fpc/lib/fpc/$fpcversion/bin/$FPCTARGET
    
    #IFNDEF CPUI386
    #IFNDEF CPUAMD64
    #DEFINE NEEDCROSSBINUTILS
    #ENDIF
    #ENDIF
    
    #IFNDEF Linux
    #DEFINE NEEDCROSSBINUTILS
    #ENDIF
    
    # binutils prefix for cross compiling
    #IFDEF FPC_CROSSCOMPILING
    #IFDEF NEEDCROSSBINUTILS
      -XP$FPCTARGET-
    #ENDIF
    #ENDIF
    
    
    # -------------
    # Linking
    # -------------
    
    # generate always debugging information for GDB (slows down the compiling
    # process)
    #      -gc        generate checks for pointers
    #      -gd        use dbx
    #      -gg        use gsym
    #      -gh        use heap trace unit (for memory leak debugging)
    #      -gl        use line info unit to show more info for backtraces
    #      -gv        generates programs tracable with valgrind
    #      -gw        generate dwarf debugging info
    #
    # Enable debuginfo and use the line info unit by default
    #-gl
    
    # always pass an option to the linker
    #-k-s
    
    # Always strip debuginfo from the executable
    -Xs
    
    
    # -------------
    # Miscellaneous
    # -------------
    
    # Write always a nice FPC logo ;)
    -l
    
    # Verbosity
    #      e : Show errors (default)       d : Show debug info
    #      w : Show warnings               u : Show unit info
    #      n : Show notes                  t : Show tried/used files
    #      h : Show hints                  m : Show defined macros
    #      i : Show general info           p : Show compiled procedures
    #      l : Show linenumbers            c : Show conditionals
    #      a : Show everything             0 : Show nothing (except errors)
    #      b : Show all procedure          r : Rhide/GCC compatibility mode
    #          declarations if an error    x : Executable info (Win32 only)
    #          occurs
    #
    # Display Info, Warnings, Notes and Hints
    -viwn
    # If you don't want so much verbosity use
    #-vw
    But if you install your FreePascal to /usr/lib/fpc, you should change my script too, otherwise you should use file above in your home directory for correct setting of paths for FreePascal
    Last edited by Andru; 20-01-2012 at 06:53 PM.

  8. #8
    PGD Staff code_glitch's Avatar
    Join Date
    Oct 2009
    Location
    UK (England, the bigger bit)
    Posts
    933
    Blog Entries
    45
    Right. I think I get it now so I'll try another build and hope I get some luck...
    I once tried to change the world. But they wouldn't give me the source code. Damned evil cunning.

  9. #9
    Is it really worth the effort to build 2.6 for android? I once tried building 2.7 but I also got problems (they might be unrelated though). So I went back to using the 2.5.1 build, which was specially made for android. I can't find the download link to it anymore

    I feel that somebody should pre-compile this and make it available again
    Coders rule nr 1: Face ur bugz.. dont cage them with code, kill'em with ur cursor.

  10. #10
    PGD Staff code_glitch's Avatar
    Join Date
    Oct 2009
    Location
    UK (England, the bigger bit)
    Posts
    933
    Blog Entries
    45
    chronozphere: 2.5.1 is actually the one mentioned in a lot of wikis, but like you say it seems the link has dried up in the most part... I'll see what I can delve into...
    I once tried to change the world. But they wouldn't give me the source code. Damned evil cunning.

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •