diff --git a/.cirrus.yml b/.cirrus.yml new file mode 100644 index 0000000..b53fabc --- /dev/null +++ b/.cirrus.yml @@ -0,0 +1,30 @@ +task: + matrix: + - name: FreeBSD + freebsd_instance: + image: freebsd-13-2-release-amd64 + - name: MacOS M1 + macos_instance: + image: ghcr.io/cirruslabs/macos-monterey-base:latest + dependencies_script: | + echo $(uname) + if [ "$(uname)" = "FreeBSD" ]; then + pkg install -y py39-pip meson bash gcc12 + else + brew install python meson gcc + fi + configure_script: | + if [ "$(uname -s)" = "FreeBSD" ]; then + FC=gfortran12 CC=gcc12 CXX=g++12 meson setup builddir + else + FC=gfortran-12 CC=gcc-12 CXX=g++-12 meson setup builddir + fi + build_script: | + meson compile -C builddir + install_script: | + meson install -C builddir + test_script: | + meson test -C builddir + on_failure: + log_artifacts: + path: builddir/meson-logs/*log.txt diff --git a/.github/workflows/meson.yml b/.github/workflows/meson.yml new file mode 100644 index 0000000..c5816f2 --- /dev/null +++ b/.github/workflows/meson.yml @@ -0,0 +1,83 @@ +name: Meson +on: + push: + branches: + - master + pull_request: + types: [opened, synchronize, reopened] +jobs: + build: + name: SIFDecode/${{ matrix.os }}/${{ matrix.fc_cmd }}/${{ matrix.compiler_version }} + strategy: + fail-fast: false + matrix: + os: [windows-latest, ubuntu-latest, macos-latest] + compiler_version: [12] + include: + - compiler: gnu + fc_cmd: gfortran + runs-on: ${{ matrix.os }} + steps: + - name: Check out SIFDecode + uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Install Meson and Ninja + run: pip install meson ninja + + - name: Install GNU compilers + if: matrix.compiler == 'gnu' + uses: awvwgk/setup-fortran@main + with: + compiler: gcc + version: ${{ matrix.compiler_version }} + + - name: Install classic Intel compilers + if: matrix.compiler == 'intel' + uses: awvwgk/setup-fortran@main + with: + compiler: intel-classic + version: ${{ matrix.compiler_version }} + + - name: Install nextgen Intel compilers + if: matrix.compiler == 'intel-llvm' + uses: awvwgk/setup-fortran@main + with: + compiler: intel + version: ${{ matrix.compiler_version }} + + # Uncomment this section to obtain ssh access to VM + # - name: Setup tmate session + # if: matrix.os == 'windows-latest' + # uses: mxschmitt/action-tmate@v3 + + - name: Setup SIFDecode + shell: bash + run: | + meson setup builddir --prefix=$GITHUB_WORKSPACE/../meson + env: + FC: ${{ matrix.fc_cmd }} + + - name: Build SIFDecode + shell: bash + run: | + meson compile -C builddir + - uses: actions/upload-artifact@v3 + if: failure() + with: + name: ${{ matrix.os }}_${{ matrix.fc_cmd }}_${{ matrix.compiler_version }}_meson-log.txt + path: builddir/meson-logs/meson-log.txt + + - name: Install SIFDecode + shell: bash + run: | + meson install -C builddir + - uses: actions/upload-artifact@v3 + if: failure() + with: + name: ${{ matrix.os }}_${{ matrix.fc_cmd }}_${{ matrix.compiler_version }}_install-log.txt + path: builddir/meson-logs/install-log.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b6c40c6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +objects/* +modules/* +versions/* +makefiles/* +bin/sys/* diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index a697049..0000000 --- a/.travis.yml +++ /dev/null @@ -1,50 +0,0 @@ -language: bash - -os: - - linux - - osx - -sudo: required - -branches: - only: - - master - -notifications: - email: false - -env: - - ARCHDEFS_VERSION=2.0.3 - - ARCHDEFS_VERSION=master - -before_install: - - if [[ $TRAVIS_OS_NAME == "linux" ]]; then sudo apt-get update -qq; sudo apt-get install -qq wget gfortran; fi - - if [[ $TRAVIS_OS_NAME == "osx" ]]; then brew update; fi - - mkdir -p $HOME/archdefs - - cd $HOME/archdefs - - if [[ $ARCHDEFS_VERSION == "master" ]]; then - git clone https://github.com/ralna/ARCHDefs.git; - export ARCHDEFS=$HOME/archdefs/ARCHDefs; - else - wget https://github.com/ralna/ARCHDefs/archive/v$ARCHDEFS_VERSION.tar.gz; - export ARCHDEFS=$HOME/archdefs/ARCHDefs-$ARCHDEFS_VERSION; - tar xvf v$ARCHDEFS_VERSION.tar.gz; - fi - - export SIFDECODE=$TRAVIS_BUILD_DIR - - export MASTSIF=$SIFDECODE/sif - - if [[ -a .git/shallow ]]; then git fetch --unshallow; fi - -install: - - cd $TRAVIS_BUILD_DIR - - if [[ $TRAVIS_OS_NAME == "linux" ]]; then printf "6\n2\n5\n" > sifdecode.input; fi - - if [[ $TRAVIS_OS_NAME == "osx" ]]; then printf "13\n2\n" > sifdecode.input; fi - - printf "nny" >> sifdecode.input - - ./install_sifdecode < sifdecode.input - - if [[ $TRAVIS_OS_NAME == "linux" ]]; then export MYARCH=pc64.lnx.gfo; fi - - if [[ $TRAVIS_OS_NAME == "osx" ]]; then export MYARCH=mac64.osx.gfo; fi - -script: - - ./bin/sifdecoder ROSENBR.SIF - - grep DOUBLE ELFUN.f || false - - ./bin/sifdecoder -sp ROSENBR.SIF - - grep REAL ELFUN.f || false diff --git a/install_modules.py b/install_modules.py new file mode 100644 index 0000000..4932cee --- /dev/null +++ b/install_modules.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +# Initially proposed by Sebastian Ehlert (@awvwgk) +from os import environ, listdir, makedirs, walk +from os.path import join, isdir, exists +from sys import argv +from shutil import copy + +build_dir = environ["MESON_BUILD_ROOT"] +if "MESON_INSTALL_DESTDIR_PREFIX" in environ: + install_dir = environ["MESON_INSTALL_DESTDIR_PREFIX"] +else: + install_dir = environ["MESON_INSTALL_PREFIX"] + +include_dir = "modules" +module_dir = join(install_dir, include_dir) + +modules = [] +# finds $build_dir/**/*.mod and $build_dir/**/*.smod +for root, dirs, files in walk(build_dir): + modules += [join(root, f) for f in files if f.endswith(".mod") or f.endswith(".smod")] + +if not exists(module_dir): + makedirs(module_dir) + +for mod in modules: + print("Installing", mod, "to", module_dir) + copy(mod, module_dir) diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..c43514e --- /dev/null +++ b/meson.build @@ -0,0 +1,39 @@ +project( + 'SIFDecode', + 'fortran', + version: '2023.10.13', + meson_version: '>= 0.63.0', + default_options: [ + 'buildtype=release', + 'libdir=lib', + 'default_library=shared', + 'warning_level=0', + ], +) + +libsifdecode_src = [] +sifdecode_binaries = [] + +# Sources +subdir('src/check') +subdir('src/decode') +subdir('src/select') + +# Library +libsifdecode = library('sifdecode', + sources : libsifdecode_src, + install : true) + +# Binaries +foreach binary: sifdecode_binaries + binname = binary[0] + binfile = binary[1] + executable(binname, + sources : binfile, + link_with : libsifdecode, + install : true) +endforeach + +# Fortran modules +script_modules = files('install_modules.py') +meson.add_install_script(script_modules) diff --git a/src/check/meson.build b/src/check/meson.build new file mode 100644 index 0000000..c45d52a --- /dev/null +++ b/src/check/meson.build @@ -0,0 +1,2 @@ +libsifdecode_src += files('check_derivs.f90', 'random.f90') +# sifdecode_binaries += [['check_derivs_main', files('check_derivs_main.f90')]] diff --git a/src/decode/meson.build b/src/decode/meson.build new file mode 100644 index 0000000..55dca0f --- /dev/null +++ b/src/decode/meson.build @@ -0,0 +1,2 @@ +libsifdecode_src += files('sifdecode.f90') +sifdecode_binaries += [['sifdecode_main', files('sifdecode_main.f90')]] diff --git a/src/select/meson.build b/src/select/meson.build new file mode 100644 index 0000000..2ea5755 --- /dev/null +++ b/src/select/meson.build @@ -0,0 +1,2 @@ +sifdecode_binaries += [['clsf', files('clsf.f')], + ['slct', files('slct.f')]]