266 lines
7.4 KiB
Plaintext
266 lines
7.4 KiB
Plaintext
|
# @license Apache-2.0
|
||
|
#
|
||
|
# Copyright (c) 2020 The Stdlib Authors.
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
|
||
|
# A `.gyp` file for building a Node.js native add-on.
|
||
|
#
|
||
|
# [1]: https://gyp.gsrc.io/docs/InputFormatReference.md
|
||
|
# [2]: https://gyp.gsrc.io/docs/UserDocumentation.md
|
||
|
{
|
||
|
# List of files to include in this file:
|
||
|
'includes': [
|
||
|
'./include.gypi',
|
||
|
],
|
||
|
|
||
|
# Define variables to be used throughout the configuration for all targets:
|
||
|
'variables': {
|
||
|
# Target name should match the add-on export name:
|
||
|
'addon_target_name%': 'addon',
|
||
|
|
||
|
# Fortran compiler (to override -Dfortran_compiler=<compiler>):
|
||
|
'fortran_compiler%': 'gfortran',
|
||
|
|
||
|
# Fortran compiler flags:
|
||
|
'fflags': [
|
||
|
# Specify the Fortran standard to which a program is expected to conform:
|
||
|
'-std=f95',
|
||
|
|
||
|
# Indicate that the layout is free-form source code:
|
||
|
'-ffree-form',
|
||
|
|
||
|
# Aggressive optimization:
|
||
|
'-O3',
|
||
|
|
||
|
# Enable commonly used warning options:
|
||
|
'-Wall',
|
||
|
|
||
|
# Warn if source code contains problematic language features:
|
||
|
'-Wextra',
|
||
|
|
||
|
# Warn if a procedure is called without an explicit interface:
|
||
|
'-Wimplicit-interface',
|
||
|
|
||
|
# Do not transform names of entities specified in Fortran source files by appending underscores (i.e., don't mangle names, thus allowing easier usage in C wrappers):
|
||
|
'-fno-underscoring',
|
||
|
|
||
|
# Warn if source code contains Fortran 95 extensions and C-language constructs:
|
||
|
'-pedantic',
|
||
|
|
||
|
# Compile but do not link (output is an object file):
|
||
|
'-c',
|
||
|
],
|
||
|
|
||
|
# Set variables based on the host OS:
|
||
|
'conditions': [
|
||
|
[
|
||
|
'OS=="win"',
|
||
|
{
|
||
|
# Define the object file suffix:
|
||
|
'obj': 'obj',
|
||
|
},
|
||
|
{
|
||
|
# Define the object file suffix:
|
||
|
'obj': 'o',
|
||
|
}
|
||
|
], # end condition (OS=="win")
|
||
|
], # end conditions
|
||
|
}, # end variables
|
||
|
|
||
|
# Define compile targets:
|
||
|
'targets': [
|
||
|
|
||
|
# Target to generate an add-on:
|
||
|
{
|
||
|
# The target name should match the add-on export name:
|
||
|
'target_name': '<(addon_target_name)',
|
||
|
|
||
|
# Define dependencies:
|
||
|
'dependencies': [],
|
||
|
|
||
|
# Define directories which contain relevant include headers:
|
||
|
'include_dirs': [
|
||
|
# Local include directory:
|
||
|
'<@(include_dirs)',
|
||
|
],
|
||
|
|
||
|
# List of source files:
|
||
|
'sources': [
|
||
|
'<@(src_files)',
|
||
|
],
|
||
|
|
||
|
# Settings which should be applied when a target's object files are used as linker input:
|
||
|
'link_settings': {
|
||
|
# Define libraries:
|
||
|
'libraries': [
|
||
|
'<@(libraries)',
|
||
|
],
|
||
|
|
||
|
# Define library directories:
|
||
|
'library_dirs': [
|
||
|
'<@(library_dirs)',
|
||
|
],
|
||
|
},
|
||
|
|
||
|
# C/C++ compiler flags:
|
||
|
'cflags': [
|
||
|
# Enable commonly used warning options:
|
||
|
'-Wall',
|
||
|
|
||
|
# Aggressive optimization:
|
||
|
'-O3',
|
||
|
],
|
||
|
|
||
|
# C specific compiler flags:
|
||
|
'cflags_c': [
|
||
|
# Specify the C standard to which a program is expected to conform:
|
||
|
'-std=c99',
|
||
|
],
|
||
|
|
||
|
# C++ specific compiler flags:
|
||
|
'cflags_cpp': [
|
||
|
# Specify the C++ standard to which a program is expected to conform:
|
||
|
'-std=c++11',
|
||
|
],
|
||
|
|
||
|
# Linker flags:
|
||
|
'ldflags': [],
|
||
|
|
||
|
# Apply conditions based on the host OS:
|
||
|
'conditions': [
|
||
|
[
|
||
|
'OS=="mac"',
|
||
|
{
|
||
|
# Linker flags:
|
||
|
'ldflags': [
|
||
|
'-undefined dynamic_lookup',
|
||
|
'-Wl,-no-pie',
|
||
|
'-Wl,-search_paths_first',
|
||
|
],
|
||
|
},
|
||
|
], # end condition (OS=="mac")
|
||
|
[
|
||
|
'OS!="win"',
|
||
|
{
|
||
|
# C/C++ flags:
|
||
|
'cflags': [
|
||
|
# Generate platform-independent code:
|
||
|
'-fPIC',
|
||
|
],
|
||
|
},
|
||
|
], # end condition (OS!="win")
|
||
|
], # end conditions
|
||
|
|
||
|
# Define custom build actions for particular inputs:
|
||
|
'rules': [
|
||
|
{
|
||
|
# Define a rule for processing Fortran files:
|
||
|
'extension': 'f',
|
||
|
|
||
|
# Define the pathnames to be used as inputs when performing processing:
|
||
|
'inputs': [
|
||
|
# Full path of the current input:
|
||
|
'<(RULE_INPUT_PATH)'
|
||
|
],
|
||
|
|
||
|
# Define the outputs produced during processing:
|
||
|
'outputs': [
|
||
|
# Store an output object file in a directory for placing intermediate results (only accessible within a single target):
|
||
|
'<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).<(obj)'
|
||
|
],
|
||
|
|
||
|
# Define the rule for compiling Fortran based on the host OS:
|
||
|
'conditions': [
|
||
|
[
|
||
|
'OS=="win"',
|
||
|
|
||
|
# Rule to compile Fortran on Windows:
|
||
|
{
|
||
|
'rule_name': 'compile_fortran_windows',
|
||
|
'message': 'Compiling Fortran file <(RULE_INPUT_PATH) on Windows...',
|
||
|
|
||
|
'process_outputs_as_sources': 0,
|
||
|
|
||
|
# Define the command-line invocation:
|
||
|
'action': [
|
||
|
'<(fortran_compiler)',
|
||
|
'<@(fflags)',
|
||
|
'<@(_inputs)',
|
||
|
'-o',
|
||
|
'<@(_outputs)',
|
||
|
],
|
||
|
},
|
||
|
|
||
|
# Rule to compile Fortran on non-Windows:
|
||
|
{
|
||
|
'rule_name': 'compile_fortran_linux',
|
||
|
'message': 'Compiling Fortran file <(RULE_INPUT_PATH) on Linux...',
|
||
|
|
||
|
'process_outputs_as_sources': 1,
|
||
|
|
||
|
# Define the command-line invocation:
|
||
|
'action': [
|
||
|
'<(fortran_compiler)',
|
||
|
'<@(fflags)',
|
||
|
'-fPIC', # generate platform-independent code
|
||
|
'<@(_inputs)',
|
||
|
'-o',
|
||
|
'<@(_outputs)',
|
||
|
],
|
||
|
}
|
||
|
], # end condition (OS=="win")
|
||
|
], # end conditions
|
||
|
}, # end rule (extension=="f")
|
||
|
], # end rules
|
||
|
}, # end target <(addon_target_name)
|
||
|
|
||
|
# Target to copy a generated add-on to a standard location:
|
||
|
{
|
||
|
'target_name': 'copy_addon',
|
||
|
|
||
|
# Declare that the output of this target is not linked:
|
||
|
'type': 'none',
|
||
|
|
||
|
# Define dependencies:
|
||
|
'dependencies': [
|
||
|
# Require that the add-on be generated before building this target:
|
||
|
'<(addon_target_name)',
|
||
|
],
|
||
|
|
||
|
# Define a list of actions:
|
||
|
'actions': [
|
||
|
{
|
||
|
'action_name': 'copy_addon',
|
||
|
'message': 'Copying addon...',
|
||
|
|
||
|
# Explicitly list the inputs in the command-line invocation below:
|
||
|
'inputs': [],
|
||
|
|
||
|
# Declare the expected outputs:
|
||
|
'outputs': [
|
||
|
'<(addon_output_dir)/<(addon_target_name).node',
|
||
|
],
|
||
|
|
||
|
# Define the command-line invocation:
|
||
|
'action': [
|
||
|
'cp',
|
||
|
'<(PRODUCT_DIR)/<(addon_target_name).node',
|
||
|
'<(addon_output_dir)/<(addon_target_name).node',
|
||
|
],
|
||
|
},
|
||
|
], # end actions
|
||
|
}, # end target copy_addon
|
||
|
], # end targets
|
||
|
}
|