Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Fruit could be use along with Ruby pre-processor as part of the simple standalone FORTRAN approach. The advantage of using the pre-processor is it removes the need to maintain the basket and driver files and keep them up to date.

IMPORTANT: Notice all file code blocks have first line commented with their location. This will help you understanding where should they be placed.

Example project structure

Code Block
.
├── mod
├── src
│   └── <your_module>.f90 
├── test  
│   ├── <your_module>_test.f90 
│   ├── fruit_generator.rb
|   └──├── fruit.f90
|   └── Makefile
└── rake_base.rb
  • fruit.f90 - fruit source code
  • mod - directory used to store .mod files
  • <your_module>.f90 - your actual module
  • <your_module>_test.f90 - file with unit tests for your module
  • fruit_geneator.rb - script used to generate test driver and basket files
  • Makefile - used to compile and run all tests

Prepare environment

You will need to load module 'ruby' to use auto-generating scripts.

Code Block
module load ruby
module load itm-gcc/7.3.0 #gcc is needed to build ruby libraries

Install requirements

 FRUIT source code

Code Block
cd <project_dir>/test
wget https://githubraw.githubusercontent.com/mortele/FRUIT/blob/master/src/fruit.f90

Ruby

Code Block
sudo apt install ruby-full
ruby --version

Rake


Info
titleIMPORTANT

While compiling fruit.f90 an error "Logicals must be compared with .eqv. instead of .eq." may occure. In this case you will need to modify fruit.f90 lines 912 and 913 editing ".eq." to ".eqv.". This step is needed to be done only once, during first run.


You can try to compile fruit.f90 at this step by calling gfortran compiler:
gfortran fruit.f90 -o fruit

Rake

Code Block
gem install rake --user-install

You will need to add gem to PATH in order to run gem packages.

Code Block
cd ~
nano .bashrc

#add line at the end of file
export PATH="~/.gem/ruby/3.1.0/bin:$PATH"

#ctrl + O to save file
#ctrl + X to exit nano

source ~/.bashrc

Bundler

Code Block
gem install bundler --user-install
gem install json --user-install
Code Block
sudo gem install rake

 Fruit_processor_gem

Download fruit_

...

processor_gem

...

This could be downloaded anywhere, just to install additional ruby package.

Code Block
https://github.com/mortele/FRUIT/tree/master/fruit_processor_gem

NOTE: you will need to download whole repository, or download one folder from github online editor.

To do this:

  • Open in your browser

You will need to download and install ruby gem. It is used to auto-detect test files and generate test drivers.

You will install it only once and it will apply to any project where you use it.

Code Block
cd <somewhere outside project>
git clone --recursive 
Code Block
https://github.devcom/mortele/FRUIT/tree/master/fruit_processor_gem

...

Install

...

fruit_processor_

...

gemcd fruit_

...

pr

Code Block
cd .FRUIT/fruit_processor_gem
sudo rake install

rake_base.rb

You will need to download rake_base.rb file from FRUIT repository in order to run fruit_generator script. You will never modify it's content.

Code Block
cd <project_dir>
wget https://raw.githubusercontent.com/mortele/FRUIT/master/rake_base.rb

Create project files

...

calculator_test.f90

This file contains your tests, setup and teardown subroutines.

Code Block
!file <project_directory>/test/calculator_test.f90

module calculator_test
use fruit

contains
subroutine setup
	print *, "setup subroutine ran"
end subroutine setup

subroutine teardown
	print *, "teardown subroutine ran"
end subroutine teardown

subroutine test_calculator
	use calculator
	integer :: result

	!test add subroutine
	call add (2,2,result)
	call assert_equals(4,result)

end subroutine test_calculator

end module calculator_test

NOTE: in order to autogenerate test_driver and test_bucket basket files, you need to follow naming convention:

  • files containing tests must be named: *_test.f90
  • test module must be named: *_test
  • test subroutines must be named: test_*

calculator.f90

This is your module.

Code Block
!file <project_directory>/src/calculator.f90

module calculator
implicit none
contains
	subroutine add(a,b,output)
		integer, intent (in) :: a,b
		integer, intent (out) :: output
		output=a+b
	end subroutine add
end module calculator

Create driving files

fruit_generator.rb

This is script needed to run FRUIT processor. You create it once and never modify in basic usage scenario.

Code Block
#file <project_dir>/test/fruit_generator.rb

require 'rubygems'
require 'fruit_processor'
load "../rake_base.rb"

$build_dir = ""
$goal = "fruit_driver_dummy"

fp = FruitProcessor.new
fp.pre_process

Configuration

You may need to change your compiler from gfortran to other. To do this modify below lines in rake_base.rb file:

Makefile

This is file with build instruction. You will not have nanoto modify it unless you stick to project structure. Just copy it's content and save as Makefile in <project_dir>/test directory.

Code Block
#file <project_dir>/test/Makefile

compiler=gfortran
option=-Wall -Wtabs -Wextra -Wno-tabs
Code Block
$compiler = 'gfortran'
$option = "-Wall -Wextra -pedantic -fbounds-check " +
			"-Wuninitialized -O -g \
 -Wno-unused-parameter -cpp

fruit_code = ./fruit.f90
code = ../src/*.f90 ./*_test.f90
code_gen = fruit_basket_gen.f90 fruit_driver_gen.f90

all_code = $(fruit_code) $(code) $(code_gen)

driver = fruit_driver

all : build run

build : $(driver)

fruit_basket_gen.f90 : $(code)
	ruby fruit_generator.rb

fruit_driver_gen.f90 : $(code)
	ruby fruit_generator.rb

fruit_driver : $(all_code)
	$(compiler) $(option) $(all_code) -J ../mod -o fruit_driver

clean : 
	rm -f *.o *.mod *.obj fruit_driver
	rm -f fruit_driver_gen.f90
	rm -f fruit_basket_gen.f90
	rm -f result.xml result_tmp.xml

run : $(driver)
	./$(driver)	

.PHONY : all clean run

Run tests

Run commands listed below.

Code Block
cd <project_dir>/test
make

NOTE: While compiling fruit.f90 an error "Logicals must be compared with .eqv. instead of .eq." may occure. In this case you will need to modify fruit.f90 lines 912 and 913 editing ".eq." to ".eqv.". This step is needed to be done only once, during first run.

Example output

Image Added