diff --git a/autotest/test_makefile_flags.py b/autotest/test_makefile_flags.py new file mode 100644 index 0000000..3c5a545 --- /dev/null +++ b/autotest/test_makefile_flags.py @@ -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" diff --git a/pymake/pymake_base.py b/pymake/pymake_base.py index f42fb69..832d53e 100644 --- a/pymake/pymake_base.py +++ b/pymake/pymake_base.py @@ -847,6 +847,7 @@ def _create_makefile( cc, fflags, cflags, + syslibs, debug, double, sharedobject, @@ -1009,6 +1010,7 @@ def _write_makedefaults( cc, fflags, cflags, + syslibs, debug, double, sharedobject, @@ -1147,6 +1149,7 @@ def _write_makedefaults( line = _makedefaults_syslibs( target, + syslibs, sharedobject, fext, srcfiles, @@ -1200,7 +1203,7 @@ def _makedefaults_flags( ) text += _makedefaults_c_flags( target, - fflags, + cflags, debug, sharedobject, cext, @@ -1257,7 +1260,7 @@ def _makedefaults_fortran_flags( tfflags = _get_fortran_flags( target, "gfortran", - [], + fflags, debug, double, osname="win32", @@ -1276,7 +1279,7 @@ def _makedefaults_fortran_flags( tfflags = _get_fortran_flags( target, "gfortran", - [], + fflags, debug, double, osname="linux", @@ -1294,7 +1297,7 @@ def _makedefaults_fortran_flags( tfflags = _get_fortran_flags( target, "ifort", - [], + fflags, debug, double, osname="linux", @@ -1317,7 +1320,7 @@ def _makedefaults_fortran_flags( def _makedefaults_c_flags( target, - fflags, + cflags, debug, sharedobject, cext, @@ -1345,7 +1348,7 @@ def _makedefaults_c_flags( tcflags = _get_c_flags( target, "gcc", - fflags, + cflags, debug, srcfiles, osname="win32", @@ -1358,7 +1361,7 @@ def _makedefaults_c_flags( tcflags = _get_c_flags( target, "clang", - fflags, + cflags, debug, srcfiles, osname="win32", @@ -1372,7 +1375,7 @@ def _makedefaults_c_flags( tcflags = _get_c_flags( target, "gcc", - fflags, + cflags, debug, srcfiles, osname="linux", @@ -1385,7 +1388,7 @@ def _makedefaults_c_flags( tcflags = _get_c_flags( target, "clang", - fflags, + cflags, debug, srcfiles, osname="linux", @@ -1398,7 +1401,7 @@ def _makedefaults_c_flags( tcflags = _get_c_flags( target, "icc", - fflags, + cflags, debug, srcfiles, osname="linux", @@ -1415,6 +1418,7 @@ def _makedefaults_c_flags( def _makedefaults_syslibs( target, + syslibs, sharedobject, fext, srcfiles, @@ -1439,7 +1443,7 @@ def _makedefaults_syslibs( target, None, "gcc", - [], + syslibs, srcfiles, osname="win32", sharedobject=sharedobject, @@ -1452,7 +1456,7 @@ def _makedefaults_syslibs( target, None, "clang", - [], + syslibs, srcfiles, osname="win32", sharedobject=sharedobject, @@ -1467,7 +1471,7 @@ def _makedefaults_syslibs( target, "gfortran", "gcc", - [], + syslibs, srcfiles, osname="win32", sharedobject=sharedobject, @@ -1484,7 +1488,7 @@ def _makedefaults_syslibs( target, None, "gcc", - [], + syslibs, srcfiles, osname="linux", sharedobject=sharedobject, @@ -1497,7 +1501,7 @@ def _makedefaults_syslibs( target, None, "clang", - [], + syslibs, srcfiles, osname="linux", sharedobject=sharedobject, @@ -1514,7 +1518,7 @@ def _makedefaults_syslibs( target, "gfortran", "gcc", - [], + syslibs, srcfiles, osname="linux", sharedobject=sharedobject, @@ -1528,7 +1532,7 @@ def _makedefaults_syslibs( target, "ifort", "icc", - [], + syslibs, srcfiles, osname="linux", sharedobject=sharedobject,