Compare commits

..

6 Commits

Author SHA1 Message Date
Radovan Bast
ba05c8aafc add __init__.py 2016-07-11 16:42:37 +02:00
Radovan Bast
9d1ab64720 do not repeat all that code 2016-07-11 16:32:00 +02:00
Radovan Bast
18349229ff trim 2016-07-11 16:29:14 +02:00
Radovan Bast
05f4ad9116 do not entangle tests 2016-07-11 16:20:44 +02:00
Radovan Bast
1aa7e1a4bd do not repeat tests 2016-07-11 16:18:25 +02:00
Radovan Bast
4d902ea85c add Miro's modifications for OpenBLAS detection 2016-07-11 16:14:44 +02:00
115 changed files with 1466 additions and 1261 deletions

View File

@ -1,32 +0,0 @@
let
hostPkgs = import <nixpkgs> {};
nixpkgs = (hostPkgs.fetchFromGitHub {
owner = "NixOS";
repo = "nixpkgs-channels";
rev = "nixos-unstable";
sha256 = "1rc1pjnvfi194gka45zc1nivzsncc819kvxlfv277l2c8ryhgbpc";
});
in
with import nixpkgs {};
stdenv.mkDerivation {
name = "Autocmake";
buildInputs = [
ccache
cmake
doxygen
gcc
gfortran
liblapack
openmpi
pipenv
python3Packages.pep8
python3Packages.pytest
python3Packages.pyyaml
zlib
];
src = null;
shellHook = ''
export NINJA_STATUS="[Built edge %f of %t in %e sec]"
SOURCE_DATE_EPOCH=$(date +%s)
'';
}

1
.envrc
View File

@ -1 +0,0 @@
use nix .default.nix

4
.gitignore vendored
View File

@ -10,10 +10,6 @@ test/*/cmake/update.py
test/*/cmake/autocmake/
test/*/cmake/downloaded/
test/*/setup
test/*/cmake_output
# generated by doc/extract_rst.py
doc/module-reference.rst
.idea/
/tmp/
_build

View File

@ -7,7 +7,7 @@ matrix:
- os: linux
python: 2.7
compiler: gcc
env: SOURCES=ubuntu-toolchain-r-test
env: SOURCES=ubuntu-toolchain-r-test TEST_SCRIPT=test.py
addons:
apt:
sources:
@ -16,6 +16,7 @@ matrix:
# compilers
- g++
- gfortran
- cmake
# math libraries
- libblas-dev
- liblapack-dev
@ -25,11 +26,13 @@ matrix:
- libopenmpi-dev
# python library, development version
- libpython2.7
# boost
- libboost-all-dev
- os: linux
python: 3.5
compiler: gcc
env: SOURCES=ubuntu-toolchain-r-test
env: SOURCES=ubuntu-toolchain-r-test TEST_SCRIPT=test.py
addons:
apt:
sources:
@ -47,36 +50,52 @@ matrix:
- libopenmpi-dev
# python library, development version
- libpython2.7
# boost
- libboost-all-dev
- os: linux
python: 3.5
compiler: gcc
env: SOURCES=ubuntu-toolchain-r-test TEST_SCRIPT=test_openblas.py
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
# compilers
- g++
- gfortran
- cmake
- libblas-dev
- libopenblas-dev
- os: osx
osx_image: xcode11
osx_image: xcode6.4
compiler: gcc
env:
- SOURCES=homebrew
env: SOURCES=homebrew
install:
- |
if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then
brew update &> /dev/null
brew install cmake boost python gcc open-mpi
pip install virtualenv
elif [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
pip install --user virtualenv
mkdir -p $HOME/dependencies/cmake
curl -Ls https://cmake.org/files/v3.8/cmake-3.8.0-Linux-x86_64.tar.gz | tar -xz -C $HOME/dependencies/cmake --strip-components=1
export PATH=$HOME/dependencies/cmake/bin${PATH:+:$PATH}
curl https://cmake.org/files/v3.5/cmake-3.5.2-Linux-x86_64.tar.gz | tar xvz
export PATH=~/cmake-3.5.2-Linux-x86_64/bin:$PATH
export LD_LIBARY_PATH=~/cmake-3.5.2-Linux-x86_64/lib:$LD_LIBRARY_PATH
fi
- cmake --version
- virtualenv venv
- source venv/bin/activate
- pip install -r requirements.txt
script:
# pycodestyle tests
- pycodestyle --ignore E501 update.py
- pycodestyle --ignore E501,E265,E741 autocmake --exclude autocmake/external/docopt.py
# pep8 tests
- pep8 --ignore E501 update.py
- pep8 --ignore E501,E265 autocmake
# unit tests
- py.test -vv autocmake/*
- py.test -vv test/test.py
- py.test -vv test/$TEST_SCRIPT
notifications:
email: false

View File

@ -1,14 +1,14 @@
# Authors
- Radovan Bast
- Roberto Di Remigio
- Jonas Juselius
- Radovan Bast
# Contributors
- Miroslav Ilias (Windows, portability, earliest adopter testing and feedback, math library testing)
- Ivan Hrasko (Windows, Appveyor testing)
- Dan Jonsson (idea for configuration file approach which preceded YAML solution)
- Roberto Di Remigio (design ideas and testing, OS X testing, Boost)
For a list of all the contributions,
see https://github.com/dev-cafe/autocmake/contributors.
see https://github.com/coderefinery/autocmake/contributors.

View File

@ -1,4 +1,4 @@
Copyright (c) 2015-2017 by Radovan Bast, Roberto Di Remigio, Jonas Juselius, and contributors.
Copyright (c) 2015-2016 by Radovan Bast, Jonas Juselius, and contributors.
All rights reserved.
Redistribution and use in source and binary forms, with or without

View File

@ -1,12 +1,11 @@
[![Build Status](https://travis-ci.org/dev-cafe/autocmake.svg?branch=master)](https://travis-ci.org/dev-cafe/autocmake/builds)
[![Build Status](https://travis-ci.org/coderefinery/autocmake.svg?branch=master)](https://travis-ci.org/coderefinery/autocmake/builds)
[![Documentation Status](https://readthedocs.org/projects/autocmake/badge/?version=latest)](http://autocmake.readthedocs.org)
[![License](https://img.shields.io/badge/license-%20BSD--3-blue.svg)](LICENSE)
[![DOI](https://zenodo.org/badge/36069881.svg)](https://zenodo.org/badge/latestdoi/36069881)
[![License](https://img.shields.io/badge/license-%20BSD--3-blue.svg)](../master/LICENSE)
![alt text](https://github.com/dev-cafe/autocmake/raw/master/img/autocmake.png "Autocmake")
![alt text](https://github.com/coderefinery/autocmake/raw/master/img/autocmake.png "Autocmake")
A CMake plugin composer.
Licensed under [BSD-3](LICENSE).
Licensed under [BSD-3](../master/LICENSE).
See http://autocmake.org.
@ -18,17 +17,12 @@ See http://autocmake.org.
## Projects using Autocmake
- [Numgrid](https://github.com/dftlibs/numgrid)
- [XCint](https://github.com/dftlibs/xcint)
- [Numgrid](https://github.com/dftlibs/numgrid/)
- [XCint](https://github.com/dftlibs/xcint/)
- [DIRAC](http://diracprogram.org)
- [mathlib-tester](https://github.com/miroi/mathlibs-tester)
- [Fortran Input Reader](https://github.com/miroi/fortran_input_reader)
- [PCMSolver](https://github.com/PCMSolver/pcmsolver)
- GRASP: General-purpose Relativistic Atomic Structure Program
- [MRChem](https://github.com/MRChemSoft/mrchem)
- [ReSpect](http://rel-qchem.sav.sk)
- [Flanders](https://github.com/bast/flanders)
- [Polygons](https://github.com/bast/polygons)
- [GIMIC](https://github.com/qmcurrents/gimic)
If you use Autocmake, please link to your project via a pull request.

View File

@ -1 +1 @@
__version__ = '1.0.0'
__version__ = '1.0.0-alpha-x'

View File

@ -18,11 +18,10 @@ def check_cmake_exists(cmake_command):
"""
from subprocess import Popen, PIPE
p = Popen(
'{0} --version'.format(cmake_command),
shell=True,
stdin=PIPE,
stdout=PIPE)
p = Popen('{0} --version'.format(cmake_command),
shell=True,
stdin=PIPE,
stdout=PIPE)
if not ('cmake version' in p.communicate()[0].decode('UTF-8')):
sys.stderr.write(' This code is built using CMake\n\n')
sys.stderr.write(' CMake is not found\n')
@ -42,46 +41,55 @@ def setup_build_path(build_path):
fname = os.path.join(build_path, 'CMakeCache.txt')
if os.path.exists(fname):
sys.stderr.write('aborting setup\n')
sys.stderr.write(
'build directory {0} which contains CMakeCache.txt already exists\n'.
format(build_path))
sys.stderr.write(
'remove the build directory and then rerun setup\n')
sys.stderr.write('build directory {0} which contains CMakeCache.txt already exists\n'.format(build_path))
sys.stderr.write('remove the build directory and then rerun setup\n')
sys.exit(1)
else:
os.makedirs(build_path, 0o755)
def add_quotes_to_argv(argv, arguments):
def test_adapt_cmake_command_to_platform():
cmake_command = "FC=foo CC=bar CXX=RABOOF cmake -DTHIS -DTHAT='this and that cmake' .."
res = adapt_cmake_command_to_platform(cmake_command, 'linux')
assert res == cmake_command
res = adapt_cmake_command_to_platform(cmake_command, 'win32')
assert res == "set FC=foo && set CC=bar && set CXX=RABOOF && cmake -DTHIS -DTHAT='this and that cmake' .."
cmake_command = "cmake -DTHIS -DTHAT='this and that cmake' .."
res = adapt_cmake_command_to_platform(cmake_command, 'linux')
assert res == cmake_command
res = adapt_cmake_command_to_platform(cmake_command, 'win32')
assert res == cmake_command
def adapt_cmake_command_to_platform(cmake_command, platform):
"""
This function tries to solve this problem:
https://stackoverflow.com/questions/19120247/python-sys-argv-to-preserve-or
The problem is that sys.argv has been stripped of quotes by the shell but
docopt's arguments contains quotes.
So what we do is cycle through all docopt arguments: if they are also
present in sys.argv and contain spaces, we add quotes.
Adapt CMake command to MS Windows platform.
"""
setup_command = ' '.join(argv[:])
for k, v in arguments.items():
if isinstance(v, str):
if ' ' in v:
if v in setup_command:
setup_command = setup_command.replace(v, '"{}"'.format(v))
return setup_command
if platform == 'win32':
pos = cmake_command.find('cmake')
s = ['set {0} &&'.format(e) for e in cmake_command[:pos].split()]
s.append(cmake_command[pos:])
return ' '.join(s)
else:
return cmake_command
def run_cmake(command, build_path, default_build_path, arguments):
def run_cmake(command, build_path, default_build_path):
"""
Execute CMake command.
"""
from subprocess import Popen, PIPE
from shutil import rmtree
topdir = os.getcwd()
p = Popen(command, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
os.chdir(build_path)
p = Popen(command,
shell=True,
stdin=PIPE,
stdout=PIPE,
stderr=PIPE)
stdout_coded, stderr_coded = p.communicate()
stdout = stdout_coded.decode('UTF-8')
stderr = stderr_coded.decode('UTF-8')
@ -90,28 +98,25 @@ def run_cmake(command, build_path, default_build_path, arguments):
print(stdout)
if stderr:
# we write out stderr but we do not stop yet
# this is because CMake warnings are sent to stderr
# and they might be benign
sys.stderr.write(stderr)
sys.exit(1)
# write cmake output to file
with open(os.path.join(build_path, 'cmake_output'), 'w') as f:
with open('cmake_output', 'w') as f:
f.write(stdout)
# change directory and return
os.chdir(topdir)
# to figure out whether configuration was a success
# we check for 3 sentences that should be part of stdout
configuring_done = '-- Configuring done' in stdout
generating_done = '-- Generating done' in stdout
build_files_written = '-- Build files have been written to' in stdout
configuration_successful = configuring_done and generating_done and build_files_written
if configuration_successful:
setup_command = add_quotes_to_argv(sys.argv, arguments)
save_setup_command(setup_command, build_path)
if 'Configuring incomplete' in stdout:
# configuration was not successful
if (build_path == default_build_path):
# remove build_path iff not set by the user
# otherwise removal can be dangerous
rmtree(default_build_path)
else:
# configuration was successful
save_setup_command(sys.argv, build_path)
print_build_help(build_path, default_build_path)
@ -128,16 +133,16 @@ def print_build_help(build_path, default_build_path):
print(' $ make')
def save_setup_command(setup_command, build_path):
def save_setup_command(argv, build_path):
"""
Save setup command to a file.
"""
file_name = os.path.join(build_path, 'setup_command')
with open(file_name, 'w') as f:
f.write(setup_command + '\n')
f.write(' '.join(argv[:]) + '\n')
def configure(root_directory, build_path, cmake_command, arguments):
def configure(root_directory, build_path, cmake_command, only_show):
"""
Main configure function.
"""
@ -149,12 +154,13 @@ def configure(root_directory, build_path, cmake_command, arguments):
# deal with build path
if build_path is None:
build_path = default_build_path
if not arguments['--show']:
if not only_show:
setup_build_path(build_path)
cmake_command += ' -B' + build_path
cmake_command = adapt_cmake_command_to_platform(cmake_command, sys.platform)
print('{0}\n'.format(cmake_command))
if arguments['--show']:
if only_show:
sys.exit(0)
run_cmake(cmake_command, build_path, default_build_path, arguments)
run_cmake(cmake_command, build_path, default_build_path)

View File

@ -1 +0,0 @@
# empty - this line is here to avoid problem when fetching empty files from web

View File

@ -1,5 +1,5 @@
def extract_list(config, section):
from collections.abc import Iterable
from collections import Iterable
l = []
if 'modules' in config:
for module in config['modules']:

View File

@ -20,7 +20,7 @@ def gen_cmake_command(config):
s.append(' command.append({0})'.format(definition))
s.append(" command.append('-DCMAKE_BUILD_TYPE={0}'.format(arguments['--type']))")
s.append(" command.append('-G\"{0}\"'.format(arguments['--generator']))")
s.append(" command.append('-G \"{0}\"'.format(arguments['--generator']))")
s.append(" if arguments['--cmake-options'] != \"''\":")
s.append(" command.append(arguments['--cmake-options'])")
s.append(" if arguments['--prefix']:")
@ -40,49 +40,12 @@ def autogenerated_notice():
s = []
s.append('# This file is autogenerated by Autocmake v{0} http://autocmake.org'.format(__version__))
s.append('# Copyright (c) {0} by Radovan Bast, Roberto Di Remigio, Jonas Juselius, and contributors.'.format(year_range))
s.append('# Copyright (c) {0} by Radovan Bast, Jonas Juselius, and contributors.'.format(year_range))
return '\n'.join(s)
def gen_cmake_options_wrappers():
s = """\n# Options handling utilities
include(CMakeDependentOption)
# Macro for printing an option in a consistent manner
# Written by Lori A. Burns (@loriab) and Ryan M. Richard (@ryanmrichard)
# Syntax: print_option(<option to print> <was specified>)
macro(print_option variable default)
if(NOT DEFINED ${variable} OR "${${variable}}" STREQUAL "")
message(STATUS "Setting (unspecified) option ${variable}: ${default}")
else()
message(STATUS "Setting option ${variable}: ${${variable}}")
endif()
endmacro()
# Wraps an option with default ON/OFF. Adds nice messaging to option()
# Written by Lori A. Burns (@loriab) and Ryan M. Richard (@ryanmrichard)
# Syntax: option_with_print(<option name> <description> <default value>)
macro(option_with_print variable msge default)
print_option(${variable} ${default})
option(${variable} ${msge} ${default})
endmacro()
# Wraps an option with a default other than ON/OFF and prints it
# Written by Lori A. Burns (@loriab) and Ryan M. Richard (@ryanmrichard)
# NOTE: Can't combine with above b/c CMake handles ON/OFF options specially
# NOTE2: CMake variables are always defined so need to further check for if
# they are the NULL string. This is also why we need the force
# Syntax: option_with_default(<option name> <description> <default value>)
macro(option_with_default variable msge default)
print_option(${variable} "${default}")
if(NOT DEFINED ${variable} OR "${${variable}}" STREQUAL "")
set(${variable} "${default}" CACHE STRING ${msge} FORCE)
endif()
endmacro()"""
return s
def gen_setup(config, default_build_type, relative_path, setup_script_name):
def gen_setup(config, relative_path, setup_script_name):
"""
Generate setup script.
"""
@ -93,7 +56,6 @@ def gen_setup(config, default_build_type, relative_path, setup_script_name):
s.append('\n{0}'.format(autogenerated_notice()))
s.append('\nimport os')
s.append('import sys')
s.append('assert sys.version_info >= (2, 6), \'Python >= 2.6 is required\'')
s.append("\nsys.path.insert(0, '{0}')".format(relative_path))
@ -113,7 +75,7 @@ def gen_setup(config, default_build_type, relative_path, setup_script_name):
rest = ' '.join(opt.split()[1:]).strip()
options.append([first, rest])
options.append(['--type=<TYPE>', 'Set the CMake build type (debug, release, relwithdebinfo, minsizerel) [default: {0}].'.format(default_build_type)])
options.append(['--type=<TYPE>', 'Set the CMake build type (debug, release, or relwithdeb) [default: release].'])
options.append(['--generator=<STRING>', 'Set the CMake build system generator [default: Unix Makefiles].'])
options.append(['--show', 'Show CMake command and exit.'])
options.append(['--cmake-executable=<CMAKE_EXECUTABLE>', 'Set the CMake executable [default: cmake].'])
@ -147,15 +109,15 @@ def gen_setup(config, default_build_type, relative_path, setup_script_name):
s.append("build_path = arguments['<builddir>']")
s.append("\n")
s.append("# create cmake command")
s.append("cmake_command = '{0} -H{1}'.format(gen_cmake_command(options, arguments), root_directory)")
s.append("cmake_command = '{0} {1}'.format(gen_cmake_command(options, arguments), root_directory)")
s.append("\n")
s.append("# run cmake")
s.append("configure.configure(root_directory, build_path, cmake_command, arguments)")
s.append("configure.configure(root_directory, build_path, cmake_command, arguments['--show'])")
return s
def gen_cmakelists(project_name, project_language, min_cmake_version, default_build_type, relative_path, modules):
def gen_cmakelists(project_name, min_cmake_version, relative_path, modules):
"""
Generate CMakeLists.txt.
"""
@ -169,31 +131,33 @@ def gen_cmakelists(project_name, project_language, min_cmake_version, default_bu
s.append('cmake_minimum_required(VERSION {0} FATAL_ERROR)'.format(min_cmake_version))
s.append('\n# project name')
s.append('project({0} LANGUAGES {1})'.format(project_name, project_language))
s.append('project({0})'.format(project_name))
s.append('\n# do not rebuild if rules (compiler flags) change')
s.append('set(CMAKE_SKIP_RULE_DEPENDENCY TRUE)')
build_type_capitalized = {'debug': 'Debug',
'release': 'Release',
'relwithdebinfo': 'RelWithDebInfo',
'minsizerel': 'MinSizeRel'}
_build_type = build_type_capitalized[default_build_type]
s.append('\n# if CMAKE_BUILD_TYPE undefined, we set it to {0}'.format(_build_type))
s.append('\n# if CMAKE_BUILD_TYPE undefined, we set it to Debug')
s.append('if(NOT CMAKE_BUILD_TYPE)')
s.append(' set(CMAKE_BUILD_TYPE "{0}")'.format(_build_type))
s.append(' set(CMAKE_BUILD_TYPE "Debug")')
s.append('endif()')
s.append(gen_cmake_options_wrappers())
if len(modules) > 0:
s.append('\n# directories which hold included cmake modules')
module_paths = [module.path for module in modules]
module_paths.append('downloaded') # this is done to be able to find fetched modules when testing
module_paths = list(set(module_paths))
module_paths.sort() # we do this to always get the same order and to minimize diffs
for directory in module_paths:
rel_cmake_module_path = os.path.join(relative_path, directory)
# on windows cmake corrects this so we have to make it wrong again
rel_cmake_module_path = rel_cmake_module_path.replace('\\', '/')
s.append('set(CMAKE_MODULE_PATH ${{CMAKE_MODULE_PATH}} ${{PROJECT_SOURCE_DIR}}/{0})'.format(rel_cmake_module_path))
if len(modules) > 0:
s.append('\n# included cmake modules')
for module in modules:
s.append('include({0})'.format(os.path.join('${PROJECT_SOURCE_DIR}',
relative_path,
module.path,
module.name)))
s.append('include({0})'.format(os.path.splitext(module.name)[0]))
return s

View File

@ -3,7 +3,7 @@ def replace(s, d):
if isinstance(s, str):
for var in findall(r"%\(([A-Za-z0-9_]*)\)", s):
s = s.replace("%({0})".format(var), str(d[var]))
s = s.replace("%({})".format(var), str(d[var]))
return s
@ -13,7 +13,7 @@ def test_replace():
def interpolate(d, d_map):
from collections.abc import Mapping, Iterable
from collections import Mapping, Iterable
from copy import copy
for k, v in d.items():

View File

@ -1,9 +1,14 @@
def parse_cmake_module(s_in, overrides={}):
import sys
from collections.abc import Mapping, Iterable
from collections import defaultdict
from collections import Mapping, Iterable, defaultdict
from autocmake.parse_yaml import parse_yaml
from io import StringIO
# we do not use the nicer sys.version_info.major
# for compatibility with Python < 2.7
if sys.version_info[0] > 2:
from io import StringIO
else:
from StringIO import StringIO
parsed_config = defaultdict(lambda: None)

View File

@ -1,6 +1,6 @@
if(NOT DEFINED ENV{CFLAGS})
if(CMAKE_C_COMPILER_ID MATCHES Clang)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_C_FLAGS_RELEASE "-O3")
set(CMAKE_C_FLAGS_DEBUG "-O0 -g")
endif()

View File

@ -1,6 +1,6 @@
if(NOT DEFINED ENV{CXXFLAGS})
if(CMAKE_CXX_COMPILER_ID MATCHES Clang)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS_RELEASE "-Ofast")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
endif()

View File

@ -1,6 +1,6 @@
if(NOT DEFINED ENV{CFLAGS})
if(CMAKE_C_COMPILER_ID MATCHES GNU)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_C_FLAGS_RELEASE "-O3")
set(CMAKE_C_FLAGS_DEBUG "-O0 -g")
endif()

View File

@ -1,7 +1,7 @@
if(NOT DEFINED ENV{CXXFLAGS})
if(CMAKE_CXX_COMPILER_ID MATCHES GNU)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS_RELEASE "-Ofast")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
endif()
endif()

View File

@ -1,6 +1,6 @@
if(NOT DEFINED ENV{FCFLAGS})
if(CMAKE_Fortran_COMPILER_ID MATCHES GNU)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Wall -Wextra")
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS}")
set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -funroll-all-loops")
set(CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -fbacktrace")
endif()

View File

@ -1,6 +1,6 @@
if(NOT DEFINED ENV{CFLAGS})
if(CMAKE_C_COMPILER_ID MATCHES Intel)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_C_FLAGS_RELEASE "-O3")
set(CMAKE_C_FLAGS_DEBUG "-O0 -g")
endif()

View File

@ -1,6 +1,6 @@
if(NOT DEFINED ENV{CXXFLAGS})
if(CMAKE_CXX_COMPILER_ID MATCHES Intel)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
endif()

View File

@ -1,20 +0,0 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = .
BUILDDIR = _build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

View File

@ -1,48 +1,289 @@
# Configuration file for the Sphinx documentation builder.
# -*- coding: utf-8 -*-
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
# Autocmake documentation build configuration file, created by
# sphinx-quickstart on Mon Jun 1 16:41:30 2015.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
import time
import shlex
sys.path.insert(0, os.path.abspath("."))
sys.path.append(os.path.relpath(os.path.abspath('.')))
import extract_rst
sys.path.insert(0, os.path.abspath(".."))
from autocmake import __version__ as _version
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
# -- General configuration ------------------------------------------------
project = "Autocmake"
copyright = f'2015-{time.strftime("%Y")}, Radovan Bast, Roberto Di Remigio, Jonas Juselius, and contributors'
author = "Radovan Bast, Roberto Di Remigio, Jonas Juselius, and contributors"
# The full version, including alpha/beta/rc tags.
release = _version
# The short X.Y version.
version = ".".join(release.split(".")[0:2])
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
"sphinx.ext.todo",
'sphinx.ext.todo',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'Autocmake'
copyright = u'2015-2016, Radovan Bast, Jonas Juselius, and contributors'
author = u'Radovan Bast, Jonas Juselius, and contributors'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '1.0'
# The full version, including alpha/beta/rc tags.
release = '1.0.0-alpha-x'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = True
templates_path = ["_templates"]
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
root_doc = "index"
pygments_style = "sphinx"
# -- Options for HTML output ----------------------------------------------
# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'default'
html_theme = "classic"
html_theme_options = {"body_max_width": "none", "sidebarwidth": "16%"}
html_static_path = ["_static"]
html_sidebars = {"**": ["globaltoc.html", "sourcelink.html", "searchbox.html"]}
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
#html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value
#html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'Autocmakedoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
# Latex figure (float) alignment
#'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'Autocmake.tex', u'Autocmake Documentation',
u'Radovan Bast and Jonas Juselius', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'autocmake', u'Autocmake Documentation',
[author], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'Autocmake', u'Autocmake Documentation',
author, 'Autocmake', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False

View File

@ -10,11 +10,11 @@ This documentation is refreshed upon each push to the central repository.
The module reference documentation is generated from the module sources using
``#.rst:`` tags (compare for instance
http://autocmake.readthedocs.io/en/latest/module-reference.html#cc-cmake with
https://github.com/dev-cafe/autocmake/blob/master/modules/cc.cmake).
https://github.com/coderefinery/autocmake/blob/master/modules/cc.cmake).
Please note that the lines following ``# autocmake.yml configuration::`` are
understood by the ``update.py`` script to infer autocmake.yml code from the
documentation. As an example consider
https://github.com/dev-cafe/autocmake/blob/master/modules/cc.cmake#L20-L26.
https://github.com/coderefinery/autocmake/blob/master/modules/cc.cmake#L20-L26.
Here, ``update.py`` will infer the configurations for ``docopt``, ``export``,
and ``define``.

View File

@ -5,14 +5,14 @@ Testing Autocmake
You will need to install `pytest <http://pytest.org/>`__.
Check also the `Travis <https://github.com/dev-cafe/autocmake/blob/master/.travis.yml>`__
Check also the `Travis <https://github.com/coderefinery/autocmake/blob/master/.travis.yml>`__
build and test recipe for other requirements.
Your contributions and changes should preserve the test set and be PEP8 conform.
You can run locally all tests with::
$ pycodestyle --ignore E501 update.py
$ pycodestyle --ignore E501,E265 autocmake
$ pep8 --ignore E501 update.py
$ pep8 --ignore E501,E265 autocmake
$ py.test -vv autocmake/*
$ py.test -vv test/test.py
@ -23,5 +23,5 @@ You can also select individual tests, for example those with ``fc_blas`` string
For more options, see the ``py.test`` flags.
This test set is run upon each push to the central repository.
See also the `Travis <https://travis-ci.org/dev-cafe/autocmake/builds>`__
See also the `Travis <https://travis-ci.org/coderefinery/autocmake/builds>`__
build and test history.

View File

@ -12,15 +12,12 @@ infrastructure files which will be needed to build the project::
$ mkdir cmake # does not have to be called "cmake" - take the name you prefer
$ cd cmake
$ wget https://github.com/dev-cafe/autocmake/raw/master/update.py
$ virtualenv venv
$ source venv/bin/activate
$ pip install pyyaml
$ wget https://github.com/coderefinery/autocmake/raw/master/update.py
$ python update.py --self
On the MS Windows system, you can use the PowerShell wget-replacement::
$ Invoke-WebRequest https://github.com/dev-cafe/autocmake/raw/master/update.py -OutFile update.py
$ Invoke-WebRequest https://github.com/coderefinery/autocmake/raw/master/update.py -OutFile update.py
This creates (or updates) the following files (an existing ``autocmake.yml`` is
not overwritten by the script)::

View File

@ -1,86 +1,99 @@
.. _autocmake_yml:
Configuring autocmake.yml
Configuring autocmake.cfg
=========================
The script ``autocmake.yml`` is the high level place where you configure
The script ``autocmake.cfg`` is the high level place where you configure
your project. Here is an example. We will discuss it in detail further
below::
[project]
name: numgrid
min_cmake_version: 2.8
min_cmake_version: 3.1
[fc]
source: https://github.com/coderefinery/autocmake/raw/master/modules/fc.cmake
default_build_type: release
[cc]
source: https://github.com/coderefinery/autocmake/raw/master/modules/cc.cmake
language:
- Fortran
- C
- CXX
[cxx]
source: https://github.com/coderefinery/autocmake/raw/master/modules/cxx.cmake
url_root: https://github.com/dev-cafe/autocmake/raw/master/
[flags]
source: https://github.com/coderefinery/autocmake/raw/master/compilers/GNU.CXX.cmake
https://github.com/coderefinery/autocmake/raw/master/compilers/Intel.CXX.cmake
modules:
- compilers:
- source:
- '%(url_root)modules/fc.cmake'
- '%(url_root)modules/cc.cmake'
- '%(url_root)modules/cxx.cmake'
- flags:
- source:
- '%(url_root)compilers/GNU.CXX.cmake'
- '%(url_root)compilers/Intel.CXX.cmake'
- 'compilers/Clang.CXX.cmake'
- plugins:
- source:
- '%(url_root)modules/ccache.cmake'
- 'custom/rpath.cmake'
- '%(url_root)modules/definitions.cmake'
- '%(url_root)modules/code_coverage.cmake'
- '%(url_root)modules/safeguards.cmake'
- '%(url_root)modules/default_build_paths.cmake'
- '%(url_root)modules/src.cmake'
- '%(url_root)modules/googletest.cmake'
- 'custom/api.cmake'
- 'custom/test.cmake'
[rpath]
source: custom/rpath.cmake
[definitions]
source: https://github.com/coderefinery/autocmake/raw/master/modules/definitions.cmake
[coverage]
source: https://github.com/coderefinery/autocmake/raw/master/modules/code_coverage.cmake
[safeguards]
source: https://github.com/coderefinery/autocmake/raw/master/modules/safeguards.cmake
[default_build_paths]
source: https://github.com/coderefinery/autocmake/raw/master/modules/default_build_paths.cmake
[src]
source: https://github.com/coderefinery/autocmake/raw/master/modules/src.cmake
[googletest]
source: https://github.com/coderefinery/autocmake/raw/master/modules/googletest.cmake
[custom]
source: custom/api.cmake
custom/test.cmake
Name and order of sections
--------------------------
First we define the project name (here "numgrid"). This section has to be there
and it has to be called "project" (but it does not have to be on top).
We see that the configuration file has sections.
The only section where the name matters is ``[project]``::
We also have to define ``min_cmake_version`` as well as set the supported language(s).
[project]
name: numgrid
min_cmake_version: 2.8
The definition ``url_root`` is an interpolation (see :ref:`interpolation`) and
we use it to avoid retyping the same line over and over and to be able to
change it in one place. The explicit name "url_root" has no special meaning to
Autocmake and we could have chosen a different name.
This is where we define the project name (here "numgrid"). This section has to
be there and it has to be called "project" (but it does not have to be on top).
The section ``modules`` is a list of CMake plugins. The names of the list
elements (here "compilers", "flags", and "plugins") does not matter to
Autocmake. We could have called them "one", "two", and "whatever", but it would
not make much sense. It is better to choose names that are meaningful to you
and readers of your code.
The names of the other sections do not matter to Autocmake. You could name them like this::
The order of the elements under ``modules`` does matter and the list will be
processed in the exact order as you specify them in ``autocmake.yml``.
[project]
name: numgrid
min_cmake_version: 2.8
[one]
source: https://github.com/coderefinery/autocmake/raw/master/modules/fc.cmake
[two]
source: https://github.com/coderefinery/autocmake/raw/master/modules/cc.cmake
[whatever]
source: https://github.com/coderefinery/autocmake/raw/master/modules/cxx.cmake
But it would not make much sense. It is better to choose names that are
meaningful to you.
The order of the sections does matter and the sections will be processed in the
exact order as you specify them in ``autocmake.cfg``.
Minimal example
---------------
As a minimal example we take an ``autocmake.yml`` which only contains::
As a minimal example we take an ``autocmake.cfg`` which only contains::
[project]
name: minime
min_cmake_version: 3.1
language: C
If you don't have the ``update.py`` script yet, you need to fetch it from the web::
$ wget https://github.com/dev-cafe/autocmake/raw/master/update.py
min_cmake_version: 2.8
First we make sure that the ``update.py`` script is up-to-date and that it has access
to all libraries it needs::
@ -88,22 +101,15 @@ to all libraries it needs::
$ python update.py --self
- creating .gitignore
- fetching autocmake/configure.py
- fetching autocmake/__init__.py
- fetching autocmake/external/docopt.py
- fetching autocmake/external/__init__.py
- fetching autocmake/generate.py
- fetching autocmake/extract.py
- fetching autocmake/interpolate.py
- fetching autocmake/parse_rst.py
- fetching autocmake/parse_yaml.py
- fetching lib/config.py
- fetching lib/docopt/docopt.py
- fetching update.py
Good. Now we can generate ``CMakeLists.txt`` and the setup script::
$ python update.py ..
$ python update ..
- parsing autocmake.yml
- parsing autocmake.cfg
- generating CMakeLists.txt
- generating setup script
@ -113,7 +119,7 @@ Excellent. Here is the generated ``CMakeLists.txt``::
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
# project name
project(minime C)
project(minime)
# do not rebuild if rules (compiler flags) change
set(CMAKE_SKIP_RULE_DEPENDENCY TRUE)
@ -123,6 +129,8 @@ Excellent. Here is the generated ``CMakeLists.txt``::
set(CMAKE_BUILD_TYPE "Debug")
endif()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake/downloaded)
This is the very bare minimum. Every Autocmake project will have at least these
settings.
@ -139,38 +147,38 @@ the following default options::
--show Show CMake command and exit.
--cmake-executable=<CMAKE_EXECUTABLE> Set the CMake executable [default: cmake].
--cmake-options=<STRING> Define options to CMake [default: ''].
--prefix=<PATH> Set the install path for make install.
<builddir> Build directory.
-h --help Show this screen.
That's not too bad although currently we cannot do much with this since there
are no sources listed, no targets, hence nothing to build. We need to flesh out
``CMakeLists.txt`` by extending ``autocmake.yml`` and this is what we will do
in the next section.
``CMakeLists.txt`` by extending ``autocmake.cfg``
and this is what we will do in the next section.
Assembling CMake plugins
------------------------
The preferred way to extend ``CMakeLists.txt`` is by editing ``autocmake.yml``
The preferred way to extend ``CMakeLists.txt`` is by editing ``autocmake.cfg``
and using the ``source`` option::
- compilers:
- source:
- '%(url_root)modules/fc.cmake'
- '%(url_root)modules/cc.cmake'
- '%(url_root)modules/cxx.cmake'
[fc]
source: https://github.com/coderefinery/autocmake/raw/master/modules/fc.cmake
This will download ``fc.cmake``, ``cc.cmake``, and ``cxx.cmake``, and include
them in ``CMakeLists.txt``, in this order.
This will download ``fc.cmake`` and include it in ``CMakeLists.txt``.
You can also include local CMake modules, e.g.::
- source:
- 'custom/rpath.cmake'
[rpath]
source: custom/rpath.cmake
It is also OK to include several modules at once as we have seen above. The
modules will be included in the same order as they appear in ``autocmake.yml``.
It is also OK to include several modules at once::
[flags]
source: https://github.com/coderefinery/autocmake/raw/master/compilers/GNU.CXX.cmake
https://github.com/coderefinery/autocmake/raw/master/compilers/Intel.CXX.cmake
The modules will be included in the same order as they appear in ``autocmake.cfg``.
Fetching files without including them in CMakeLists.txt
@ -179,9 +187,9 @@ Fetching files without including them in CMakeLists.txt
Sometimes you want to fetch a file without including it in ``CMakeLists.txt``.
This can be done with the ``fetch`` option. This is for instance done by the
``git_info.cmake`` module (see
https://github.com/dev-cafe/autocmake/blob/master/modules/git_info/git_info.cmake#L10-L13).
https://github.com/coderefinery/autocmake/blob/master/modules/git_info/git_info.cmake#L10-L11).
If ``fetch`` is invoked in ``autocmake.yml``, then the fetched file is placed
If ``fetch`` is invoked in ``autocmake.cfg``, then the fetched file is placed
under ``downloaded/``. If ``fetch`` is invoked from within a CMake module
documentation (see below), then the fetched file is placed into the same
directory as the CMake module file which fetches it.
@ -191,11 +199,11 @@ Generating setup options
------------------------
Options for the setup script can be generated with the ``docopt``
option. As an example, the following ``autocmake.yml`` snippet will add a
option. As an example, the following ``autocmake.cfg`` snippet will add a
``--something`` flag::
- my_section:
- docopt: "--something Enable something [default: False]."
[my_section]
docopt: --something Enable something [default: False].
Setting CMake options
@ -205,9 +213,9 @@ Configure-time CMake options can be generated with the ``define`` option.
Consider the following example which toggles the CMake variable
``ENABLE_SOMETHING``::
- my_section:
- docopt: "--something Enable something [default: False]."
- define: "'-DENABLE_SOMETHING={0}'.format(arguments['--enable-something'])"
[my_section]
docopt: --something Enable something [default: False].
define: '-DENABLE_SOMETHING={0}'.format(arguments['--something'])
Setting environment variables
@ -216,23 +224,33 @@ Setting environment variables
You can export environment variables at configure-time using the ``export``
option. Consider the following example::
docopt:
- "--cc=<CC> C compiler [default: gcc]."
- "--extra-cc-flags=<EXTRA_CFLAGS> Extra C compiler flags [default: '']."
export: "'CC={0}'.format(arguments['--cc'])"
define: "'-DEXTRA_CFLAGS=\"{0}\"'.format(arguments['--extra-cc-flags'])"
[cc]
docopt: --cc=<CC> C compiler [default: gcc].
--extra-cc-flags=<EXTRA_CFLAGS> Extra C compiler flags [default: ''].
export: 'CC=%s' % arguments['--cc']
define: '-DEXTRA_CFLAGS="%s"' % arguments['--extra-cc-flags']
Auto-generating configurations from the documentation
-----------------------------------------------------
To avoid a boring re-typing of boilerplate ``autocmake.yml`` code it is possible
To avoid a boring re-typing of boilerplate ``autocmake.cfg`` code it is possible
to auto-generate configurations from the documentation. This is the case
for many core modules which come with own options once you have sourced them.
The lines following ``# autocmake.yml configuration::`` are
understood by the ``update.py`` script to infer ``autocmake.yml`` code from the
The lines following ``# autocmake.cfg configuration::`` are
understood by the ``update.py`` script to infer ``autocmake.cfg`` code from the
documentation. As an example consider
https://github.com/dev-cafe/autocmake/blob/master/modules/cc.cmake#L20-L26.
https://github.com/coderefinery/autocmake/blob/master/modules/cc.cmake#L20-L25.
Here, ``update.py`` will infer the configurations for ``docopt``, ``export``,
and ``define``.
Overriding documented configurations
------------------------------------
Configurable documented defaults can be achieved using interpolations. See for
instance
https://github.com/coderefinery/autocmake/blob/master/modules/boost/boost.cmake#L33-L36.
These can be modified within ``autocmake.cfg`` with a dictionary, e.g.:
https://github.com/coderefinery/autocmake/blob/master/test/boost_libs/cmake/autocmake.cfg#L9

View File

@ -47,11 +47,11 @@ Settings in ``autocmake.yml`` take precedence over
settings imported by a sourced module.
As an example consider the Boost module which defines and uses
interpolation variables ``major``, ``minor``, ``patch``, and ``components``, see
https://github.com/dev-cafe/autocmake/blob/master/modules/boost/boost.cmake#L52-L55.
interpolation variables ``major``, ``minor``, and ``patch``, see
https://github.com/coderefinery/autocmake/blob/master/modules/boost/boost.cmake#L52-L54.
The recommended way to customize these is in ``autocmake.yml``, e.g.:
https://github.com/dev-cafe/autocmake/blob/master/test/boost_libs/cmake/autocmake.yml#L12-L17.
https://github.com/coderefinery/autocmake/blob/master/test/boost_libs/cmake/autocmake.yml#L12-L17.
Create own CMake modules
@ -65,5 +65,5 @@ Contribute customizations to the "standard library"
If you think that your customization will be useful for other users as well,
you may consider contributing the changes directly to
https://github.com/dev-cafe/autocmake/. We very much encourage such
https://github.com/coderefinery/autocmake/. We very much encourage such
contributions. But we also strive for generality and portability.

View File

@ -1,6 +1,6 @@
Example hello world project
Example Hello World project
===========================
This is a brief example for the busy and impatient programmer. For a longer
@ -23,53 +23,40 @@ there. This is not necessary for Autocmake but it is a generally good practice::
Now we create ``cmake/`` and fetch ``update.py``::
$ mkdir cmake # does not have to be called "cmake" - take the name you prefer
$ cd cmake
$ wget https://github.com/dev-cafe/autocmake/raw/master/update.py
$ mkdir cmake
$ cd cmake/
$ wget https://raw.githubusercontent.com/coderefinery/autocmake/master/update.py
$ python update.py --self
Now from top-level our file tree looks like this::
.
|-- cmake
| |-- autocmake
| | |-- __init__.py
| | |-- configure.py
| | |-- external
| | | |-- __init__.py
| | | `-- docopt.py
| | |-- extract.py
| | |-- generate.py
| | |-- interpolate.py
| | |-- parse_rst.py
| | `-- parse_yaml.py
| |-- autocmake.yml
| |-- autocmake.cfg
| |-- lib
| | |-- config.py
| | `-- docopt
| | `-- docopt.py
| `-- update.py
`-- src
|-- feature1.F90
|-- feature2.c
`-- main.F90
Now we edit ``cmake/autocmake.yml`` to look like this::
Now we edit ``cmake/autocmake.cfg`` to look like this::
[project]
name: hello
min_cmake_version: 2.8
min_cmake_version: 3.1
[fc]
source: https://github.com/coderefinery/autocmake/raw/master/modules/fc.cmake
language:
- Fortran
- C
[cc]
source: https://github.com/coderefinery/autocmake/raw/master/modules/cc.cmake
url_root: https://github.com/dev-cafe/autocmake/raw/master/
modules:
- compilers:
- source:
- '%(url_root)modules/fc.cmake'
- '%(url_root)modules/cc.cmake'
- src_support:
- source:
- '%(url_root)modules/src.cmake'
[src]
source: https://github.com/coderefinery/autocmake/raw/master/modules/src.cmake
What we have specified here is the project name and that we wish Fortran and C
support. The ``src.cmake`` module tells CMake to include a ``src/CMakeLists.txt``.
@ -89,32 +76,20 @@ Now we have everything to generate ``CMakeLists.txt`` and a setup script::
$ cd cmake
$ python update ..
- parsing autocmake.yml
- assembling modules: [##############################] (3/3)
- generating CMakeLists.txt
- generating setup script
And this is what we got::
.
|-- CMakeLists.txt
|-- cmake
| |-- autocmake
| | |-- __init__.py
| | |-- configure.py
| | |-- external
| | | |-- __init__.py
| | | `-- docopt.py
| | |-- extract.py
| | |-- generate.py
| | |-- interpolate.py
| | |-- parse_rst.py
| | `-- parse_yaml.py
| |-- autocmake.yml
| |-- autocmake.cfg
| |-- downloaded
| | |-- autocmake_cc.cmake
| | |-- autocmake_fc.cmake
| | `-- autocmake_src.cmake
| |-- lib
| | |-- config.py
| | `-- docopt
| | `-- docopt.py
| `-- update.py
|-- setup
`-- src
@ -125,12 +100,12 @@ And this is what we got::
Now we are ready to build::
$ ./setup --fc=gfortran --cc=gcc
$ python setup --fc=gfortran --cc=gcc
FC=gfortran CC=gcc cmake -DEXTRA_FCFLAGS="''" -DEXTRA_CFLAGS="''" -DCMAKE_BUILD_TYPE=release -G "Unix Makefiles" /home/user/hello
FC=gfortran CC=gcc cmake -DEXTRA_FCFLAGS="''" -DENABLE_FC_SUPPORT="ON" -DEXTRA_CFLAGS="''" -DCMAKE_BUILD_TYPE=release -G "Unix Makefiles" None /home/user/example
-- The C compiler identification is GNU 6.1.1
-- The CXX compiler identification is GNU 6.1.1
-- The C compiler identification is GNU 4.9.2
-- The CXX compiler identification is GNU 4.9.2
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
@ -143,7 +118,7 @@ Now we are ready to build::
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- The Fortran compiler identification is GNU 6.1.1
-- The Fortran compiler identification is GNU 4.9.2
-- Check for working Fortran compiler: /usr/bin/gfortran
-- Check for working Fortran compiler: /usr/bin/gfortran -- works
-- Detecting Fortran compiler ABI info
@ -152,14 +127,14 @@ Now we are ready to build::
-- Checking whether /usr/bin/gfortran supports Fortran 90 -- yes
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/hello/build
-- Build files have been written to: /home/user/example/build
configure step is done
now you need to compile the sources:
$ cd build
$ make
$ cd build
$ cd build/
$ make
Scanning dependencies of target hello.x

View File

@ -4,18 +4,6 @@ FAQ for developers
==================
Which files do I need to edit?
------------------------------
Let us start with files which you normally never edit: ``CMakeLists.txt`` and
``setup`` - these are generated based on ``autocmake.yml``. Have a look in
``autocmake.yml`` and you will see all CMake files which are assembled into
``CMakeLists.txt``. You can edit those files. If you change the order of files
listed in ``autocmake.yml`` or if you add or remove CMake modules, then you
need to rerun the ``update.py`` script to refresh ``CMakeLists.txt`` and
``setup``.
Autocmake does not do feature X - I really need feature X and a setup flag --X
------------------------------------------------------------------------------
@ -31,22 +19,18 @@ naming)::
cmake/custom/my_feature.cmake
And include this feature to the main ``CMakeLists.txt`` in ``autocmake.yml``
under the ``modules`` section::
And include this feature to the main ``CMakeLists.txt`` in ``autocmake.cfg``::
modules:
- my_feature:
- source:
- custom/my_feature.cmake
[my_feature]
source: custom/my_feature.cmake
Now your code is included in the main ``CMakeLists.txt``. Perhaps you also
want a setup script flag to toggle the feature::
- my_feature:
- docopt: "--enable-my-feature Enable my feature [default: False]."
- define: "'-DENABLE_MY_FEATURE={0}'.format(arguments['--enable-my-feature'])"
- source:
- custom/my_feature.cmake
[my_feature]
source: custom/my_feature.cmake
docopt: --my-feature Enable my feature [default: False].
define: '-DENABLE_MY_FEATURE={0}'.format(arguments['--my-feature'])
Implement your ideas, test them, and share them. If your module is portable,
good code quality, and of general interest, you can suggest it to be part of
@ -59,33 +43,20 @@ How can I get a setup flag --X that toggles a CMake variable?
The following will add a ``--something`` flag which toggles the CMake variable
``ENABLE_SOMETHING``::
- my_section:
- docopt: "--something Enable something [default: False]."
- define: "'-DENABLE_SOMETHING={0}'.format(arguments['--enable-something'])"
[my_section]
docopt: --something Enable something [default: False].
define: '-DENABLE_SOMETHING={0}'.format(arguments['--something'])
Can I change the name of the setup script?
------------------------------------------
Yes you can do that in ``autocmake.yml``. Here we for instance change the name to "configure":
.. code-block:: yaml
:emphasize-lines: 4
Yes you can do that in ``autocmake.cfg``. Here we for instance change the name to "configure"::
[project]
name: myproject
min_cmake_version: 3.1
default_build_type: release
min_cmake_version: 2.8
setup_script: configure
language:
- Fortran
- C
- CXX
Can I prevent Autocmake from creating any front-end setup script?
-----------------------------------------------------------------
Yes, with ``setup_script: None``.
In CMake I can do feature X - can I do that also with Autocmake?
@ -99,13 +70,12 @@ realized in Autocmake.
Should I include and track also files generated by Autocmake in my repository?
------------------------------------------------------------------------------
Yes, you probably want to do that. Autocmake downloads and generates a number
of files which in principle could be generated at configure- or build-time.
However, you probably do not want the users of your code to run any Autocmake
scripts like ``update.py`` to generate the files they need to build the
project. The users of your code will run ``setup`` directly and typically expect
everything to just work (TM). Note also that the users of your code will
not need to install the pyyaml package.
Yes, you probably want to do that. Autocmake generates a number of files which
in principle could be generated at configure- or build-time. However, you
probably do not want the users of your code to run any Autocmake scripts like
``update.py`` to generate the files they need to build the project. The users
of your code will run ``setup`` directly and expect everything to just work
(TM).
The update.py script is overwriting my CMakeLists.txt and setup, isn't this bad?
@ -123,7 +93,7 @@ But I need to manually edit and customize CMakeLists.txt and setup every time I
-----------------------------------------------------------------------------------------------
You typically never need to manually edit and customize ``CMakeLists.txt`` and
``setup`` directly. You can introduce customizations in ``autocmake.yml``
``setup`` directly. You can introduce customizations in ``autocmake.cfg``
which get assembled into the front-end scripts.
@ -131,21 +101,19 @@ Where is a good place to list my sources and targets?
-----------------------------------------------------
As mentioned above ``CMakeLists.txt`` is not a good place because this file is
generated from ``autocmake.yml`` and your modifications would become
generated from ``autocmake.cfg`` and your modifications would become
overwritten at some point. A good standard is to organize your sources under
``src/`` and to list your sources and targets in ``src/CMakeLists.txt``. You
can include the latter in ``autocmake.yml`` using::
can include the latter in ``autocmake.cfg`` using::
- my_sources:
- source:
- https://github.com/dev-cafe/autocmake/raw/master/modules/src.cmake
[src]
source: https://github.com/coderefinery/autocmake/raw/master/modules/src.cmake
If you really do not like to do it this way, you can describe your sources and
If you really don't like to do it this way, you can describe your sources and
targets in a custom module in a local file and include it like this::
- my_sources:
- source:
- custom/my_sources.cmake
[my_sources]
source: custom/my_sources.cmake
How can I do some more sophisticated validation of setup flags?
@ -153,7 +121,7 @@ How can I do some more sophisticated validation of setup flags?
Sometimes you need to do more sophisticated validation and post-processing
of setup flags. This can be done by placing a module called ``extensions.py``
under ``cmake/`` (or wherever you have ``autocmake.yml``).
under ``cmake/`` (or wherever you have ``autocmake.cfg``).
This file should implement a function with the following signature:
.. code-block:: python
@ -167,37 +135,5 @@ This file should implement a function with the following signature:
return arguments
In this function you can do any validation and post-processing you like.
This function is run after the flags are parsed and before the CMake command
This function is run after the flags are parsed and before the ``CMake`` command
is run.
Example for a validation of MPI flags to the setup script:
.. code-block:: python
import sys
def contains_flag(sys_argv, flag):
return (any(x for x in sys_argv if x.startswith('--{0}='.format(flag))))
def postprocess_args(sys_argv, arguments):
# if --mpi is selected and compilers are not selected
# then compilers default to mpif90, mpicc, and mpicxx
if arguments['--mpi']:
if not contains_flag(sys_argv, 'fc') and not contains_flag(sys_argv, 'cc') and not contains_flag(sys_argv, 'cxx'):
arguments['--fc'] = 'mpif90'
arguments['--cc'] = 'mpicc'
arguments['--cxx'] = 'mpicxx'
# if one of the compilers contains "mpi" and --mpi is not selected, it is probably a user error
# in this case stop the configuration
asking_for_mpi_compiler = False
for flag in ['fc', 'cc', 'cxx']:
if contains_flag(sys_argv, 'fc'):
if 'mpi' in arguments['--fc']:
asking_for_mpi_compiler = True
if asking_for_mpi_compiler and not arguments['--mpi']:
sys.stderr.write('ERROR: you ask for an MPI compiler but have not specified --mpi\n')
sys.exit(1)
return arguments

View File

@ -1,34 +0,0 @@
.. _interpolation:
Interpolation
=============
In a custom extension to the YAML specification you can define and reuse
variables like this (observe how we interpolate ``url_root``, ``major``,
``minor``, ``patch``, and ``components`` in this example)::
url_root: https://github.com/dev-cafe/autocmake/raw/master/
major: 1
minor: 48
patch: 0
components: ""
fetch:
- "%(url_root)modules/boost/boost_unpack.cmake"
- "%(url_root)modules/boost/boost_userconfig.cmake"
- "%(url_root)modules/boost/boost_configure.cmake"
- "%(url_root)modules/boost/boost_build.cmake"
- "%(url_root)modules/boost/boost_install.cmake"
- "%(url_root)modules/boost/boost_headers.cmake"
- "%(url_root)modules/boost/boost_cleanup.cmake"
- "http://sourceforge.net/projects/boost/files/boost/%(major).%(minor).%(patch)/boost_%(major)_%(minor)_%(patch).zip"
docopt:
- "--boost-headers=<BOOST_INCLUDEDIR> Include directories for Boost [default: '']."
- "--boost-libraries=<BOOST_LIBRARYDIR> Library directories for Boost [default: '']."
- "--build-boost=<FORCE_CUSTOM_BOOST> Deactivate Boost detection and build on-the-fly <ON/OFF> [default: OFF]."
define:
- "'-DBOOST_INCLUDEDIR=\"{0}\"'.format(arguments['--boost-headers'])"
- "'-DBOOST_LIBRARYDIR=\"{0}\"'.format(arguments['--boost-libraries'])"
- "'-DFORCE_CUSTOM_BOOST={0}'.format(arguments['--build-boost'])"
- "'-DBOOST_MINIMUM_REQUIRED=\"%(major).%(minor).%(patch)\"'"
- "'-DBOOST_COMPONENTS_REQUIRED=\"%(components)\"'"

View File

@ -20,11 +20,11 @@ Sometimes you may want to avoid using the latest version of a CMake module and
rather fetch an older version, for example with the hash ``abcd123``. To
achieve this, instead of::
- my_feature:
- source: https://github.com/dev-cafe/autocmake/raw/master/modules/foo.cmake
[foo]
source: https://github.com/coderefinery/autocmake/raw/master/modules/foo.cmake
pin the version to ``abcd123`` (you do not need to specify the full Git hash, a unique
beginning will do)::
- my_feature:
- source: https://github.com/dev-cafe/autocmake/raw/abcd123/modules/foo.cmake
[foo]
source: https://github.com/coderefinery/autocmake/raw/abcd123/modules/foo.cmake

View File

@ -73,7 +73,7 @@ def main():
if s_out != '':
output.append('\n\n%s' % file_name)
output.append('-'*len(file_name))
output.append('`[Source code] <https://github.com/dev-cafe/autocmake/blob/master/modules/%s>`__' % full_file_name)
output.append('`[Source code] <https://github.com/coderefinery/autocmake/blob/master/modules/%s>`__' % full_file_name)
output.append(s_out)
with open(os.path.join(THIS_DIR, 'module-reference.rst'), 'w') as f:

View File

@ -38,7 +38,7 @@ file::
Build/install/test targets
Our main motivation to create Autocmake as a CMake framework library and
CMake module composer is to simplify CMake code transfer between programs. We got
CMake module composer is to simplify CMake code transfer between codes. We got
tired of manually diffing and copy-pasting boiler-plate CMake code and watching
it diverge while maintaining the CMake infrastructure in a growing number of
scientific projects which typically have very similar requirements:

View File

@ -8,6 +8,3 @@ support Python 3 (we automatically test with 2.7 and 3.5).
The generated setup script runs with Python >= 2.6 (also tested with Python
3.5).
To generate ``CMakeLists.txt`` and the ``setup`` script, Autocmake
requires the pyyaml package.

View File

@ -1,21 +1,25 @@
Autocmake
=========
Autocmake (this documentation is outdated, see stable-0.x branch)
=================================================================
General
-------
.. toctree::
:maxdepth: 2
:caption: General
general/about.rst
general/requirements.rst
general/help.rst
For developers who use Autocmake
--------------------------------
.. toctree::
:maxdepth: 2
:caption: For developers who use Autocmake
developers/faq.rst
developers/bootstrap.rst
@ -23,27 +27,32 @@ Autocmake
developers/example.rst
developers/customizing-modules.rst
developers/updating-modules.rst
developers/interpolation.rst
For users of projects which use Autocmake
-----------------------------------------
.. toctree::
:maxdepth: 2
:caption: For users of projects which use Autocmake
users/faq.rst
For developers/contributors to Autocmake
----------------------------------------
.. toctree::
:maxdepth: 2
:caption: For developers/contributors to Autocmake
contributors/guidelines.rst
contributors/testing.rst
contributors/doc.rst
Reference
---------
.. toctree::
:maxdepth: 2
:caption: Reference
module-reference.rst

View File

@ -1,35 +0,0 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=.
set BUILDDIR=_build
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.https://www.sphinx-doc.org/
exit /b 1
)
if "%1" == "" goto help
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
popd

View File

@ -49,7 +49,9 @@ Like this::
$ python setup --cmake-options='"-DTHIS_OPTION=ON -DTHAT_OPTION=OFF"'
We use two sets of quotes because the shell swallows one set of them before
passing the arguments to Python. Yeah that's not nice, but nothing we can do
about it on the Python side. If you do not use two sets of quotes then the
setup command may end up incorrectly saved in `build/setup_command`.
We use two sets of quotes because the shell swallows one set of them
before passing the arguments to Python. Yeah that's not nice, but nothing
we can do about it on the Python side.
If you do not use two sets
of quotes then the setup command may end up
incorrectly saved in `build/setup_command`.

View File

@ -4,4 +4,4 @@
name: myproject
min_cmake_version: 3.1
min_cmake_version: 2.8

View File

@ -1,13 +0,0 @@
import glob
license_text = '''# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
'''
for filename in glob.iglob('**/*.cmake', recursive=True):
with open(filename, 'r') as old:
text = old.read()
with open(filename, 'w') as new:
new.write(license_text)
new.write(text)

189
modules/boost/boost.cmake Normal file
View File

@ -0,0 +1,189 @@
#.rst:
#
# Detect, build, and link Boost libraries.
# This modules downloads the .zip archive from SourceForge at
# Autocmake update time.
# Note that the build-up commands are not Windows-compatible!
#
# Your autocmake.yml should look like this::
#
# - boost:
# - major: 1
# - minor: 59
# - patch: 0
# - components: "chrono;timer;system"
# - source: "https://github.com/coderefinery/autocmake/raw/master/modules/boost/boost.cmake"
#
# Cross-dependencies between required components are not checked for.
# For example, Boost.Timer depends on Boost.Chrono and Boost.System thus you
# should ask explicitly for all three.
# If the self-build of Boost components is triggered the `BUILD_CUSTOM_BOOST` variable is set
# to `TRUE`. The CMake target `custom_boost` is also added.
# You should use these two to ensure the right dependencies between your targets
# and the Boost headers/libraries, in case the self-build is triggered.
# For example::
#
# if(BUILD_CUSTOM_BOOST)
# add_dependencies(your_target custom_boost)
# endif()
#
# will ensure that `your_target` is built after `custom_boost` if and only if the self-build
# of Boost took place. This is an important step to avoid race conditions when building
# on multiple processes.
#
# Dependencies::
#
# mpi - Only if the Boost.MPI library is a needed component
# python_libs - Only if the Boost.Python library is a needed component
#
# Variables used::
#
# BOOST_MINIMUM_REQUIRED - Minimum required version of Boost
# BOOST_COMPONENTS_REQUIRED - Components (compiled Boost libraries) required
# PROJECT_SOURCE_DIR
# PROJECT_BINARY_DIR
# CMAKE_BUILD_TYPE
# MPI_FOUND
# BUILD_CUSTOM_BOOST
#
# autocmake.yml configuration::
#
# url_root: https://github.com/coderefinery/autocmake/raw/master/
# major: 1
# minor: 48
# patch: 0
# components: ""
# fetch:
# - "%(url_root)modules/boost/boost_unpack.cmake"
# - "%(url_root)modules/boost/boost_userconfig.cmake"
# - "%(url_root)modules/boost/boost_configure.cmake"
# - "%(url_root)modules/boost/boost_build.cmake"
# - "%(url_root)modules/boost/boost_install.cmake"
# - "%(url_root)modules/boost/boost_headers.cmake"
# - "%(url_root)modules/boost/boost_cleanup.cmake"
# - "http://sourceforge.net/projects/boost/files/boost/%(major).%(minor).%(patch)/boost_%(major)_%(minor)_%(patch).zip"
# docopt:
# - "--boost-headers=<BOOST_INCLUDEDIR> Include directories for Boost [default: '']."
# - "--boost-libraries=<BOOST_LIBRARYDIR> Library directories for Boost [default: '']."
# - "--build-boost=<FORCE_CUSTOM_BOOST> Deactivate Boost detection and build on-the-fly <ON/OFF> [default: OFF]."
# define:
# - "'-DBOOST_INCLUDEDIR=\"{0}\"'.format(arguments['--boost-headers'])"
# - "'-DBOOST_LIBRARYDIR=\"{0}\"'.format(arguments['--boost-libraries'])"
# - "'-DFORCE_CUSTOM_BOOST={0}'.format(arguments['--build-boost'])"
# - "'-DBOOST_MINIMUM_REQUIRED=\"%(major).%(minor).%(patch)\"'"
# - "'-DBOOST_COMPONENTS_REQUIRED=\"%(components)\"'"
# FIXME Maintainer should be able to choose between fail (end-user has to satisfy dependency
# on its own) and soft-fail (self-build of Boost)
# Underscore-separated version number
string(REGEX REPLACE "\\." "_" BOOSTVER ${BOOST_MINIMUM_REQUIRED})
# Where the Boost .zip archive is located
set(BOOST_ARCHIVE_LOCATION ${PROJECT_SOURCE_DIR}/cmake/downloaded)
set(BOOST_ARCHIVE boost_${BOOSTVER}.zip)
# FIXME These are possibly not always good settings
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
set(Boost_DEBUG OFF)
set(Boost_DETAILED_FAILURE_MESSAGE OFF)
set(BUILD_CUSTOM_BOOST FALSE)
if(FORCE_CUSTOM_BOOST)
set(BUILD_CUSTOM_BOOST TRUE)
message(STATUS "Force automatic build of Boost")
# Just to avoid unused variable warning from CMake
set(BOOST_INCLUDEDIR "")
set(BOOST_LIBRARYDIR "")
else()
# Read from cache, needed for rebuilds
set(BOOST_INCLUDEDIR ${Boost_INCLUDE_DIR})
set(BOOST_LIBRARYDIR ${Boost_LIBRARY_DIR})
find_package(Boost ${BOOST_MINIMUM_REQUIRED} COMPONENTS "${BOOST_COMPONENTS_REQUIRED}")
if(NOT Boost_FOUND)
set(BUILD_CUSTOM_BOOST TRUE)
endif()
endif()
if(BUILD_CUSTOM_BOOST)
## Preliminary work
# 0. Root directory for the custom build
set(CUSTOM_BOOST_LOCATION ${PROJECT_BINARY_DIR}/boost)
file(MAKE_DIRECTORY ${CUSTOM_BOOST_LOCATION})
# 1. Where Boost will be built
set(BOOST_BUILD_DIR ${CUSTOM_BOOST_LOCATION}/boost_${BOOSTVER})
# 2. Select toolset according to compilers specified by the user
set(toolset "")
if(CMAKE_CXX_COMPILER_ID MATCHES Intel)
set(toolset "intel-linux")
elseif(CMAKE_CXX_COMPILER_ID MATCHES Clang)
set(toolset "clang")
else()
if(CMAKE_SYSTEM_NAME MATCHES Darwin)
set(toolset "darwin")
else()
set(toolset "gcc")
endif()
endif()
string(TOLOWER ${CMAKE_BUILD_TYPE} type)
# CMAKE_CURRENT_LIST_DIR is undefined in CMake 2.8.2
# see https://public.kitware.com/Bug/print_bug_page.php?bug_id=11675
# workaround: create CMAKE_CURRENT_LIST_DIR
get_filename_component(CMAKE_CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)
include(${CMAKE_CURRENT_LIST_DIR}/boost_unpack.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/boost_userconfig.cmake)
if(NOT "${BOOST_COMPONENTS_REQUIRED}" STREQUAL "")
# Non-empty list. Compiled libraries needed
# Transform the ;-separated list to a ,-separated list (digested by the Boost build toolchain!)
string(REPLACE ";" "," b2_needed_components "${BOOST_COMPONENTS_REQUIRED}")
# Replace unit_test_framework (used by CMake's find_package) with test (understood by Boost build toolchain)
string(REPLACE "unit_test_framework" "test" b2_needed_components "${b2_needed_components}")
set(select_libraries "--with-libraries=${b2_needed_components}")
string(REPLACE ";" ", " printout "${BOOST_COMPONENTS_REQUIRED}")
message(STATUS " Libraries to be built: ${printout}")
message(STATUS " Toolset to be used: ${toolset}")
include(${CMAKE_CURRENT_LIST_DIR}/boost_configure.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/boost_build.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/boost_install.cmake)
else()
# Empty list. Header-only libraries needed
# Just unpack to known location
message(STATUS " No libraries required, installing headers")
include(${CMAKE_CURRENT_LIST_DIR}/boost_headers.cmake)
endif()
include(${CMAKE_CURRENT_LIST_DIR}/boost_cleanup.cmake)
add_custom_target(custom_boost DEPENDS ${CUSTOM_BOOST_LOCATION}/boost.cleanedup)
# 4. Set all variables related to Boost that find_package would have set
set(Boost_FOUND TRUE)
string(REGEX REPLACE "\\." "0" Boost_VERSION ${BOOST_MINIMUM_REQUIRED})
math(EXPR Boost_MAJOR_VERSION "${Boost_VERSION} / 100000")
math(EXPR Boost_MINOR_VERSION "${Boost_VERSION} / 100 % 1000")
math(EXPR Boost_SUBMINOR_VERSION "${Boost_VERSION} % 100")
set(Boost_LIB_VERSION ${Boost_MAJOR_VERSION}_${Boost_MINOR_VERSION})
set(Boost_INCLUDE_DIR ${CUSTOM_BOOST_LOCATION}/include CACHE PATH "Boost include directory" FORCE)
set(Boost_LIBRARY_DIR ${CUSTOM_BOOST_LOCATION}/lib CACHE PATH "Boost library directory" FORCE)
foreach(_component ${BOOST_COMPONENTS_REQUIRED})
string(TOUPPER ${_component} _COMP)
set(Boost_${_COMP}_FOUND TRUE)
set(Boost_${_COMP}_LIBRARY libboost_${_component}.a)
set(Boost_${_COMP}_LIBRARY_DEBUG ${Boost_LIBRARY_DIR}/${Boost_${_COMP}_LIBRARY} CACHE FILEPATH "Boost ${_component} library (debug)" FORCE)
set(Boost_${_COMP}_LIBRARY_RELEASE ${Boost_LIBRARY_DIR}/${Boost_${_COMP}_LIBRARY} CACHE FILEPATH "Boost ${_component} library (release)" FORCE)
list(APPEND Boost_LIBRARIES ${Boost_${_COMP}_LIBRARY})
endforeach()
set(Boost_INCLUDE_DIRS ${Boost_INCLUDE_DIR})
set(Boost_LIBRARY_DIRS ${Boost_LIBRARY_DIR})
if(CMAKE_SYSTEM_NAME MATCHES Linux)
list(APPEND Boost_LIBRARIES rt)
endif()
endif()
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

View File

@ -0,0 +1,10 @@
# Build Boost
# This is not Windows-friendly!
add_custom_command(
OUTPUT ${CUSTOM_BOOST_LOCATION}/boost.built
COMMAND ./b2 toolset=${toolset} variant=${type} link=static cxxflags=-fPIC
threading=multi --user-config=user-config.jam 1> ${CUSTOM_BOOST_LOCATION}/boost.built.log 2> ${CUSTOM_BOOST_LOCATION}/boost.built.err
COMMAND ${CMAKE_COMMAND} -E touch ${CUSTOM_BOOST_LOCATION}/boost.built
WORKING_DIRECTORY ${BOOST_BUILD_DIR}
DEPENDS ${CUSTOM_BOOST_LOCATION}/boost.configured
COMMENT "Building Boost")

View File

@ -0,0 +1,8 @@
# Clean-up
add_custom_command(
OUTPUT ${CUSTOM_BOOST_LOCATION}/boost.cleanedup
COMMAND ${CMAKE_COMMAND} -E remove_directory ${BOOST_BUILD_DIR}
COMMAND ${CMAKE_COMMAND} -E touch ${CUSTOM_BOOST_LOCATION}/boost.cleanedup
WORKING_DIRECTORY ${CUSTOM_BOOST_LOCATION}
DEPENDS ${CUSTOM_BOOST_LOCATION}/boost.installed
COMMENT "Clean-up Boost")

View File

@ -0,0 +1,12 @@
# Run bootstrap.sh to configure the build. We will install in ${PROJECT_BINARY_DIR}/boost
# This is not Windows-friendly!
add_custom_command(
OUTPUT ${CUSTOM_BOOST_LOCATION}/boost.configured
COMMAND ./bootstrap.sh --with-toolset=${toolset}
${select_libraries}
--with-python=${PYTHON_EXECUTABLE}
--prefix=${CUSTOM_BOOST_LOCATION} 1> ${CUSTOM_BOOST_LOCATION}/boost.configured.log 2> ${CUSTOM_BOOST_LOCATION}/boost.configured.err
COMMAND ${CMAKE_COMMAND} -E touch ${CUSTOM_BOOST_LOCATION}/boost.configured
WORKING_DIRECTORY ${BOOST_BUILD_DIR}
DEPENDS ${CUSTOM_BOOST_LOCATION}/boost.user-config
COMMENT "Configuring Boost")

View File

@ -0,0 +1,8 @@
# Install Boost
add_custom_command(
OUTPUT ${CUSTOM_BOOST_LOCATION}/boost.installed
COMMAND ${CMAKE_COMMAND} -E copy_directory ${BOOST_BUILD_DIR}/boost ${CUSTOM_BOOST_LOCATION}/include/boost
COMMAND ${CMAKE_COMMAND} -E touch ${CUSTOM_BOOST_LOCATION}/boost.installed
WORKING_DIRECTORY ${BOOST_BUILD_DIR}
DEPENDS ${CUSTOM_BOOST_LOCATION}/boost.user-config
COMMENT "Installing Boost headers")

View File

@ -0,0 +1,10 @@
# Install Boost
# This is not Windows-friendly!
add_custom_command(
OUTPUT ${CUSTOM_BOOST_LOCATION}/boost.installed
COMMAND ./b2 install toolset=${toolset} variant=${type} link=static
threading=multi --user-config=user-config.jam 1> ${CUSTOM_BOOST_LOCATION}/boost.installed.log 2> ${CUSTOM_BOOST_LOCATION}/boost.installed.err
COMMAND ${CMAKE_COMMAND} -E touch ${CUSTOM_BOOST_LOCATION}/boost.installed
WORKING_DIRECTORY ${BOOST_BUILD_DIR}
DEPENDS ${CUSTOM_BOOST_LOCATION}/boost.built
COMMENT "Installing Boost headers and libs")

View File

@ -0,0 +1,8 @@
# Unpack Boost
add_custom_command(
OUTPUT ${CUSTOM_BOOST_LOCATION}/boost.unpacked
COMMAND ${CMAKE_COMMAND} -E tar xzf ${BOOST_ARCHIVE_LOCATION}/${BOOST_ARCHIVE}
COMMAND ${CMAKE_COMMAND} -E touch boost.unpacked
DEPENDS ${BOOST_ARCHIVE_LOCATION}/${BOOST_ARCHIVE}
WORKING_DIRECTORY ${CUSTOM_BOOST_LOCATION}
COMMENT "Unpacking Boost")

View File

@ -0,0 +1,15 @@
# To get boost to compile MPI we need to append "using mpi ;" to the end of the
# user-config.jam file. MPI_SENT will be the command we append
set(MPI_SENT "")
if(ENABLE_MPI AND MPI_FOUND)
set(MPI_SENT "using mpi \;")
endif()
file(WRITE ${CUSTOM_BOOST_LOCATION}/user-config.jam ${MPI_SENT})
# Write user-config.jam
add_custom_command(
OUTPUT ${CUSTOM_BOOST_LOCATION}/boost.user-config
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CUSTOM_BOOST_LOCATION}/user-config.jam ${BOOST_BUILD_DIR}/user-config.jam
COMMAND ${CMAKE_COMMAND} -E touch boost.user-config
DEPENDS ${CUSTOM_BOOST_LOCATION}/boost.unpacked
WORKING_DIRECTORY ${CUSTOM_BOOST_LOCATION}
COMMENT "Generating user-config.jam")

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Adds C support.
@ -25,7 +22,10 @@
# docopt:
# - "--cc=<CC> C compiler [default: gcc]."
# - "--extra-cc-flags=<EXTRA_CFLAGS> Extra C compiler flags [default: '']."
# define: "'-DCMAKE_C_COMPILER={0} -DEXTRA_CFLAGS=\"{1}\"'.format(arguments['--cc'], arguments['--extra-cc-flags'])"
# export: "'CC={0}'.format(arguments['--cc'])"
# define: "'-DEXTRA_CFLAGS=\"{0}\"'.format(arguments['--extra-cc-flags'])"
enable_language(C)
if(NOT DEFINED CMAKE_C_COMPILER_ID)
message(FATAL_ERROR "CMAKE_C_COMPILER_ID variable is not defined!")
@ -36,9 +36,7 @@ if(NOT CMAKE_C_COMPILER_WORKS)
endif()
if(DEFINED EXTRA_CFLAGS)
if(NOT EXTRA_CFLAGS STREQUAL "")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
endif()
endif()
if(DEFINED ENV{CFLAGS})

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Adds ccache support.

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Enables code coverage by appending corresponding compiler flags.
@ -13,54 +10,30 @@
#
# autocmake.yml configuration::
#
# docopt: "--coverage Enable code coverage [default: OFF]."
# docopt: "--coverage Enable code coverage [default: False]."
# define: "'-DENABLE_CODE_COVERAGE={0}'.format(arguments['--coverage'])"
option(ENABLE_CODE_COVERAGE "Enable code coverage" OFF)
if(ENABLE_CODE_COVERAGE)
if(NOT CMAKE_BUILD_TYPE STREQUAL "debug")
message(WARNING "Code coverage analysis results with an optimized (non-Debug) build may be misleading")
endif()
find_program(GCOV_PATH gcov)
if(NOT GCOV_PATH)
message(FATAL_ERROR "Code coverage analysis requires gcov!")
endif()
if(DEFINED CMAKE_Fortran_COMPILER_ID)
if(CMAKE_Fortran_COMPILER_ID MATCHES GNU)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fprofile-arcs -ftest-coverage")
else()
message(FATAL_ERROR "Code coverage analysis requires the GNU Fortran compiler!")
if(DEFINED CMAKE_Fortran_COMPILER_ID)
if(CMAKE_Fortran_COMPILER_ID MATCHES GNU)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fprofile-arcs -ftest-coverage")
endif()
endif()
endif()
if(DEFINED CMAKE_C_COMPILER_ID)
if(CMAKE_C_COMPILER_ID MATCHES "(Apple)?[Cc]lang")
if(CMAKE_C_COMPILER_VERSION VERSION_LESS 3)
message(FATAL_ERROR "Code coverage analysis on Mac OS X requires Clang version 3.0.0 or greater!")
else()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
endif()
elseif(CMAKE_C_COMPILER_ID MATCHES GNU)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
else()
message(FATAL_ERROR "Code coverage analysis requires the GNU C compiler!")
if(DEFINED CMAKE_C_COMPILER_ID)
if(CMAKE_C_COMPILER_ID MATCHES GNU)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
endif()
endif()
endif()
if(DEFINED CMAKE_CXX_COMPILER_ID)
if(CMAKE_CXX_COMPILER_ID MATCHES "(Apple)?[Cc]lang")
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3)
message(FATAL_ERROR "Code coverage analysis on Mac OS X requires Clang version 3.0.0 or greater!")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
endif()
elseif(CMAKE_CXX_COMPILER_ID MATCHES GNU)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
else()
message(FATAL_ERROR "Code coverage analysis requires the GNU C++ compiler!")
if(DEFINED CMAKE_CXX_COMPILER_ID)
if(CMAKE_CXX_COMPILER_ID MATCHES GNU)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES Clang)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
endif()
endif()
endif()
endif()

View File

@ -1,63 +0,0 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Colorize CMake output.
# Code was found on StackOverflow: http://stackoverflow.com/a/19578320
#
# Usage within CMake code:
# message("This is normal")
# message("${Red}This is Red${ColourReset}")
# message("${Green}This is Green${ColourReset}")
# message("${Yellow}This is Yellow${ColourReset}")
# message("${Blue}This is Blue${ColourReset}")
# message("${Magenta}This is Magenta${ColourReset}")
# message("${Cyan}This is Cyan${ColourReset}")
# message("${White}This is White${ColourReset}")
# message("${BoldRed}This is BoldRed${ColourReset}")
# message("${BoldGreen}This is BoldGreen${ColourReset}")
# message("${BoldYellow}This is BoldYellow${ColourReset}")
# message("${BoldBlue}This is BoldBlue${ColourReset}")
# message("${BoldMagenta}This is BoldMagenta${ColourReset}")
# message("${BoldCyan}This is BoldCyan${ColourReset}")
# message("${BoldWhite}This is BoldWhite\n\n${ColourReset}")
#
# Has no effect on WIN32.
if(WIN32)
set(ColourReset "")
set(ColourBold "")
set(Red "")
set(Green "")
set(Yellow "")
set(Blue "")
set(Magenta "")
set(Cyan "")
set(White "")
set(BoldRed "")
set(BoldGreen "")
set(BoldYellow "")
set(BoldBlue "")
set(BoldMagenta "")
set(BoldCyan "")
set(BoldWhite "")
else()
string(ASCII 27 Esc)
set(ColourReset "${Esc}[m")
set(ColourBold "${Esc}[1m")
set(Red "${Esc}[31m")
set(Green "${Esc}[32m")
set(Yellow "${Esc}[33m")
set(Blue "${Esc}[34m")
set(Magenta "${Esc}[35m")
set(Cyan "${Esc}[36m")
set(White "${Esc}[37m")
set(BoldRed "${Esc}[1;31m")
set(BoldGreen "${Esc}[1;32m")
set(BoldYellow "${Esc}[1;33m")
set(BoldBlue "${Esc}[1;34m")
set(BoldMagenta "${Esc}[1;35m")
set(BoldCyan "${Esc}[1;36m")
set(BoldWhite "${Esc}[1;37m")
endif()

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Adds C++ support.
@ -25,20 +22,21 @@
# docopt:
# - "--cxx=<CXX> C++ compiler [default: g++]."
# - "--extra-cxx-flags=<EXTRA_CXXFLAGS> Extra C++ compiler flags [default: '']."
# define: "'-DCMAKE_CXX_COMPILER={0} -DEXTRA_CXXFLAGS=\"{1}\"'.format(arguments['--cxx'], arguments['--extra-cxx-flags'])"
# export: "'CXX={0}'.format(arguments['--cxx'])"
# define: "'-DEXTRA_CXXFLAGS=\"{0}\"'.format(arguments['--extra-cxx-flags'])"
if(NOT DEFINED CMAKE_CXX_COMPILER_ID)
message(FATAL_ERROR "CMAKE_CXX_COMPILER_ID variable is not defined!")
enable_language(CXX)
if(NOT DEFINED CMAKE_C_COMPILER_ID)
message(FATAL_ERROR "CMAKE_C_COMPILER_ID variable is not defined!")
endif()
if(NOT CMAKE_CXX_COMPILER_WORKS)
message(FATAL_ERROR "CMAKE_CXX_COMPILER_WORKS is false!")
if(NOT CMAKE_C_COMPILER_WORKS)
message(FATAL_ERROR "CMAKE_C_COMPILER_WORKS is false!")
endif()
if(DEFINED EXTRA_CXXFLAGS)
if(NOT EXTRA_CXXFLAGS STREQUAL "")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXXFLAGS}")
endif()
endif()
if(DEFINED ENV{CXXFLAGS})

View File

@ -1,19 +1,12 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Sets binary and library output directories to ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}
# and ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}, respectively.
# Sets binary and library output directories to ${PROJECT_BINARY_DIR}/bin
# and ${PROJECT_BINARY_DIR}/lib, respectively.
#
# Variables modified::
#
# CMAKE_ARCHIVE_OUTPUT_DIRECTORY
# CMAKE_LIBRARY_OUTPUT_DIRECTORY
# CMAKE_RUNTIME_OUTPUT_DIRECTORY
# CMAKE_LIBRARY_OUTPUT_DIRECTORY
include(GNUInstallDirs)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Add preprocessor definitions (example: --add-definitions="-DTHIS -DTHAT=137").

View File

@ -1,26 +0,0 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Generates export header for your API using best practices.
# This module wraps https://cmake.org/cmake/help/v3.0/module/GenerateExportHeader.html and
# it is needed because of these, Very Good Indeed, reasons: https://gcc.gnu.org/wiki/Visibility.
# If you are not afraid of jargon, please also have a look at https://www.akkadia.org/drepper/dsohowto.pdf.
#
# Variables used::
#
# PROJECT_NAME (defined by project())
include(GenerateExportHeader)
generate_export_header(${PROJECT_NAME}
BASE_NAME "${PROJECT_NAME}"
EXPORT_MACRO_NAME "${PROJECT_NAME}_EXPORT"
EXPORT_FILE_NAME "include/${PROJECT_NAME}_export.h"
DEPRECATED_MACRO_NAME "${PROJECT_NAME}_DEPRECATED"
NO_EXPORT_MACRO_NAME "${PROJECT_NAME}_NO_EXPORT"
STATIC_DEFINE "${PROJECT_NAME}_STATIC_DEFINE"
NO_DEPRECATED_MACRO_NAME "${PROJECT_NAME}_NO_DEPRECATED"
DEFINE_NO_DEPRECATED
)

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Adds Fortran support.
@ -29,7 +26,10 @@
# docopt:
# - "--fc=<FC> Fortran compiler [default: gfortran]."
# - "--extra-fc-flags=<EXTRA_FCFLAGS> Extra Fortran compiler flags [default: '']."
# define: "'-DCMAKE_Fortran_COMPILER={0} -DEXTRA_FCFLAGS=\"{1}\"'.format(arguments['--fc'], arguments['--extra-fc-flags'])"
# export: "'FC={0}'.format(arguments['--fc'])"
# define: "'-DEXTRA_FCFLAGS=\"{0}\"'.format(arguments['--extra-fc-flags'])"
enable_language(Fortran)
set(CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/modules)
include_directories(${PROJECT_BINARY_DIR}/modules)
@ -43,9 +43,7 @@ if(NOT CMAKE_Fortran_COMPILER_WORKS)
endif()
if(DEFINED EXTRA_FCFLAGS)
if(NOT EXTRA_FCFLAGS STREQUAL "")
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${EXTRA_FCFLAGS}")
endif()
endif()
if(DEFINED ENV{FCFLAGS})

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Adds optional Fortran support.
@ -35,8 +32,9 @@
# - "--fc=<FC> Fortran compiler [default: gfortran]."
# - "--extra-fc-flags=<EXTRA_FCFLAGS> Extra Fortran compiler flags [default: '']."
# - "--fc-support=<FC_SUPPORT> Toggle Fortran language support (ON/OFF) [default: ON]."
# export: "'FC={0}'.format(arguments['--fc'])"
# define:
# - "'-DCMAKE_Fortran_COMPILER={0} -DEXTRA_FCFLAGS=\"{1}\"'.format(arguments['--fc'], arguments['--extra-fc-flags'])"
# - "'-DEXTRA_FCFLAGS=\"{0}\"'.format(arguments['--extra-fc-flags'])"
# - "'-DENABLE_FC_SUPPORT={0}'.format(arguments['--fc-support'])"
option(ENABLE_FC_SUPPORT "Enable Fortran language support" ON)
@ -56,9 +54,7 @@ if(ENABLE_FC_SUPPORT)
endif()
if(DEFINED EXTRA_FCFLAGS)
if(NOT EXTRA_FCFLAGS STREQUAL "")
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${EXTRA_FCFLAGS}")
endif()
endif()
if(DEFINED ENV{FCFLAGS})

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
include(CheckIncludeFile)
function(_find_include_dir _names _hints _result)

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
include(CheckFunctionExists)
function(_find_library _names _check_function _result)

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Creates git_info.h in the build directory.
@ -10,65 +7,22 @@
#
# autocmake.yml configuration::
#
# url_root: https://github.com/dev-cafe/autocmake/raw/master/
# url_root: https://github.com/coderefinery/autocmake/raw/master/
# fetch:
# - "%(url_root)modules/git_info/git_info_sub.cmake"
# - "%(url_root)modules/git_info/git_info.h.in"
get_filename_component(_current_dir ${CMAKE_CURRENT_LIST_FILE} PATH)
function(generate_git_info_header _header_location _header_name)
# _header_location: where the Git info header file should be generated
# _header_name: the Git info header name, complete with extension (.h, .hpp, .hxx or whatever)
find_package(Git)
set(_git_last_commit_hash "unknown")
set(_git_last_commit_author "unknown")
set(_git_last_commit_date "unknown")
set(_git_branch "unknown")
if(GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} --no-pager show -s --pretty=format:%h -n 1
OUTPUT_VARIABLE _git_last_commit_hash
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
execute_process(
COMMAND ${GIT_EXECUTABLE} --no-pager show -s --pretty=format:%aN -n 1
OUTPUT_VARIABLE _git_last_commit_author
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
execute_process(
COMMAND ${GIT_EXECUTABLE} --no-pager show -s --pretty=format:%ad -n 1
OUTPUT_VARIABLE _git_last_commit_date
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD
OUTPUT_VARIABLE _git_branch
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
endif()
configure_file(
${_current_dir}/git_info.h.in
${_header_location}/${_header_name}
@ONLY
# CMAKE_CURRENT_LIST_DIR is undefined in CMake 2.8.2
# see https://public.kitware.com/Bug/print_bug_page.php?bug_id=11675
# workaround: create CMAKE_CURRENT_LIST_DIR
get_filename_component(CMAKE_CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)
add_custom_command(
OUTPUT ${PROJECT_BINARY_DIR}/git_info.h
COMMAND ${CMAKE_COMMAND} -D_target_dir=${PROJECT_BINARY_DIR} -P git_info_sub.cmake
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)
unset(_git_last_commit_hash)
unset(_git_last_commit_author)
unset(_git_last_commit_date)
unset(_git_branch)
add_custom_target(
add_custom_target(
git_info
ALL DEPENDS ${_header_location}/${_header_name}
ALL DEPENDS ${PROJECT_BINARY_DIR}/git_info.h
)
endfunction()

View File

@ -0,0 +1,64 @@
#.rst:
#
# Creates git_info.h in the build directory.
# This file can be included in sources to print
# Git status information to the program output
# for reproducibility reasons.
find_package(Git)
set(_git_last_commit_hash "unknown")
set(_git_last_commit_author "unknown")
set(_git_last_commit_date "unknown")
set(_git_branch "unknown")
if(GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-list --max-count=1 --abbrev-commit HEAD
OUTPUT_VARIABLE _git_last_commit_hash
ERROR_QUIET
)
if(_git_last_commit_hash)
string(STRIP ${_git_last_commit_hash} _git_last_commit_hash)
endif()
execute_process(
COMMAND ${GIT_EXECUTABLE} log --max-count=1 HEAD
OUTPUT_VARIABLE _git_last_commit
ERROR_QUIET
)
if(_git_last_commit)
string(REGEX MATCH "Author: +([^<]*) <" temp "${_git_last_commit}")
set(_git_last_commit_author ${CMAKE_MATCH_1})
string(STRIP ${_git_last_commit_author} _git_last_commit_author)
string(REGEX MATCH "Date: +(.+[0-9][0-9][0-9][0-9] [+-][0-9][0-9][0-9][0-9])" temp "${_git_last_commit}")
set(_git_last_commit_date ${CMAKE_MATCH_1})
endif()
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD
OUTPUT_VARIABLE _git_branch
ERROR_QUIET
)
if(_git_branch)
string(STRIP ${_git_branch} _git_branch)
endif()
endif()
# CMAKE_CURRENT_LIST_DIR is undefined in CMake 2.8.2
# see https://public.kitware.com/Bug/print_bug_page.php?bug_id=11675
# workaround: create CMAKE_CURRENT_LIST_DIR
get_filename_component(CMAKE_CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)
configure_file(
${CMAKE_CURRENT_LIST_DIR}/git_info.h.in
${_target_dir}/git_info.h
@ONLY
)
unset(_git_last_commit_hash)
unset(_git_last_commit_author)
unset(_git_last_commit_date)
unset(_git_branch)

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Includes Google Test sources and adds a library "googletest".

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Enables 64-bit integer support for Fortran projects.

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Find and link to ACCELERATE.
@ -13,7 +10,7 @@
#
# autocmake.yml configuration::
#
# url_root: https://github.com/dev-cafe/autocmake/raw/master/
# url_root: https://github.com/coderefinery/autocmake/raw/master/
# docopt: "--accelerate Find and link to ACCELERATE [default: False]."
# define: "'-DENABLE_ACCELERATE={0}'.format(arguments['--accelerate'])"
# fetch:
@ -23,8 +20,8 @@
option(ENABLE_ACCELERATE "Find and link to ACCELERATE" OFF)
if(ENABLE_ACCELERATE)
include(${CMAKE_CURRENT_LIST_DIR}/../find/find_libraries.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/../find/find_include_files.cmake)
include(find_libraries)
include(find_include_files)
set(ACCELERATE_FOUND FALSE)
set(ACCELERATE_LIBRARIES "NOTFOUND")

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Find and link to ACML.

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Find and link to ATLAS.

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Find and link to BLAS.

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Find and link to CBLAS.
@ -13,7 +10,7 @@
#
# autocmake.yml configuration::
#
# url_root: https://github.com/dev-cafe/autocmake/raw/master/
# url_root: https://github.com/coderefinery/autocmake/raw/master/
# docopt: "--cblas Find and link to CBLAS [default: False]."
# define: "'-DENABLE_CBLAS={0}'.format(arguments['--cblas'])"
# fetch:
@ -23,8 +20,8 @@
option(ENABLE_CBLAS "Find and link to CBLAS" OFF)
if(ENABLE_CBLAS)
include(${CMAKE_CURRENT_LIST_DIR}/../find/find_libraries.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/../find/find_include_files.cmake)
include(find_libraries)
include(find_include_files)
set(CBLAS_FOUND FALSE)
set(CBLAS_LIBRARIES "NOTFOUND")

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Find and link to Goto BLAS.

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Find and link to LAPACK.

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Find and link to LAPACKE.
@ -13,7 +10,7 @@
#
# autocmake.yml configuration::
#
# url_root: https://github.com/dev-cafe/autocmake/raw/master/
# url_root: https://github.com/coderefinery/autocmake/raw/master/
# docopt: "--lapacke Find and link to LAPACKE [default: False]."
# define: "'-DENABLE_LAPACKE={0}'.format(arguments['--lapacke'])"
# fetch:
@ -23,8 +20,8 @@
option(ENABLE_LAPACKE "Find and link to LAPACKE" OFF)
if(ENABLE_LAPACKE)
include(${CMAKE_CURRENT_LIST_DIR}/find_libraries.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/find_include_files.cmake)
include(find_libraries)
include(find_include_files)
set(LAPACKE_FOUND FALSE)
set(LAPACKE_LIBRARIES "NOTFOUND")

124
modules/math/openblas.cmake Normal file
View File

@ -0,0 +1,124 @@
# this file is adapted from https://github.com/BVLC/caffe/blob/master/cmake/Modules/FindOpenBLAS.cmake
# and reused by providing the corresponding copyright notice:
#
#
# COPYRIGHT
#
# All contributions by the University of California:
# Copyright (c) 2014, 2015, The Regents of the University of California (Regents)
# All rights reserved.
#
# All other contributions:
# Copyright (c) 2014, 2015, the respective contributors
# All rights reserved.
#
# Caffe uses a shared copyright model: each contributor holds copyright over
# their contributions to Caffe. The project versioning records all such
# contribution and copyright details. If a contributor wants to further mark
# their specific copyright on a particular contribution, they should indicate
# their copyright solely in the commit message of the change when it is
# committed.
#
# LICENSE
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#
#.rst:
#
# Find and link to OpenBLAS.
#
# Variables defined::
#
# OpenBLAS_FOUND
# OpenBLAS_LIB
# OpenBLAS_INCLUDE_DIR
#
# autocmake.yml configuration::
#
# docopt: "--openblas Find and link to OpenBLAS [default: False]."
# define: "'-DENABLE_OPENBLAS={0}'.format(arguments['--openblas'])"
option(ENABLE_OPENBLAS "Find and link to OpenBLAS" OFF)
if (ENABLE_OPENBLAS)
SET(Open_BLAS_INCLUDE_SEARCH_PATHS
/usr/include
/usr/include/openblas
/usr/include/openblas-base
/usr/local/include
/usr/local/include/openblas
/usr/local/include/openblas-base
/opt/OpenBLAS/include
$ENV{OpenBLAS_HOME}
$ENV{OpenBLAS_HOME}/include
)
SET(Open_BLAS_LIB_SEARCH_PATHS
/lib/
/lib/openblas-base
/lib64/
/usr/lib
/usr/lib/openblas-base
/usr/lib64
/usr/local/lib
/usr/local/lib64
/opt/OpenBLAS/lib
$ENV{OpenBLAS}cd
$ENV{OpenBLAS}/lib
$ENV{OpenBLAS_HOME}
$ENV{OpenBLAS_HOME}/lib
)
FIND_PATH(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Open_BLAS_INCLUDE_SEARCH_PATHS})
FIND_LIBRARY(OpenBLAS_LIB NAMES openblas PATHS ${Open_BLAS_LIB_SEARCH_PATHS})
SET(OpenBLAS_FOUND ON)
# Check include files
IF(NOT OpenBLAS_INCLUDE_DIR)
SET(OpenBLAS_FOUND OFF)
MESSAGE(STATUS "Could not find OpenBLAS include. Turning OpenBLAS_FOUND off")
ENDIF()
# Check libraries
IF(NOT OpenBLAS_LIB)
SET(OpenBLAS_FOUND OFF)
MESSAGE(STATUS "Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off")
ENDIF()
IF (OpenBLAS_FOUND)
IF (NOT OpenBLAS_FIND_QUIETLY)
MESSAGE(STATUS "Found OpenBLAS libraries: ${OpenBLAS_LIB}")
MESSAGE(STATUS "Found OpenBLAS include: ${OpenBLAS_INCLUDE_DIR}")
ENDIF (NOT OpenBLAS_FIND_QUIETLY)
ELSE (OpenBLAS_FOUND)
IF (OpenBLAS_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find OpenBLAS")
ENDIF (OpenBLAS_FIND_REQUIRED)
ENDIF (OpenBLAS_FOUND)
MARK_AS_ADVANCED(
OpenBLAS_INCLUDE_DIR
OpenBLAS_LIB
OpenBLAS
)
endif()

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Detects and links to BLAS and LAPACK libraries.
@ -46,8 +43,6 @@
# - "--blas=<BLAS> Detect and link BLAS library (auto or off) [default: auto]."
# - "--lapack=<LAPACK> Detect and link LAPACK library (auto or off) [default: auto]."
# - "--mkl=<MKL> Pass MKL flag to the Intel compiler and linker and skip BLAS/LAPACK detection (sequential, parallel, cluster, or off) [default: off]."
# - "--scalapack=<SCALAPACK_LIBRARIES> Link line for ScaLAPACK libraries [default: ]"
# - "--blacs=<BLACS_IMPLEMENTATION> Implementation of BLACS for MKL ScaLAPACK (openmpi, intelmpi, sgimpt) [default: openmpi]"
# define:
# - "'-DENABLE_BLAS={0}'.format(arguments['--blas'])"
# - "'-DENABLE_LAPACK={0}'.format(arguments['--lapack'])"
@ -55,51 +50,8 @@
# - "'-DMATH_LIB_SEARCH_ORDER=\"MKL;ESSL;OPENBLAS;ATLAS;ACML;SYSTEM_NATIVE\"'"
# - "'-DBLAS_LANG=Fortran'"
# - "'-DLAPACK_LANG=Fortran'"
# - "'-DSCALAPACK_LIBRARIES=\"{0}\"'.format(arguments['--scalapack'])"
# - "'-DBLACS_IMPLEMENTATION=\"{0}\"'.format(arguments['--blacs'])"
# warning: "the math_libs.cmake module is deprecated and will be removed in future versions"
option_with_default(
NAME ENABLE_BLAS
MESSAGE "Enable BLAS autodetection"
DEFAULT "auto"
)
option_with_default(
NAME ENABLE_LAPACK
MESSAGE "Enable LAPACK autodetection"
DEFAULT "auto"
)
option_with_default(
NAME MKL_FLAG
MESSAGE "MKL flag for the Intel compiler and linker. Skips BLAS/LAPACK autodetection"
DEFAULT "off"
)
option_with_default(
NAME MATH_LIB_SEARCH_ORDER
MESSAGE "Search order for autodetection of math libraries"
DEFAULT "MKL;ESSL;OPENBLAS;ATLAS;ACML;SYSTEM_NATIVE"
)
option_with_default(
NAME BLAS_LANG
MESSAGE "Linker language for BLAS detection"
DEFAULT "Fortran"
)
option_with_default(
NAME LAPACK_LANG
MESSAGE "Linker language for LAPACK detection"
DEFAULT "Fortran"
)
option_with_default(
NAME SCALAPACK_LIBRARIES
MESSAGE "Link line for ScaLAPACK libraries"
DEFAULT ""
)
option_with_default(
NAME BLACS_IMPLEMENTATION
MESSAGE "Implementation of BLACS for MKL ScaLAPACK"
DEFAULT "openmpi"
)
#-------------------------------------------------------------------------------
# ENABLE_STATIC_LINKING
@ -242,7 +194,7 @@ if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64")
endif()
endif()
if(ENABLE_SCALAPACK AND NOT SCALAPACK_LIBRARIES)
if(ENABLE_SCALAPACK)
set(_scalapack_lib mkl_scalapack${_lib_suffix})
if(${BLACS_IMPLEMENTATION} STREQUAL "intelmpi")
set(_blacs_lib mkl_blacs_intelmpi${_lib_suffix})
@ -256,7 +208,6 @@ if(ENABLE_SCALAPACK AND NOT SCALAPACK_LIBRARIES)
else()
set(_scalapack_lib)
set(_blacs_lib)
set(BLACS_IMPLEMENTATION)
endif()
# MKL 10.0.1.014
@ -478,7 +429,7 @@ foreach(_service BLAS LAPACK)
endif()
endforeach()
if(MKL_FLAG AND NOT MKL_FLAG STREQUAL "off")
if(NOT MKL_FLAG STREQUAL "off")
set(EXTERNAL_LIBS ${EXTERNAL_LIBS} -mkl=${MKL_FLAG})
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -mkl=${MKL_FLAG}")
message(STATUS "User set explicit MKL flag which is passed to the compiler and linker: -mkl=${MKL_FLAG}")
@ -541,21 +492,12 @@ foreach(_service BLAS LAPACK)
endforeach()
# first lapack, then blas as lapack might need blas routine
if(SCALAPACK_LIBRARIES)
list(APPEND MATH_LIBS
${MATH_LIBS}
${SCALAPACK_LIBRARIES}
${LAPACK_LIBRARIES}
${BLAS_LIBRARIES}
)
else()
list(APPEND MATH_LIBS
${MATH_LIBS}
${LAPACK_LIBRARIES}
${BLAS_LIBRARIES}
)
endif()
set(MATH_LIBS ${MATH_LIBS} CACHE STRING "Math libraries")
set(MATH_LIBS
${MATH_LIBS}
${LAPACK_LIBRARIES}
${BLAS_LIBRARIES}
CACHE STRING "Math libraries"
)
# further adaptation for the static linking
if (ENABLE_STATIC_LINKING)

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Enables MPI support.

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Enables OpenMP support.
@ -24,6 +21,25 @@
option(ENABLE_OPENMP "Enable OpenMP parallelization" OFF)
if(ENABLE_OPENMP)
if(DEFINED CMAKE_Fortran_COMPILER_ID)
# we do this in a pedestrian way because the Fortran support is relatively recent
if(CMAKE_Fortran_COMPILER_ID MATCHES GNU)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fopenmp")
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES Intel)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -openmp")
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES PGI)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -mp")
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES XL)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -qsmp")
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES Cray)
# do nothing in this case
endif()
set(OPENMP_FOUND TRUE)
endif()
if(NOT OPENMP_FOUND)
find_package(OpenMP)
@ -37,35 +53,5 @@ if(ENABLE_OPENMP)
if(DEFINED CMAKE_CXX_COMPILER_ID)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()
if(DEFINED CMAKE_Fortran_COMPILER_ID)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}")
endif()
endif()
# this is only needed for CMake below 3.5
if(DEFINED CMAKE_Fortran_COMPILER_ID AND NOT DEFINED OpenMP_Fortran_FLAGS)
# we do this in a pedestrian way because the Fortran support is relatively recent
if(CMAKE_Fortran_COMPILER_ID MATCHES GNU)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fopenmp")
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES Intel)
if(WIN32)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Qopenmp")
elseif("${CMAKE_Fortran_COMPILER_VERSION}" VERSION_LESS "15.0.0.20140528")
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -openmp")
else()
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -qopenmp")
endif()
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES PGI)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -mp")
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES XL)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -qsmp=omp")
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES Cray)
# do nothing in this case
endif()
set(OPENMP_FOUND TRUE)
endif()
endif()

View File

@ -1,33 +0,0 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Enable profiling by appending corresponding compiler flags.
#
# Variables modified (provided the corresponding language is enabled)::
#
# CMAKE_Fortran_FLAGS
# CMAKE_C_FLAGS
# CMAKE_CXX_FLAGS
#
# autocmake.yml configuration::
#
# docopt: "--profile Enable profiling [default: False]"
# define: "'-DENABLE_PROFILING={0}'.format(arguments['--profile'])"
option(ENABLE_PROFILING "Enable profiling" OFF)
message(STATUS "Enable profiling: ${ENABLE_PROFILING}")
if(ENABLE_PROFILING)
if(DEFINED CMAKE_Fortran_COMPILER_ID)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g -pg")
endif()
if(DEFINED CMAKE_C_COMPILER_ID)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -pg")
endif()
if(DEFINED CMAKE_CXX_COMPILER_ID)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -pg")
endif()
endif()

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Detects Python interpreter.

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Detects Python libraries and headers.
@ -78,9 +75,12 @@ find_package_handle_standard_args(PythonLibs
PYTHON_EXECUTABLE)
if(NOT PYTHONLIBS_FOUND)
message(FATAL_ERROR "Could NOT find PythonLibs - did you install the python-dev package?")
message(FATAL_ERROR "Could NOT find PythonLibs")
endif()
# Hook-up script variables to cache variables
set(PYTHON_LIBRARIES ${PYTHON_LIBRARY})
set(PYTHON_INCLUDE_DIRS ${PYTHON_INCLUDE_DIR})
include_directories(SYSTEM ${PYTHON_INCLUDE_DIRS})
link_directories(${PYTHON_LIBRARIES})

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Provides safeguards against in-source builds and bad build types.
@ -20,7 +17,6 @@ string(TOUPPER "${CMAKE_BUILD_TYPE}" cmake_build_type_toupper)
if(NOT cmake_build_type_tolower STREQUAL "debug" AND
NOT cmake_build_type_tolower STREQUAL "release" AND
NOT cmake_build_type_tolower STREQUAL "minsizerel" AND
NOT cmake_build_type_tolower STREQUAL "relwithdebinfo")
message(FATAL_ERROR "Unknown build type \"${CMAKE_BUILD_TYPE}\". Allowed values are Debug, Release, RelWithDebInfo, and MinSizeRel (case-insensitive).")
message(FATAL_ERROR "Unknown build type \"${CMAKE_BUILD_TYPE}\". Allowed values are Debug, Release, RelWithDebInfo (case-insensitive).")
endif()

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Take care of updating the cache for fresh configurations.

View File

@ -1,30 +0,0 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Adds sccache support.
# The user should export the appropriate environment variables to
# tweak the program's behaviour, as described in its manpage.
# Notice that some additional compiler flags might be needed in order
# to avoid unnecessary warnings.
#
# Variables defined::
#
# SCCACHE_FOUND
#
# autocmake.yml configuration::
#
# docopt: "--sccache=<USE_SCCACHE> Toggle use of sccache <ON/OFF> [default: ON]."
# define: "'-DUSE_SCCACHE={0}'.format(arguments['--sccache'])"
if(USE_SCCACHE)
find_program(SCCACHE_FOUND sccache)
if(SCCACHE_FOUND)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE sccache)
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK sccache)
message(STATUS "Compiling with sccache")
else()
message(STATUS "sccache not available")
endif()
endif()

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Adds ${PROJECT_SOURCE_DIR}/src as subdirectory containing CMakeLists.txt.

View File

@ -1,6 +1,3 @@
# (c) https://github.com/dev-cafe/autocmake/blob/master/AUTHORS.md
# licensed under BSD-3: https://github.com/dev-cafe/autocmake/blob/master/LICENSE
#.rst:
#
# Determine program version from file "VERSION" (example: "14.1")

View File

@ -1,4 +1,3 @@
pycodestyle
pep8
pytest
pyyaml
sphinx

0
test/__init__.py Normal file
View File

View File

@ -0,0 +1,14 @@
name: example
min_cmake_version: 2.8
modules:
- cxx:
- source: ../../../modules/cxx.cmake
- boost:
- major: 1
- minor: 48
- patch: 0
- source: ../../../modules/boost/boost.cmake
- default_build_paths:
- source: ../../../modules/default_build_paths.cmake
- src:
- source: ../../../modules/src.cmake

View File

@ -0,0 +1 @@
add_executable(example example.cpp)

View File

@ -0,0 +1,17 @@
#include <iostream>
#include <boost/version.hpp>
int main()
{
std::cout << "Boost version: "
<< BOOST_VERSION / 100000
<< "."
<< BOOST_VERSION / 100 % 1000
<< "."
<< BOOST_VERSION % 100
<< std::endl;
std::cout << "PASSED" << std::endl;
return 0;
}

View File

@ -0,0 +1,21 @@
name: example
min_cmake_version: 2.8
modules:
- cxx:
- source: ../../../modules/cxx.cmake
- mpi:
- source: ../../../modules/mpi.cmake
- python_interpreter:
- source: ../../../modules/python_interpreter.cmake
- python_libs:
- source: ../../../modules/python_libs.cmake
- boost:
- major: 1
- minor: 59
- patch: 0
- components: 'mpi;serialization;python'
- source: ../../../modules/boost/boost.cmake
- default_build_paths:
- source: ../../../modules/default_build_paths.cmake
- src:
- source: ../../../modules/src.cmake

View File

@ -0,0 +1,8 @@
add_executable(example example.cpp)
if(BUILD_CUSTOM_BOOST)
add_dependencies(example custom_boost)
endif()
target_link_libraries(example ${Boost_MPI_LIBRARY} ${Boost_SERIALIZATION_LIBRARY} ${MPI_CXX_LIBRARIES}
${Boost_PYTHON_LIBRARY} ${PYTHON_LIBRARIES})

View File

@ -0,0 +1,45 @@
#include <iostream>
#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <boost/python.hpp>
#include <boost/version.hpp>
int main()
{
using namespace boost::python;
namespace mpi = boost::mpi;
std::cout << "Boost version: "
<< BOOST_VERSION / 100000
<< "."
<< BOOST_VERSION / 100 % 1000
<< "."
<< BOOST_VERSION % 100
<< std::endl;
try {
Py_Initialize();
object main_module((
handle<>(borrowed(PyImport_AddModule("__main__")))));
object main_namespace = main_module.attr("__dict__");
handle<> ignored(( PyRun_String( "print \"Hello, World\"",
Py_file_input,
main_namespace.ptr(),
main_namespace.ptr() ) ));
} catch( error_already_set ) {
PyErr_Print();
}
mpi::environment env;
mpi::communicator world;
std::cout << "I am process " << world.rank() << " of " << world.size()
<< "." << std::endl;
std::cout << "PASSED" << std::endl;
return 0;
}

View File

@ -1,7 +1,5 @@
name: example
min_cmake_version: 3.1
language: CXX
default_build_type: debug
min_cmake_version: 2.8
modules:
- cxx:
- source: ../../../modules/cxx.cmake

View File

@ -1,9 +1,5 @@
name: example
min_cmake_version: 3.1
language:
- CXX
- C
default_build_type: debug
min_cmake_version: 2.8
modules:
- cxx:
- source: ../../../modules/cxx.cmake

View File

@ -1,9 +1,5 @@
name: example
min_cmake_version: 3.1
language:
- C
- CXX
default_build_type: debug
min_cmake_version: 2.8
modules:
- cxx:
- source: ../../../modules/cxx.cmake

View File

@ -1,7 +1,5 @@
name: example
min_cmake_version: 3.1
language: CXX
default_build_type: debug
min_cmake_version: 2.8
modules:
- cxx:
- source: ../../../modules/cxx.cmake

View File

@ -1,7 +1,5 @@
name: example
min_cmake_version: 3.1
language: Fortran
default_build_type: debug
min_cmake_version: 2.8
modules:
- fc:
- source: ../../../modules/fc.cmake

View File

@ -1,10 +1,5 @@
name: example
min_cmake_version: 3.1
language:
- Fortran
- C
- CXX
default_build_type: debug
min_cmake_version: 2.8
modules:
- fc:
- source: ../../../modules/fc.cmake

View File

@ -1,13 +1,11 @@
name: example
min_cmake_version: 3.1
language: Fortran
default_build_type: debug
min_cmake_version: 2.8
modules:
- fc:
- source: ../../../modules/fc.cmake
- default_build_paths:
- source: ../../../modules/default_build_paths.cmake
- git_info:
- source: ../../../modules/git_info/git_info.cmake
- src:
- source: ../../../modules/src.cmake
- git_info:
- source: ../../../modules/git_info/git_info.cmake

View File

@ -1,5 +1,3 @@
generate_git_info_header(${PROJECT_BINARY_DIR} git_info.h)
include_directories(${PROJECT_BINARY_DIR})
add_executable(example example.F90)

Some files were not shown because too many files have changed in this diff Show More