simona
simona

Reputation: 2181

How to get the path where the library is installed

I am working in Linux and I have a library written in Fortran 90 (written by 3rd party), that is reading from a file in the current working directory. I would like to be able to call the resulting library from other folders, hence I need to read the path where the library is installed. How can I know the path to the compiled library within the Fortran code?

I need to store in a variable the path within the code.

For who knows python, I want to achieve the same as

import os
os.path.dirname(os.path.abspath(__file__))

but in f90 (see Get location of the .py source file)

Using the suggestions in the comment I have done the following:

export DATAPATH=`pwd`
make

in the Makefile

ifort -O3 -fpic -fpp -DDATAPATH -c mysource.f90

in mysource.f90

subroutine mysub
  character(len=100)::dpath
#ifdef DATAPATH
  dpath=DATAPATH
#endif
  open(10,file=trim(dpath)//'initialise.dat')
  ....
  ....

the problem is that at compile time I get

mysource.f90(42): error #6054: A CHARACTER data type is required in this context.   [1]
    dpath=1
----------^
compilation aborted for mysource.f90 (code 1)

Upvotes: 0

Views: 2079

Answers (2)

If you wish you can fix the path at compile time. Something like

gfortran -cpp mylib.f90 -DPREFIX=\"/usr/local/\"

open(newunit=u,file=PREFIX//'mylib/initialise.dat')

You must than make sure the library is indeed installed in that place PREFIX/mylib/


You can create an environment variable containing the path of your data. This variable can be set by hand, in your .bashrc or .bash_profile or in the system /etc/profile.d/ or /etc/bash.bashrc, there are manyways and they depend if the library is just for one user or for all users of some large computer.

For example export MYLIB_PATH='/usr/local/mylib'

Then you can read the variable in Fortran as

CALL get_environment_variable("MYLIB_PATH", mylib_path, status=stat)

and the path is now in variable mylib_path. You can check the success by checking if stat==0.


This is not the only possible approach. You can also have a configuration file for your library in your home directory:

mkdir $HOME/.config/mylib/
echo "/usr/local/mylib" > $HOME/.config/mylib/path

and then you can try to read the path from this file if the environment variable was not set

if (stat/=0) then
  CALL get_environment_variable("HOME", home_dir)
  open(newunit=path_unit, file=home_dir//'/.config/mylib/path',status='old',action='read',iostat=stat)
  if (stat/=0) complain

  read(path_unit,'(a)',iostat=stat)  mylib_path
  if (stat/=0) complain
end if

Upvotes: 1

Rob
Rob

Reputation: 584

So when you compiled with -DDATAPATH you have not passed the variable DATAPATH into your code only declared a symbol called DATAPATH as being true, so ifort will substitute DATAPATH as 1. What you need to do is pass it as a value:

-DDATAPATH="$(DATAPATH)"

For the compilation to work.

Upvotes: 1

Related Questions