[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