The Source for Java Technology Collaboration
User: Password:



Kelly O'Hair

Kelly O'Hair's Blog

My Ant Adventure (Updated 1/23/2007)

Posted by kellyohair on January 03, 2007 at 01:46 PM | Comments (4)

Update for 1/23/2007, just a very short note on windows.

    The findbugs target needs to add vmlauncher="false", so the line:

      <exec executable="findbugs" failonerror="true">

    changes to

      <exec executable="findbugs" failonerror="true" vmlauncher="false">

    It's not exactly clear why this is necessary, but this allows the findbugs target to work on windows, and also works everywhere else. The findbugs -version exec was also removed because this will trigger the GUI to start up if it runs findbugs.bat, and findbugs.bat doesn't seem to have a -version option.

    In addition, the ant 1.7.0 install bits seem to have a windows bin/ant.cmd file that does not have execute permissions, by adding execute permissions to this file, ant can be run from a Makefile. Again, it's not exactly clear why this is needed, but it makes sense for it to have execute permissions, so this seems harmless.

Updated 1/22/2007, tried to mark changes in bold underline. Also added the actual build.xml to download.

Now I have never liked ants (see my ants blog), but this story is about my adventure with the Apache Ant build system. I can safely say that I still hate ants, all ants, but even ants have a place in the world, ant build scripts included.

So I was crawling along with my little NetBeans Java project just happy as a clam using NetBeans 5.5 with the findbugs plugin, and the JUnit tests that NetBeans help me to create and run so easily. I never had to write an Ant script before, I just pointed NetBeans at my sources, set a few properties and let NetBeans handle it. Overall it was pretty easy, and simple.

But when it came time for a batch product build, I had used a Makefile and a separate build process. So the romantic picnic at the park was over, it was time for the ants to take over. :^) The Makefile worked, but wasn't ideal, and it was always a temporary thing, but it did create the bin scripts and run some bin script tests that I hadn't managed to get the NetBeans building to do.

First off, it's never good to have two different ways to build a product, you never know for sure if the two build mechanisms really built the same thing. So in general, when it comes to a build process, everyone should follow the Highlander rule of "There can be only one". Granted, a "development build" will always be slightly different, probably a subset, but it should be using the same basic mechanisms as a more formal and complete product build.

Second, I was missing some of the things I wanted built into the batch build process, namely running findbugs and running all my JUnit tests. So I wasn't happy with my existing batch build process.

Ideally I want a batch build process to:

  1. compile with full javac error checking and treat all errors as fatal (javac -Xlint:all -Werror)
  2. construct the 'dist' area (the jar file and including any necessary bin scripts)
  3. run all the JUnit tests
  4. run the bin script tests
  5. run javadoc and treat all errors as fatal
  6. run findbugs with full checking and treat all errors as fatal

Lucky for me I've got a very clean set of source files, and I want to keep them that way, otherwise I'd have to back off on some of my "treat all errors as fatal" requirements. ;^) The first two items above represent the typical development build or "full build" while inside NetBeans, but it was important to me that all the steps should be manually runnable inside NetBeans too.

So I started my adventure to make this happen.

My first thought was about having the Makefile run findbugs and JUnit directly, but that seemed wrong and didn't solve my first problem above. So the answer was fairly obvious, if I needed a Makefile, it would be trivial to have it run the ant script, right? So I just needed to create an ant script. Of course it's never that easy. I did manage to get this to work, and I did learn enough about ant to create this standalone ant script, one that did everything I wanted, but it was NOT simple and easy, and the end result was not very satisfactory.

It turns out that when you create a NetBeans project with an existing ant script, some of the NetBeans features (like debugging a JUnit test) will not work. :^( So some NetBeans features (or what I perceive to be features) are tied to the specific ant build scripts that NetBeans creates.

Then there were the ant problems, which involved having a version of ant that would work with the latest findbugs ant task and the junit ant task. I finally settled on using ant 1.7 but since I allow for my project to build anywhere, I needed ant 1.7 everywhere, and that meant I had to manage my own version of ant (I could not trust all systems to have an ant that would work for me). I think the ant inside NetBeans 5.5 was 1.6 something, and it didn't work with the findbugs ant task for some reason, but that was ok because while inside NetBeans you really want to use the findbugs plugin for the best interaction with your sources. So I finally gave up on the findbugs ant task and just used:

    
       <condition property="findbugs.home" value="/Applications/findbugs">
            <os family="mac"/>
        </condition>
        
        <target name="findbugs-batch" depends="init"
                description="Run findbugs in batch mode">
            <exec 
                executable="${findbugs.home}/bin/findbugs"
                failonerror="true">
                <arg value="-textui"/>
                <arg value="-effort:max"/>
                <arg value="-low"/>
                <arg path="${dist.jar}"/>
            </exec>
        </target>
    
    

An UPDATE on this. Turns out that Windows is giving me no end of grief regarding pathnames, so this was changed to assume findbugs was in the PATH setting, overall this seems to make life easier. In general avoiding having ant deal with full paths is ideal, that also means avoiding the ant property ${basedir} which WILL be a full path. The Makefile changed too, see below. I want this ant script to work on MacOSX, Solaris, Linux, and Windows, others may not have this requirement. I also wanted it to work no matter where the source was moved to, so again, avoid fullpaths. I also added the findbugs -exitcode option so that errors trigger a non-zero process exit code and also the -maxHeap 512 option to give findbugs lots of heap space (it seems to need it, and runs a bit faster this way). So now I use something more like:

    
        <target name="myfindbugs" depends="init"
                description="Run findbugs in batch mode">
            <exec 
                executable="findbugs"
                failonerror="true">
                <arg value="-maxHeap"/>
                <arg value="512"/>
                <arg value="-textui"/>
                <arg value="-effort:max"/>
                <arg value="-low"/>
                <arg value="-exitcode"/>
                <arg path="${dist.jar}"/>
            </exec>
        </target>
    
    

As it turns out, because using the findbugs ant task causes the ant VM to run out of memory, so you had to restart ant with more memory, what a pain. Using my above batch target the findbugs process uses it's own VM. This really doesn't change the performance much since findbugs takes a few minutes to run anyway, and just using the bin findbugs script must set the max memory up higher or something.

So now I had to deal with this loss of NetBeans Junit debug capability. I did like how NetBeans automatically created the menu for the targets in my build.xml file, but I could not live without the ability to quickly debug any JUnit test. So I needed to either configure my build.xml file better, or try another approach.

So I went back to letting NetBeans create it's own ant scripts and when I found where NetBeans placed these files (build.xml plus the nbproject directory), I just copied over all the nbproject directory and the build.xml file to my project's Mercurial repository and reopened the repository as a pre-configured NetBeans project. That way I didn't have to worry about matching the NetBeans ant conventions to get the JUnit debug feature to work.

An update on this, first, do NOT include the nbproject/private directory in your repository. And second, if you tell NetBeans to use anything other than the default Java platform, things don't work very well. This was easy for me to avoid, but the way the Java platforms are defined in the ant scripts didn't make the files transportable. Maybe this was a Mac specific thing?

Then I edited the NetBeans generated build.xml file (which is now my primary product build.xml file) and added to it.

  • Some properties and hooks into the NetBeans ant scripts I needed to set for some reason. Some of these properties should not need to be set since they are set for you already in the nbproject files, so I'm puzzled why you have to set property values sometimes and not others. You will also notice the echo targets I have created, which is just my style, I like to know when targets are being run, and the ant verbose option is too verbose, so I added appropriate echo commands.
    
        <!-- project name (determines jar and script name) -->
        <property name="project.name"           value="jprt"/>
        
        <!-- top level package name -->
        <property name="package.name"           value="jprt"/>
        
        <!-- top level paths -->
        <property name="src.dir"                value="src"/>
        <property name="test.src.dir"           value="test"/>
        <property name="lib.dir"                value="lib"/>
        
        <!-- source paths -->
        <property name="bin.src"                value="${src.dir}/bin"/>
        <property name="sbin.src"               value="${src.dir}/sbin"/>
        <property name="doc.files.src"          value="${src.dir}/${package.name}/doc-files"/>
        
        <!-- build paths -->
        <property name="build.dir"              value="build"/>
        <property name="manifest.file"          value="${build.dir}/mainfest.mf"/>
        <property name="build.classes.dir"      value="${build.dir}/classes"/>
        <property name="build.test.classes.dir" value="${build.dir}/test/classes"/>
        
        <!-- dist paths -->
        <property name="dist.dir"               value="dist"/>
        <property name="bin.dir"                value="${dist.dir}/bin"/>
        <property name="sbin.dir"               value="${dist.dir}/sbin"/>
        <property name="dist.jar"               value="${dist.dir}/${project.name}.jar"/>
        
        <!-- path to test scripts  -->
        <property name="test.script"            value="${test.src.dir}/test.sh"/>
        <property name="test.system.script"     value="${test.src.dir}/test_system.sh"/>
        
        <!-- javadoc paths -->
        <property name="dist.javadoc.dir"       value="${dist.dir}/javadoc"/>
        <property name="doc.files"              value="${dist.javadoc.dir}/${package.name}/doc-files"/>
        
        <!-- classpath settings -->
        <property name="javac.classpath"        value=""/>
        <property name="run.classpath"          value="${build.classes.dir}"/>
        <property name="javac.test.classpath"   value="${build.classes.dir}:${lib.dir}/junit.jar"/>
        <property name="run.test.classpath"     value="${build.test.classes.dir}:${javac.test.classpath}"/>
        
        <!-- default system options -->
        <condition property="system.instance" value="testsystem-ant">
            <not> <isset property="system.instance"/> </not>
        </condition>
        
        <!-- always provide debugging information -->
        <property name="javac.debug"            value="true"/>
        
        <!-- the main class for the project -->
        <property name="main.class"             value="${package.name}.tools.Main"/>
        
        <!-- make sure netbeans knows we have a manifest file -->
        <property name="manifest.available"     value="true"/>
    
        <!-- hooks into netbeans ant files -->
        <target name="-pre-compile"             depends="mycompilestart"/>
        <target name="-post-compile"            depends="mycompileend"/>
        <target name="-do-jar-with-manifest"    depends="mymanifest"/>
        <target name="-pre-jar"                 depends="myjarstart,mymanifest"/>
        <target name="-post-jar"                depends="myjarend,mybinfiles,mysbinfiles,mypropfiles,myjartests"/>
        <target name="javadoc"                  depends="myjavadoc"/>
    
    
  • The special targets of my own:
    
        <!-- just used to add messages at certain points -->
        <target name="mycompilestart"> <echo message="COMPILING"/>           </target>
        <target name="mycompileend">   <echo message="COMPILING COMPLETED"/> </target>
        <target name="myjarstart">     <echo message="BUILDING JAR"/>        </target>
        <target name="myjarend">       <echo message="JAR COMPLETED"/>       </target>
        
        <!-- create my own manifest file -->
        <target name="mymanifest" description="Create manifest file">
            <echo message="Creating manifest file: ${manifest.file}"/>
            <manifest file="${manifest.file}">
                <attribute name="Built-By"   value="${user.name}"/>
                <attribute name="Main-Class" value="${main.class}"/>
            </manifest>
        </target>
        
        <!-- copy the bin files -->
        <target name="mybinfiles" description="Create bin files">
            <echo message="Populating bin files"/>
            <mkdir dir="${bin.dir}"/>
            <copy todir="${bin.dir}">
                <fileset dir="${bin.src}" casesensitive="yes">
                    <include name="*"/>
                </fileset>
            </copy>
            <chmod dir="${bin.dir}" perm="ugo+rx" includes="*"/>
        </target>
        
        <!-- copy the sbin files -->
        <target name="mysbinfiles" description="Create sbin files">
            <echo message="Populating sbin files"/>
            <mkdir dir="${sbin.dir}"/>
            <copy todir="${sbin.dir}">
                <fileset dir="${sbin.src}" casesensitive="yes">
                    <include name="*"/>
                </fileset>
            </copy>
            <chmod dir="${sbin.dir}" perm="ugo+rx" includes="*"/>
        </target>
        
        <!-- copy the property files into the sbin directory -->
        <target name="mypropfiles" description="Create sbin property files">
            <echo message="Populating ${dist.dir} with prop files"/>
            <mkdir dir="${dist.dir}"/>
            <copy todir="${dist.dir}">
                <fileset dir="${src.dir}" casesensitive="yes">
                    <include name="*.properties"/>
                </fileset>
            </copy>
            <echo message="System instance: ${system.instance}"/>
            <!-- Ant echo is Broken: <echo file="${dist.dir}/config-default.properties"
                  message="jprt.system.instance=${system.instance}"/> -->
            <exec executable="echo" failonerror="true"
                  output="${dist.dir}/config-default.properties">
                <arg value="jprt.system.instance=${system.instance}"/>
            </exec>
        </target>
        
        <!-- test the jar file -->
        <target name="myjartests" description="Test jar.">
            <echo message="Testing: java -jar ${dist.jar} "/>
            <java jar="${dist.jar}" fork="true" failonerror="true">
                <assertions> <enable/> </assertions>
            </java>
            <echo message="Testing: java -jar ${dist.jar} help"/>
            <java jar="${dist.jar}" fork="true" failonerror="true">
                <arg value="help"/>
                <assertions> <enable/> </assertions>
            </java>
            <echo message="Testing: java -jar ${dist.jar} usage"/>
            <java jar="${dist.jar}" fork="true" failonerror="true">
                <arg value="usage"/>
                <assertions> <enable/> </assertions>
            </java>
            <echo message="Testing: java -jar ${dist.jar} version"/>
            <java jar="${dist.jar}" fork="true" failonerror="true">
                <arg value="version"/>
                <assertions> <enable/> </assertions>
            </java>
            <echo message="TESTING JAR COMPLETED."/>
        </target>
        
        <!-- test the bin script -->
        <target name="mybintests" description="Test bin.">
            <chmod file="${test.script}" perm="ugo+rx"/>
            <echo message="Testing: sh -c ${test.script} ${dist.dir}"/>
            <exec executable="sh" failonerror="true">
                <arg value="-c"/>
                <arg value="${test.script} ${dist.dir}"/>
            </exec>
            <echo message="TESTING BIN SCRIPT COMPLETED."/>
        </target>
        
        <!-- test the system script -->
        <target name="mysystemtest" description="Test system.">
            <chmod file="${test.system.script}" perm="ugo+rx"/>
            <echo message="Testing: sh -c ${test.system.script} ${dist.dir} ."/>
            <exec executable="sh" failonerror="true">
                <arg value="-c"/>
                <arg value="${test.system.script} ${dist.dir} ."/>
            </exec>
            <echo message="TESTING SYSTEM SCRIPT COMPLETED."/>
        </target>
        
        <!-- findbugs target -->
        <target name="findbugs" depends="myfindbugs"
                description="Run findbugs in batch mode"/>
        
        <!-- my target that runs findbugs directly (in separate VM with 512M heap) -->
        <target name="myfindbugs" description="Run findbugs in batch mode">
            <echo message="findbugs -maxHeap 512 -textui -effort:max -low -exitcode ${dist.jar}"/>
            <exec executable="findbugs" failonerror="true" vmlauncher="false">
                <arg value="-maxHeap"/>
                <arg value="512"/>
                <arg value="-textui"/>
                <arg value="-effort:max"/>
                <arg value="-low"/>
                <arg value="-exitcode"/>
                <arg path="${dist.jar}"/>
            </exec>
            <echo message="FINDBUGS COMPLETED."/>
        </target>
        
        <!-- my own javadoc target because doc-files don't seem to get copied over -->
        <target name="myjavadoc" depends="init,-javadoc-build,-javadoc-browse" 
                description="Build Javadoc.">
            <mkdir dir="${doc.files}"/>
            <echo message="Populating doc-files directory: ${doc.files}"/>
            <copy todir="${doc.files}">
                <fileset dir="${doc.files.src}" casesensitive="yes">
                    <include name="*"/>
                </fileset>
            </copy>
            <echo message="JAVADOC COMPLETED."/>
        </target>
        
        <!-- all target -->
        <target name="all" depends="jar,test,mybintests,javadoc,findbugs"
                description="Do everything"/>
        
    
    

So all the above is new and updated. I could not get the echo to add a newline to the file, even following all the documentation on echo, so I just used the exec target and the echo command of the system. I also had problems with javadoc populating the doc-files, so I had to add my own doc-files copy. I'm not sure what I did to break this. The javadoc command seemed to be sensitive to relative vs. full paths, or the current directory setting.

My recommendation again is to avoid the use of full paths everywhere you can, it just makes life easier. Also, any need to do simple shell commands like:
domainname | cut -d'.' -f2 | tr '[:upper:]' '[:lower:]'
had better be done in a shell script or in the Makefile. In my real Makefile I do some system specific shell commands to determine the value of an ant property that I pass into ant. This works well for me because when running ant directly I don't need this setting. The other way to do this would be to exec a shell script and capture it's output. Running shell scripts in ant seems to work best when you run them with sh command. Windows often will not recognize a shell script.

The findbugs task was not connected into the NetBeans build/test system, and is just used by the Makefile or directly from the ant script.

Well, it turns out that this works very nicely.

The following Makefile was updated to avoid the use of full paths and simplify how the ant targets are used.

The Makefile was trivial, and looks like:

    
    # Makefile to simulate a NetBeans build
    
    # This Makefile is located one directory below the ant basedir
    TOPDIR  = ..
    
    # Value of ant property that needed to be created OS specific
    system_instance=testsystem
    
    # How to run ant
    ANT_OPTIONS += -Djprt.system.instance=${system_instance}
    ANT = ant $(ANT_OPTIONS)
    
    # All ant targets of interest
    ANT_TARGETS = all jar test javadoc findbugs clean init compile
    
    # Create a make target for each
    $(ANT_TARGETS):
            ( cd $(TOPDIR) && $(ANT) $@ )
    
    # Declare these phony (not filenames)
    .PHONY: $(ANT_TARGETS)
    
    

Update, now the path to ant and findbugs just need to be put in your PATH.

I'm sure there are better ways to do some of this, but I did get the above working, and I am just an ant beginner. I still don't see any easy way to loop over a set of names with ant, and the 'condition' task is really confusing. (No wonder there are 600+ page books on how to write ant scripts.) I suppose people say the same thing about Makefiles. ;^)

Hope someone gets something out of this, and yes I've learned to live with ants. ;^)

-kto


Bookmark blog post: del.icio.us del.icio.us Digg Digg DZone DZone Furl Furl Reddit Reddit
Comments
Comments are listed in date ascending order (oldest first) | Post Comment

  • Ant Adventure == Antventure!

    Dmitri

    Posted by: trembovetski on January 25, 2007 at 02:18 PM

  • Kelly,

    I was having some trouble figuring out generating and using manifests and jar files using Ant using just the Ant docs. The Ant docs seem fairly comprehensive and correct, but I was still getting a bit lost. This post was a real help! Thanks!

    regards,
    -Frank Hardisty

    Posted by: geovizer on March 11, 2007 at 07:56 AM

  • Hey.

    Here is some really quick set of examples of ANT for those interested: Ant Scripts at Coder's Log.

    The site serves as a non-profit resource on large scale java applications, a coder's journal.

    Thanks

    Posted by: screenedtwenty on June 05, 2007 at 02:05 PM

  • #
    Hey. Here is some really quick set of examples of ANT for those interested: Ant Scripts at Coder's Log. The site serves as a non-profit resource on large scale java applications, a coder's journal. Thanks


    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    sexe
    porno-extrem-gratos-gay-sexe-porno-free-sexe-gratuit-emule
    sex-hard-xxx-walt-disney-xxx-gratuit-perso-amateur-sexe-
    photo-porno-gratuit-amateur-gratuit-sexe-mature-meilleur
    de-and-sexe-video-porno-clara-morgane-nu-chat-direct-sexe-
    strapon-girls-porno-porno-lesbienne-gratuit-veritable-photo
    mure-pipe-sexe-gratruit-mangas-porno-sexe-xxx-jeune-garcon
    free-streaming-porno-telechargement-film-xxx-gratuit-
    porno-porno-gay-gros-mature-video-lesbienne-porno-porno
    telecharger-histoire-hard-cul-sexe-galerie-porno-gay-
    mature-porno-star-extrait-porno-gay-humour-sexe-gratuit-
    xxx-star-photo-sexe-bite-mangas-film-xxx-gratuit
    vente-dvd-xxx-extrait-galerie-video-porno-gratuite-live-and
    photo-porno-des-africain-sexe-video-cinema-film-charm-free
    sexe-jeune-etudiante-newsletter-and-sexe-and-histoire-
    porno-video-avec-image-telecharger-gratuitement-film-sexe-
    galerie-sexe-amateur-sexe-shop-sm-image-sexe-gratui-porno
    image-drole-et-sexe-video-gay-gratuit-sexe-page-video
    star-du-porno-x-gratuit-photo-et-video-porno-hot-sexy-xxx-
    gay-ado-porno-gros-sexe-poilu-mini-clip-xxx-video-gratuite
    sexe-avec-amateur-porno-couple-mature-image-x-porno-sexe
    bd-dragon-ball-gt-xxx-forum-probleme-sexe-pps-porno
    porno-gay-video-gratuit-bd-classique-porno-arabe-sexe-porno
    homme-and-sexe-galerie-sexe-tgp-black-ass-candy-beauty-xxx-
    sexe-hard-gros-sein-sexe-chatte-anal-galerie-amateur-sexe-
    sexe-bizarre-sexe-arabe-photo-sexe-mangas-gay-porno-photo
    photo-porno-sexe-gay-gratuit-video-cul-xxx-voir-film-porno-
    photo-sexe-hard-gratuit-photo-porno-vieille-femme-black
    clip-sexe-photo-and-and-sexe-and-gratuit-free-movies-xxx
    gay-porno-video-gratuite-libertin-sexe-blog-les-femme-arabe
    ingrid-chauvin-extrait-film-porno-grande-image-porno-blog
    photo-gratuite-sexe-femme-mature-beurette-nu-sexe-
    free-porno-clip-visualise-video-porno-gratuite-extrait-de
    photo-sexe-xxx-gratuit-fotos-xxx-blonde-anime-flash-hard
    voyeur-photo-gratuit-porno-web-cam-porno-amateur-gratuite-
    porno-amateur-gratuit-extrait-video-xxx-and-gay-porno-anal
    amateur-sexe-web-cam-femme-mariee-arabe-sexe-photo-sexe-plus
    nice-girls-xxx-amateur-casting-and-porno-and-france-galerie
    vogue-and-xxx-free-histoire-xxx-blog-rencontre-sexe-
    mature-men-porno-pic-arabe-sexe-x-web-cam-amateur-sexe-
    sexe-gratuit-extrait-taille-moyenne-du-sexe-l-homme-sexe
    film-and-porno-and-amateur-and-gratis-sexe-video-gratuite
    porno-gay-et-hetero-hard-and-xxx-extrait-sexe-totalement
    xxx-gay-free-amateur-and-porno-porno-africain-gratuit-video
    extret-film-porno-gratuit-clip-video-porno-gratos-bd-xxx
    blog-and-amatrice-and-and-sexe-porno-hard-gratuit-sexe
    lien-emule-porno-video-star-sexe-sexe-black-video-black-x
    cul-meme-xxx-mangas-porno-sexe-sex-porno-video-gratuit-
    film-porno-annuaire-video-porno-x-sexe-porno-free-gay-anal
    blog-hot-sex-xxx-clip-avec-sexe-photo-porno-gratuit-galerie
    video-and-sexe-and-gratuite-free-sexe-bizarre-film-porno-xxx
    extrait-flim-porno-gratuit-porno-sexo-xxx-emule-divx-girl
    video-casting-sexe-amateur-photo-sex-porno-gratui-sexy
    video-photo-porno-du-sex-hard-xxx-photo-xxx-clara-morgane
    school-girls-xxx-dessin-representant-sexe-masculin-feminin-
    histoire-sexuelle-porno-femme-sexe-amateur-web-cam-porno
    clip-video-sexe-gratuite-xxx-clip-video-emule-porno-xxx
    sexe-homme-afrique-histoire-sexe-homme-nu-image-insolite
    cinema-porno-girones-pps-sexe-diaporama-amatrice-sexe-clip-
    sexe-hard-core-porno-gay-gratuite-clip-porno-elisa-actrice
    adult-xxx-general-hentai-dragon-ball-xxx-forum-free-password
    image-sexe-gratuite-blog-porno-gay-gratuit-film-porno-classe-x-telecharger-gratuit-film-xxx-flash-jeu-sexe-porno-photo-lesbienne-gratuite-xxx-jeu-de-sexe-gratui-porno-sex-clip-sexe-femme-vieille-porno-gay-xxx
    pamela-xxx-video-amateur-hot-video-sexe-sexe-depucelage-puceau-mature-porno-gratuit-chatte-sexe-cochon-salope-lesbienne-porno-x-de-qualite-gay-gratuit-blog-photo-sexe-extrait-gonzos-porno-gratuit
    sexe-mangas-free-sexe-gratuit-galerie-photo-porno-hard-fr-sexmefree-and-annuaire-and-sexe-photo-gratuite-sexe-couple-amateur-histoire-and-sexe-bella-dona-mature-sexe-extrait-and-casting-and-porno
    hard-sex-porno-telechargement-jeu-xxx-free-blog-perso-sexe-cul-extrait-clip-video-sexe-gratuit-film-dvd-graduit-porno-exhibition-sexe-francais-cine-porno-arabe-free-mature-sexe-porno-star-du-x
    hard-xxx-vids-porno-cinema-voir-film-porno-x-xxx-gay-leather-chat-land-sexe-mangas-porno-image-porno-xxx-femme-vieille-mure-savannah-samson-photo-xxx-brunette-star-porno-video-gratuite-sexe-gogo
    sexe-and-free-femme-blacks-xxx-sexe-tres-hot-porno-gay-amateur-gratuit-julie-and-porno-sexe-lesbienne-cunnilingus-live-webcam-sexe-minet-gay-sexe-mangas-x-porno-photo-porno-black-gratuite
    blog-xxx-porno-dialogue-porno-telephone-et-webcam-photo-d-homme-sexe-video-porno-sur-femme-ivoirienne-jeu-hard-porno-xxx-visionner-des-video-porno-gratuite-film-black-porno-film-francais-pied-sexe
    sex-porno-extrait-gratuit-porno-and-hard-video-gratuit-extrait-sexe-porno-anal-blonde-sexe-jeu-sexe-gratuit-humour-pique-nique-xxx-photo-lesbienne-xxx-domain-ifrancecom-sexe-feminin-avec-legume
    sexe-homme-masturbation-xxx-film-free-vagin-cul-sexe-hard-gratuit-sexe-gros-plan-jpeg-xxx-and-vogue-photo-sexe-gratuite-femme-arabe-photo-de-star-du-porno-gratuite-xxx-zone-movies-sexe-hard-x
    xtrait-de-video-xxx-gratos-sexe-jeune-galerie-video-porno-telecharge-film-porno-gratui-sexe-gaulois-com-realisateur-film-porno-francais-porn-and-gay-and-sexe-and-mpg-easy-rencontre-sexe-sexe-hard-free
    amatrice-hard-xxx-plus-video-porno-gay-gratuit-annuaire-site-video-sexe-gratuit-jeu-pc-sexe-voir-photo-porno-photo-video-sexe-gratuit-porno-gay-maroc-arabe-gratuit-lolo-ferrari-film-porno-gratis
    sexe-feminin-enorme-video-and-sexe-and-hard-and-gratuit-video-free-porno-sexe-video-hard-webcam-xxx-libre-acces-image-porno-de-femme-gay-men-xxx-free-password-xxx-extrait-video-gratuite-porno
    film-video-porno-film-video-porno-gratuit-sexe-mangas-gay-sexe-de-vieille-mamie-porno-star-anal-porno-xxx-photo-porno-amateur-francais-adsl-annuaire-porno-amat-gratuit-francais-porno-skyblog-salope-porno
    xxx-ancia-voir-le-sexe-des-homme-blog-sexe-gratuit-rencontre-sexe-melun-video-perso-porno-amateur-extrait-sexe-gratuit-fetiche-gratuit-extrait-femme-video-sexe-live-rencontre-chat-sexe-gratuit
    lieux-de-rencontre-sexe-star-porno-black-galerie-sexe-mangas-live-shows-sexe-amateur-porno-specia-grosse-sexe-and-gay-and-xxx-sexe-webcam-gratuite-lesbienne-hot-porno-cul-lagitane-sexe-xxx-categorie
    xxx-galerie-movies-meilleur-sexe-shop-vente-ligne-porno-star-baisees-gratuit-video-xxx-gratuite-a-telecharger-sexe-arabe-beurette-skyblog-amateur-sexe-video-and-sexe-and-gratuit-hot-sexe-video
    jeune-chinoise-sexe-gay-gay-sexe-sexe-caresse-anal-nouvelle-star-porno-extrait-sexe-gratuit-photo-gratuit-porno-gay-photo-video-porno-jeune-gay-photo-sexe-gratuite-suisse-blog-sexe-couple-exib
    skyblog-gif-anime-sexe-hot-and-toulouse-and-sexe-initiation-sexe-porno-portail-du-sexe-com-actualite-porno-x-porno-gratui-video-sexe-cam-direct-girlwebcamfreefr-xxx-planete-webcam-sexe-vieux-et-jeune
    hard-porno-francais-video-extrait-porno-belle-femme-sexys-xxx-gratuit-film-xxx-film-porno-femme-algerienne-lire-video-porno-emule-porno-photo-trans-gratuit-xxx-free-sex-movies-amateur-photo-porno
    hot-sexe-photo-femme-exhibitionniste-libertin-aimant-sexe-google-porno-gratuit-photo-toutes-photo-sur-sexe-hard-sexe-et-anal-star-xxx-sexe-gratuit-a-gogo-afrique-sex-porno-and-porno-and-francais
    cinema-porno-x-beurette-algerienne-xxx-porno-bite-gay-cul-sexe-hot-galerie-sexe-photo-gratuite-xxx-archive-girls-hard-sexe-asiatique-ratuit-black-mature-xxx-nivon-julie-porno-image-sur-le-sexe
    regarder-video-porno-gratuite-jeune-sexe-nu-video-porno-black-enceinte-gratuite-yasmine-porno-photo-jeu-hardcore-sexe-password-and-free-and-xxx-sexe-nu-cam-sexe-shop-trio-xxx-blonde
    cam-live-free-sexe-video-and-porno-and-gratui-sexe-anal-gratuitcom-xxx-gay-cul-film-xxx-free-extrait-clip-et-film-sexe-gratuit-sex-porno-arabe-telecharger-divx-porno-annuaire-de-sexe-totalement-gratuit
    gratuit-porno-gay-extrait-de-video-de-sexe-gratuit-a-telecharger-sexe-hot-string-cinema-porno-video-porno-totalement-gratuite-photo-porno-ancienne-porno-sex-video-star-porno-francaise-histoire-rasage-sexe
    image-femme-porno-chat-sexe-ado-video-porno-francaise-gratuite-sexe-sexy-hot-photo-yasmine-actrice-porno-video-sexe-entierement-gratuite-black-hardcore-sexe-anal-porno-movies-forum-video-xxx
    photo-sexe-gratui-arabe-donne-mature-porno-gratuito-jaquette-dvd-xxx-sexe-video-gratuit-hard-sexe-chez-l-homme-jeu-and-xxx-beurette-sexe-amateur-video-xxx-amateur-cul-sexe-porno
    film-xxx-nouveaute-film-porno-gratuit-sur-webcam-femme-mure-gratuit-xxx-boutique-film-porno-dvd-blog-and-sexe-and-amatrice-mini-extrait-film-porno-sexe-and-amateur-and-video-video-porno-fichier-jpeg-free-download
    casting-tourner-film-porno-google-site-porno-gratis-sponsorise-visionner-film-xxx-gratuit-video-xxx-jpeg-galerie-sexe-et-cul-fr-sexe-et-star-telechargement-video-sexe-porno-with-black-women-dbz-xxx-porno
    porno-star-americaine-xxx-porno-sex-femme-sexe-porno-top-hard-xxx-video-sexe-amatrice-video-production-film-porno-amateur-cannelle-actrice-porno-francais-sexe-de-vieille-grosse-sexe
    amina-maroc-sexe-porno-amatrice-montfermeil-sexe-sexe-shop-fr-vraie-photo-amateur-sexe-galerie-porno-tout-genres-sexe-porno-gay-movies-free-sexe-extrait-video-porno-sans-abonnement-femme-mure-sexe-gratuit
    porno-femme-mure-gratuit-sexe-tgp-gratuit-mangas-adulte-sexe-photo-xxx-porno-photo-gratuite-de-sexe-feminin-gay-sexe-gratuit-photo-xxx-gratuit-sexe-geant-sexe-tres-vieille-extrait-gratuit-video-porno-video
    film-porno-video-jeu-erotique-porno-sexy-aicha-x-porno-bollywood-actress-xxx-photo-annuaire-forum-sexe-galerie-sexe-photo-video-gratuit-extrait-porno-agence-de-casting-porno-clip-porno-anal
    free-porno-pics-jeu-humour-xxx-photo-et-video-de-sexe-gratuite-simpsons-toon-xxx-video-sexe-gratuite-yasmine-sexe-anal-photo-xxx-world-index-image-jpeg-porno-sexe-gros-plan-live-show-audio-sexe
    sexe-xxx-star-academie-xxx-photo-arabe-porno-sexe-shop-thionville-porno-video-gratuit-a-telecharger-porno-hard-asiatique-porno-xxx-video-gratuit-video-sex-xxx-extrait-xxx-film-porno-photo-gratuit-de-sexe-amateur
    video-gratuite-porno-portail-free-preview-porno-sexe-black-brutal-xxx-site-sexe-page-rank-high-dvd-porno-japon-sexe-shop-usa-sexe-and-gratuit-and-sado-and-femme-mure-sexe-homme-homme
    photo-sexe-lingerie-gratuite-pokemon-and-xxx-xxx-sexe-xxx-sex-lolita-xxx-xxx-gom-com-skyblog-porno-video-porno-anal-indians-black-sexe-sex-gratui-porno-actrice-porno-italienne-gros-black-porno
    mini-clip-sexe-gratuit-demo-virtuelle-film-xxx-gratuit-sans-connexion-gay-and-porno-and-gratuit-bulle-actrice-porno-moteur-and-and-recherche-and-sexe-and-sexe-gratuit-and-annuaire-sexe-and-annuaire-charme-and-site
    photo-d-un-sexe-feminin-gratuit-grosse-arabe-sexe-galerie-femme-manque-sexe-film-porno-boure-sexe-clip-xxx-free-extrait-film-gratuit-porno-sexe-gay-fr-blog-retro-porno-clip-sexe-amateur-photo-xxx
    jeune-gay-sexe-porno-gay-sexe-xxx-black-porn-sexe-annonces-bretagne-mangas-super-sexe-galerie-xxx-mature-free-sexe-live-cam-contribution-amateur-sexe-photo-sexe-poilu-photo-xxx-recherche
    video-casting-porno-novelle-star-porno-photo-porno-amateur-discipline-gratuit-fouet-bd-and-xxx-maroc-sex-porno-porno-gay-extrait-video-gratuit-porno-sex-lesbienne-blog-sexe-amateur-gratuit-beurette-sexe-xxx-hard
    sexe-porno-amateur-porno-and-retro-porno-avec-pied-asiatique-mangas-porno-gratui-video-gratuite-sexe-amateur-photo-sex-porno-sexe-amateur-francais-annuaire-sexe-bonne-webcam-free-porno
    rencontre-sexe-toulouse-skyblog-j-adore-sexe-petit-sexe-xxx-divx-porno-gratuit-sexe-coquin-xxx-cite-porno-gratuit-vente-de-dvd-porno-gay-telecharger-video-xxx-video-extrait-gratuit-de-porno
    xxx-sample-movies-annuaire-sexe-video-gratuit-amateur-sexe-video-video-russe-porno-xxx-video-porno-retro-gratos-sex-porno-photo-nami-one-piece-xxx-hentai-photo-gratuite-sexe-gratuit-portail-sexe-amateur-gratuit
    pokemon-xxx-sex-mangas-porno-gratuite-sexe-porno-gratos-porno-gratuit-avec-clip-gratuit-video-porno-gay-beur-porno-gay-gratos-mature-mother-sexe-sexe-porno-mature
    montreal-sexe-conversation-lesbienne-annuaire-porno-couple-rencontre-sexe-webcam-gratuit-dbz-mangas-xxx-free-sexe-amateur-photo-sexe-gratuit-bizarre-telechargez-sex-xxx-gratuit-sexe-gay-extrait-video-gratuit
    video-et-photo-sexe-gratuite-crade-sexe-xxlfr-video-sexe-xxx-gratuit-video-hard-de-sexe-amateur-photo-de-sexe-mature-gratuit-xxx-collection-avec-xxx-collection-et-collection-photo-porno-hards-xxx-choquantes
    sexe-sous-jupe-star-sexe-gaulois-tgp-photo-sexe-homme-nu-grosse-femme-sexe-blog-sex-porno-porno-and-free-porno-film-gratos-video-porno-gratuite-est-sans-inscription-arabe-sexe-free-dvd-bel-ami-xxx
    liste-des-star-du-porno-francais-sexe-couple-x-video-gratuite-extrait-porno-star-nu-celebrite-sexe-sexe-blog-bd-mangas-porno-gratuite-galerie-video-baise-ronde-sexe-grosse-photo-belle-femme-mure-sexe-gratuit
    sexe-jeune-beurette-free-porno-site-jeune-pucelle-sexe-image-and-porno-and-gratuite-cleopatra-private-xxx-big-black-sexe-forum-sexe-adulte-femme-rencontre-homme-sexe-belgique-adult-xxx-movies
    gratuit-video-sexe-sexy-xxx-porno-sexe-shop-a-pigalle-jeu-sexe-flash-gratuit-photo-porno-mec-maroc-sexe-cam-cam-amateur-arabe-femme-sexe-xxx-mangas-hentai-sakura-sexe-gratuit-bizarre-gros-sexe-gay-black
    black-and-xxx-photo-extreme-sexe-extrait-video-gratuit-film-porno-sexe-asiatique-gratuite-video-sexe-black-mapouka/
    mature-porno-video-sexe-hot-blonde-mangas-porno-hentai-gratuit-divx-and-emule/
    sexe-image-sexe-clip-annuaire-sexe-gratuit-sexe-porno-xxx-martinique-guadeloupe-cinema-porno-gay-bruxelles/
    sexe-hard-core-clip-sample-movies-mum-gratuit-amateur-sexe-asiatique-sexe-couple-libertin/
    sexe-sexe-and-ultime-x-film-porno-sexe-amateur-gratos-annuaire-sexe-suisse-sexe-photo-hard-gratuite/
    porno-x-gratuit-sexe-porno-du-maroc-photo-porno-nancy-ajram-lolita-porno-hard-sex-femme-xxx/
    free-xxx-toon-gay-gothique-amatrice-video-xxx-gratuit-catoons-gay-xxx-casting-cinema-porno/
    demo-de-film-xxx-wanadoo-sexe-amateur-webcam-film-porno-mangas-gratuit/
    salope-arabe-photo-xxx-femme-sexe-poilue-hot-sexe-sexe-hard-photo-extrait-video-porno-gratuit-video/
    sexe-et-porno-femme-mature-video-galerie-porno-gratuit-z-extrait-video-porno-porno-star-video-extrait-porno-video-amateur/
    sexe2
    sexe3
    sexe4
    sexe5
    sexe6
    sexe7
    sexe8
    sexe9
    sexe10
    sexe11
    sexe2
    sexe3
    sexe4
    sexe5
    sexe6
    sexe7
    sexe8
    sexe9
    sexe10
    sexe11
    sexe12
    sexe5897
    sexe5669
    sexe5441
    sexe5213
    sexe4985
    sexe4757
    sexe4529
    sexe6581
    sexe6353
    sexe6125
    sexe9636
    sexe9408
    sexe9180
    sexe8952
    sexe8724
    sexe8496
    sexe8268
    sexe
    sexe9864
    sodomie-gay-xxx-voissa-annuaire-gratuit-sexe-gay-sexe
    gratuit-xxx-lesbienne-gratuit-extrait-film-porno-long
    video-film-sexe-gros-cul-sexe-histoire-porno-xxx-
    sex-porno-photo-sexe-xxx-gratuit-sexe-video-hard-clip
    avec-photo-et-tel-porno-film-x-sexe-gros-salope-amateur
    sexe-histoire-petit-sexe-free-xxx-video-download-sexe
    anal-porno-gay-gratuit-canada-jeu-sexe-gratuit-avec-son-
    gratuit-page-perso-histoire-sexe-histoire-sexe-sexephile-
    ultime-sexe-dvd-image-torture-electrique-sexe-homme-film
    sexe-photo-free-sexe-shop-catalogue-vieille-cochon-du-sexe-
    amiens-annuaire-photo-sexe-photo-sexe-gratuite-celebrite
    amatrice-libertin-sexe-xxx-porno-exhibitionniste-image-sexe-de
    hard-xxx-video-video-sexe-gratuit-gay-crade-sexe-xxl-fr-
    movies-jenna-sexe-shop-thionville-photo-gratuite-sexe
    star-porno-porno-gratuit-sexephile-sexe-devant-cam-xxx
    hard-gratuit-photo-video-clip-gratuit-porno-gay-sexe-video

    sexe833
    sexe834
    sexe835
    sexe836
    sexe837
    sexe838
    sexe839
    sexe840
    sexe841
    sexe842
    sexe843
    sexe844
    sexe845
    sexe846
    sexe847
    sexe848
    sexe849
    sexe850
    sexe851
    sexe852
    sexe853
    sexe854
    sexe855
    sexe856
    sexe857
    sexe858
    sexe859
    sexe860
    sexe861
    sexe862
    sexe863
    sexe864
    sexe865
    sexe866
    sexe867
    sexe868
    sexe869
    sexe870
    sexe871
    sexe872
    sexe873
    sexe874
    sexe875
    sexe876
    sexe877
    sexe878
    sexe879
    sexe880
    sexe881
    sexe882
    sexe883
    sexe884
    sexe
    sexe
    sexe8892
    sexe8893
    sexe8894
    sexe8895
    sexe8896
    sexe8897
    sexe8898
    sexe8899
    sexe8900
    sexe8901
    sexe8902
    sexe8903
    sexe8904
    sexe8905
    sexe8906
    sexe8907
    sexe8908
    sexe8909
    sexe8910
    sexe8911
    sexe8912
    sexe8913
    sexe8914
    sexe8915
    sexe8916
    sexe8917
    sexe8918
    sexe8919
    sexe8920
    sexe8921
    sexe8922
    sexe8923
    sexe8924
    sexe8925
    sexe8926
    sexe8927
    sexe8928
    sexe8929
    sexe8930
    sexe8931
    sexe8932
    sexe8933
    sexe8934
    sexe8935
    sexe8936
    sexe8937
    sexe8938
    sexe8939
    sexe8940
    sexe8941
    sexe8942
    sexe8943
    sexe8944
    sexe8945
    sexe8946
    sexe8947
    sexe8948
    sexe8949
    sexe8950
    sexe8951
    sexe8952
    sexe8953
    sexe8954
    sexe8955
    sexe8956
    sexe8957
    sexe8958
    sexe8959
    sexe9160

    Posted by: ikermollas on June 12, 2007 at 12:12 AM





Powered by
Movable Type 3.01D
 Feed java.net RSS Feeds