Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions autotest/test_makefile_flags.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
"""Tests for the user flags a generated makefile is written with.

The flag has to be set on the makefile variable it belongs to, because the
c flags were previously written from the fortran flags, which put a fortran
flag in the makefile without it being the flag the c compiler is given.

Cases:
- test_fflags_in_fflags : a fortran flag that was asked for is set on FFLAGS.
- test_cflags_in_cflags : a c flag that was asked for is set on CFLAGS.
- test_syslibs_in_ldflags : a linker flag that was asked for is set on LDFLAGS.
- test_flags_kept_apart : a flag is set only on the variable it belongs to.
"""

import pytest

from pymake.pymake_base import _create_makefile

FFLAG = "-DPYMAKE_TEST_FFLAG"
CFLAG = "-DPYMAKE_TEST_CFLAG"
SYSLIB = "-lpymaketestlib"


def _makedefaults(tmp_path, fflags, cflags, syslibs):
"""Write a makefile for a target with one fortran and one c source file."""
srcdir = tmp_path / "src"
srcdir.mkdir(parents=True)
main = srcdir / "main.f90"
main.write_text(" program main\n end\n")
util = srcdir / "util.c"
util.write_text("int util(void) { return 0; }\n")

_create_makefile(
str(tmp_path / "target"),
str(srcdir),
None,
None,
[str(main), str(util)],
False,
False,
"gfortran",
"gcc",
fflags,
cflags,
syslibs,
False,
str(tmp_path),
False,
)

return (tmp_path / "makedefaults").read_text()


def _flags(text, variable):
"""Get the flags every line setting a makefile variable is given."""
flags = []
for line in text.splitlines():
name, _, value = line.strip().partition("?=")
if name.strip() == variable:
flags += value.split()

return flags


@pytest.mark.base
def test_fflags_in_fflags(tmp_path) -> None:
"""A fortran flag that was asked for is set on FFLAGS."""
flags = _flags(_makedefaults(tmp_path, [FFLAG], [], []), "FFLAGS")

assert FFLAG in flags, f"the fortran flag is not set on FFLAGS: {flags}"


@pytest.mark.base
def test_cflags_in_cflags(tmp_path) -> None:
"""A c flag that was asked for is set on CFLAGS."""
flags = _flags(_makedefaults(tmp_path, [], [CFLAG], []), "CFLAGS")

assert CFLAG in flags, f"the c flag is not set on CFLAGS: {flags}"


@pytest.mark.base
def test_syslibs_in_ldflags(tmp_path) -> None:
"""A linker flag that was asked for is set on LDFLAGS."""
flags = _flags(_makedefaults(tmp_path, [], [], [SYSLIB]), "LDFLAGS")

assert SYSLIB in flags, f"the linker flag is not set on LDFLAGS: {flags}"


@pytest.mark.base
def test_flags_kept_apart(tmp_path) -> None:
"""A flag is set only on the makefile variable it belongs to."""
text = _makedefaults(tmp_path, [FFLAG], [CFLAG], [SYSLIB])

assert FFLAG not in _flags(text, "CFLAGS"), "the fortran flag is set on CFLAGS"
assert CFLAG not in _flags(text, "FFLAGS"), "the c flag is set on FFLAGS"
38 changes: 21 additions & 17 deletions pymake/pymake_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -847,6 +847,7 @@ def _create_makefile(
cc,
fflags,
cflags,
syslibs,
debug,
double,
sharedobject,
Expand Down Expand Up @@ -1009,6 +1010,7 @@ def _write_makedefaults(
cc,
fflags,
cflags,
syslibs,
debug,
double,
sharedobject,
Expand Down Expand Up @@ -1147,6 +1149,7 @@ def _write_makedefaults(

line = _makedefaults_syslibs(
target,
syslibs,
sharedobject,
fext,
srcfiles,
Expand Down Expand Up @@ -1200,7 +1203,7 @@ def _makedefaults_flags(
)
text += _makedefaults_c_flags(
target,
fflags,
cflags,
debug,
sharedobject,
cext,
Expand Down Expand Up @@ -1257,7 +1260,7 @@ def _makedefaults_fortran_flags(
tfflags = _get_fortran_flags(
target,
"gfortran",
[],
fflags,
debug,
double,
osname="win32",
Expand All @@ -1276,7 +1279,7 @@ def _makedefaults_fortran_flags(
tfflags = _get_fortran_flags(
target,
"gfortran",
[],
fflags,
debug,
double,
osname="linux",
Expand All @@ -1294,7 +1297,7 @@ def _makedefaults_fortran_flags(
tfflags = _get_fortran_flags(
target,
"ifort",
[],
fflags,
debug,
double,
osname="linux",
Expand All @@ -1317,7 +1320,7 @@ def _makedefaults_fortran_flags(

def _makedefaults_c_flags(
target,
fflags,
cflags,
debug,
sharedobject,
cext,
Expand Down Expand Up @@ -1345,7 +1348,7 @@ def _makedefaults_c_flags(
tcflags = _get_c_flags(
target,
"gcc",
fflags,
cflags,
debug,
srcfiles,
osname="win32",
Expand All @@ -1358,7 +1361,7 @@ def _makedefaults_c_flags(
tcflags = _get_c_flags(
target,
"clang",
fflags,
cflags,
debug,
srcfiles,
osname="win32",
Expand All @@ -1372,7 +1375,7 @@ def _makedefaults_c_flags(
tcflags = _get_c_flags(
target,
"gcc",
fflags,
cflags,
debug,
srcfiles,
osname="linux",
Expand All @@ -1385,7 +1388,7 @@ def _makedefaults_c_flags(
tcflags = _get_c_flags(
target,
"clang",
fflags,
cflags,
debug,
srcfiles,
osname="linux",
Expand All @@ -1398,7 +1401,7 @@ def _makedefaults_c_flags(
tcflags = _get_c_flags(
target,
"icc",
fflags,
cflags,
debug,
srcfiles,
osname="linux",
Expand All @@ -1415,6 +1418,7 @@ def _makedefaults_c_flags(

def _makedefaults_syslibs(
target,
syslibs,
sharedobject,
fext,
srcfiles,
Expand All @@ -1439,7 +1443,7 @@ def _makedefaults_syslibs(
target,
None,
"gcc",
[],
syslibs,
srcfiles,
osname="win32",
sharedobject=sharedobject,
Expand All @@ -1452,7 +1456,7 @@ def _makedefaults_syslibs(
target,
None,
"clang",
[],
syslibs,
srcfiles,
osname="win32",
sharedobject=sharedobject,
Expand All @@ -1467,7 +1471,7 @@ def _makedefaults_syslibs(
target,
"gfortran",
"gcc",
[],
syslibs,
srcfiles,
osname="win32",
sharedobject=sharedobject,
Expand All @@ -1484,7 +1488,7 @@ def _makedefaults_syslibs(
target,
None,
"gcc",
[],
syslibs,
srcfiles,
osname="linux",
sharedobject=sharedobject,
Expand All @@ -1497,7 +1501,7 @@ def _makedefaults_syslibs(
target,
None,
"clang",
[],
syslibs,
srcfiles,
osname="linux",
sharedobject=sharedobject,
Expand All @@ -1514,7 +1518,7 @@ def _makedefaults_syslibs(
target,
"gfortran",
"gcc",
[],
syslibs,
srcfiles,
osname="linux",
sharedobject=sharedobject,
Expand All @@ -1528,7 +1532,7 @@ def _makedefaults_syslibs(
target,
"ifort",
"icc",
[],
syslibs,
srcfiles,
osname="linux",
sharedobject=sharedobject,
Expand Down
Loading