Skip to content

Compiling Software

Introduction

Due to the distributed nature of the Open Science Pool, you will always need to ensure that your jobs have access to the software that will be executed. You have two options for using code on the OSG – transferring the code files by themselves, or putting the code files into a container. Sometimes code is already compiled and they offer a direct executable for the UNIX or Linux system. Those types of software can be directly used on the OSPool. If your software is dependent on different library functions and does not have a make or install command consider using containers. To learn more about containers please follow the instructions on our container guide. If your code is written in C or C++, and has instructions including make-this guide will help you. Moreover, this guide provides general information for compiling and using your software in the OSPool. A detailed example of a specific software compilation process is additionally available at Example Compilation Guide.

What is compiling? The process of compiling converts human readable code into binary, machine readable code that will execute the steps of the program.

Get software source code

The first step to compiling your software is to locate and download the source code, being sure to select the version that you want. Source code will often be made available as a compressed tar archive which will need to be extracted for before compilation.

You should also carefully review the installation instructions provided by the software developers. The installation instructions should include important information regarding various options for configuring and performing the compilation. Also carefully note any system dependencies (hardware, other software, and libraries) that are required for your software.

Select the appropriate compiler and compilation options

A compiler is a program that is used to peform source code compilation. The GNU Compiler Collection (GCC) is a common, open source collection of compilers with support for C, C++, fotran, and other languages, and includes important libraries for supporting your compilation and sometimes software execution. Your software compilation may require certain versions of a compiler which should be noted in the installation instructions or system dependencies documention. Currently the Access Points have GCC 8.5.0 as the default version, but newer versions of GCC may also be available - to learn more please contact support@osg-htc.org.

Static versus dynamic linking during compilation

Binary code often depends on additional information (i.e. instructions) from other software, known as libraries, for proper execution. The default behavior when compiling, is for the final binary to be "dynamically linked" to libraries that it depends on, such that when the binary is executed, it will look for these library files on the system that it is running on. Thus a copy of the appropriate library files will need to be available to your software wherever it runs. OSPool users can transfer a copy of the necessary libraries along with with their jobs to manage such dependencies if not supported by the execute node that your jobs run on.

However, the option exists to "statically link" the library dependencies of your software. By statically linking libraries during compilation, the library code will be directly packaged with your software binary meaning the libraries will always be available to your software which your software to run on more execute nodes.

To statically link libraries during compilation, use the -static flag when running gcc, use --enable-static when running a configure script, or set your LD_FLAGS environment variable to --enable-static (e.g. export LD_FLAGS="--enable-static").

Get access to libraries needed for your software

As described above, your software may require additional software, known as libraries, for compilation and execution. For greatest portability of your software, we recommend installing the libraries needed for your software and transferring a copy of the libraries along with your subsequent jobs. When using libraries that you have installed yourself, you will likely need to add these libraries to your LIBRARY_PATH environment variable before compiling your software. There may also be additional environment variables that will need to be defined or modified for software compilation, this information should be provided in the installtion instructions of your software. For any libraries added to LIBRARY_PATH before software compilation, you'll also need to add these same libraries to your LD_LIBRARY_PATH as a step in your job's executable bash script before executing your software.

Perform your compilation

Software compilation is easiest to perform interactively, and OSPool users are welcome to compile software directly on their assigned Access Point. This will ensure that your application is built on an environment that is similar to the majority of the compute nodes on OSG. Because OSG Access Points currently use the Alma/CentOS Linux 8 operating system (which are similar to the
more general Red Hat Enterprise Linux, or RHEL distribution), your software will, generally, only be compatible for execution on RHEL 9 or similar operating systems. You can use the requirements statement of your HTCondor submit file to direct your jobs to execute nodes with specific operating systems, for instance:

requirements = (OSGVO_OS_STRING == "RHEL 9")

Software installation typically includes three steps: 1.) configuration, 2.) compilation, and 3.) "installation" which places the compiled code in a specific location. In most cases, these steps will be achieved with the following commands:

./configure
make
make install

Most software is written to install to a default location, however your OSG Access Point account is not authorized to write to these default system locations. Instead, you will want to create a folder for your software installation in your home directory and use an option in the configuration step that will install the software to this folder:

./configure --prefix=/home/username/path

where username should be replaced with your OSG username and path replaced with the path to the directory you created for your software installation.

Watch out for hardware feature detection

Some software builds might try to optimize the software for the particular host you are building on. In general this is a good idea (optimized code will perform better), but be aware that not all execution endpoints on OSG are the same. If your software picks up hardware features such as AVX/AVX2, you might have to ensure the jobs are running on hardware with those features. For example, if your software requires AVX2:

requirements = (OSGVO_OS_STRING == "RHEL 9") && (HAS_AVX2 == True)

Please see Control Where Your Jobs Run / Job Requirements

Use Your Software

When submitting jobs, you will need to transfer a copy of your compiled software, and any dynamically-linked dependencies that you also installed. Our Introduction to Data Management on OSG guide is a good starting point for more information for selecting the appropriate methods for transferring you software. Depending on your job workflow, it may be possible to directly specify your executable binary as the executable in your HTCondor submit file.

When using your software in subsequent job submissions, be sure to add additional
commands to the executable bash script to define evironment variables, like for instance LD_LIBRARY_PATH, that may be needed to properly execute your software.

Get Additional Assistance

If you have questions or need assistance, please contact support@osg-htc.org.