[112836] trunk/dports/_resources/port1.0/group/cmake-1.0.tcl

Ryan Schmidt ryandesign at macports.org
Sat Nov 2 13:43:11 PDT 2013


On Nov 2, 2013, at 12:13, jeremyhu at macports.org wrote:

> Revision
> 112836
> Author
> jeremyhu at macports.org
> Date
> 2013-11-02 10:13:52 -0700 (Sat, 02 Nov 2013)
> Log Message
> 
> Improve the CMake PortGroup so that it handles the configure.*flags. (#40648)
> 
> The configure.cppflags, configure.optflags, configure.cflags, configure.cxxflags, configure.ldflags 
> are handled by setting the equivalent CMAKE_*_FLAGS.
> 
> The configure.cppflags are added to the C/C++ compiler flags as CMake does not honor separately 
> CPPFLAGS (it uses usually add_definitions() for that). The compiler flags for all build types 
> (CMAKE_C_FLAGS, CMAKE_CXX_FLAGS) are used, as they are usually empty. Cf. also to CMake upstream 
> ticket #12928 "CMake silently ignores CPPFLAGS" <​
> http://www.cmake.org/Bug/view.php?id=12928
> >.
> 
> The configure.cflags contain configure.optflags by default. Therefore, they are set via the Release 
> flags CMAKE_C_FLAGS_RELEASE, which would otherwise overrule the optimization flags, as they are set 
> by default to "-O3 -NDEBUG". Therefore, be sure to add "-NDEBUG" to the configure.cflags if you 
> want to turn off assertions in release builds!
> 
> The configure.cxxflags contain configure.optflags by default. Therefore, they are set via the 
> Release flags CMAKE_CXX_FLAGS_RELEASE, which would otherwise overrule the optimization flags, as 
> they are set by default to "-O3 -NDEBUG". Therefore, be sure to add "-NDEBUG" to the 
> configure.cflags if you want to turn off assertions in release builds!
> 
> A port author has to be aware that a CMake script can always override these flags when it runs, as 
> they are frequently set internally in function of other CMake build variables!
> 
> Attention: If the port author wants to be sure that no compiler flags are passed via configure.args 
> to CMake, he has to set manually configure.optflags to "", as it is by default "-O2" and added to 
> all language-specific flags. If he wants to prevent optimization, he should set configure.optflags 
> to "-O0".
> 
> TODO: Handle the compiler flags specific to Objective-C, Fortran, and Java in the CMake PortGroup.
> 
> Modified Paths
> 
> 	• trunk/dports/_resources/port1.0/group/cmake-1.0.tcl
> Diff
> 
> Modified: trunk/dports/_resources/port1.0/group/cmake-1.0.tcl (112835 => 112836)
> 
> --- trunk/dports/_resources/port1.0/group/cmake-1.0.tcl	2013-11-02 16:44:49 UTC (rev 112835)
> +++ trunk/dports/_resources/port1.0/group/cmake-1.0.tcl	2013-11-02 17:13:52 UTC (rev 112836)
> 
> @@ -56,6 +56,58 @@
> 
>                      -DCMAKE_FIND_FRAMEWORK=LAST \
> 
>                      -Wno-dev
> 
>  
> 
> +# Handle configure.cppflags, configure.optflags, configure.cflags,
> +# configure.cxxflags, configure.ldflags by setting the equivalent CMAKE_*_FLAGS.
> +#
> +# Be aware that a CMake script can always override these flags when it runs, as
> +# they are frequently set internally in function of other CMake build variables!
> +#
> +# Attention: If you want to be sure that no compiler flags are passed via
> +# configure.args, you have to set manually configure.optflags to "", as it is by
> +# default "-O2" and added to all language-specific flags. If you want to turn off
> +# optimization, explicitly set configue.optflags to "-O0".
> +if (${configure.cppflags} != "") {
> +    # Add the preprocessor flags to the C/C++ compiler flags as CMake does not
> +    # honor separately CPPFLAGS (it uses usually add_definitions() for that).
> +    # We use the compiler flags for all build types, as they are usually empty.
> +    # Cf. also to CMake upstream ticket #12928 "CMake silently ignores CPPFLAGS"
> +    # <
> http://www.cmake.org/Bug/view.php?id=12928
> >.
> +    configure.args-append -DCMAKE_C_FLAGS="${configure.cppflags}"
> +    configure.args-append -DCMAKE_CXX_FLAGS="${configure.cppflags}"
> +}
> +if {${configure.cflags} != ""} {
> +    # The configure.cflags contain configure.optflags by default. Therefore, we
> +    # set the Release flags, which would otherwise overrule the optimization
> +    # flags, as they are set by default to "-O3 -NDEBUG". Therefore, be sure
> +    # to add "-NDEBUG" to the configure.cflags if you want to turn off
> +    # assertions in release builds!
> +    configure.args-append -DCMAKE_C_FLAGS_RELEASE="${configure.cflags}"
> +}
> +if {${configure.cxxflags} != ""} {
> +    # The configure.cxxflags contain configure.optflags by default. Therefore,
> +    # we set the Release flags, which would otherwise overrule the optimization
> +    # flags, as they are set by default to "-O3 -NDEBUG". Therefore, be sure
> +    # to add "-NDEBUG" to the configure.cflags if you want to turn off
> +    # assertions in release builds!
> +    configure.args-append -DCMAKE_CXX_FLAGS_RELEASE="${configure.cxxflags}"
> +}
> +if {${configure.ldflags} != ""} {
> +    # CMake supports individual linker flags for executables, modules, and dlls.
> +    # By default, they are empty.
> +    configure.args-append -DCMAKE_EXE_LINKER_FLAGS="${configure.ldflags}"
> +    configure.args-append -DCMAKE_SHARED_LINKER_FLAGS="${configure.ldflags}"
> +    configure.args-append -DCMAKE_MODULE_LINKER_FLAGS="${configure.ldflags}"
> +}

This doesn’t work because portgroups are typically included at the top of the portfile, before any of these options are set. So if you have a Portfile like this…


1. PortGroup           cmake 1.0
2.
3. name                foo
4. version             1.0
5. 
6. configure.cppflags-append -I${prefix}/foo/include


…this won’t work, because the cmake portgroup has already added the default value of configure.cppflags to configure.args on line 1, before the portfile has had a chance to customize it on line 6.

For this reason a portgroup should wait to check options until a pre-phase block, in this case a pre-configure block.



More information about the macports-dev mailing list