[CMake] -fPIC and precompiled header

Axel Roebel Axel.Roebel at ircam.fr
Thu Jan 4 19:14:03 EST 2007


Hi Maik,

Thanks for the Christmas present ;-) I tried your code with gcc.
The following issues/suggestions came to my mind:

1) It seems to me (and it worked for me) that you don't need to 
have CMAKE_CURRENT_BINARY_DIR in the include path if you change
the target cflags determination into

            set(${_cflags} "-include ${CMAKE_CURRENT_BINARY_DIR}/${_header_name} -Winvalid-pch" )

which means the -include flag sees the complete path.

2) the include directory options seem to be missing in _PCH_GET_COMPILE_FLAGS 
would you not need something like

  GET_DIRECTORY_PROPERTY(DIRINC INCLUDE_DIRECTORIES )
  FOREACH(item ${DIRINC})
    LIST(APPEND ${_out_compile_flags} "${_PCH_include_prefix}${item}")
  ENDFOREACH(item)

furthermore I suppose you should replace all _compile_FLAGS variables
in this function by ${_out_compile_flags}. It works as you do it but having a macro argument
and not using it makes things really confusing.

3) What happens if an dependency of the precompiled include file changes?

YOu could run a compiler command to determine the dependencies on
configure time, but this seems not completely fool proof.
I suggest to add the following target in ADD_PRECOMPILED_HEADER

  GET_TARGET_PROPERTY(_targetType ${_PCH_current_target} TYPE)
  SET(PHC_MASTER_INCLUDE_FILE ${_input})
  CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/cmModules/PCHCheckDependencies.cxx.in ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_gchdep.cxx)
  IF(${_targetType} STREQUAL SHARED_LIBRARY)
    ADD_LIBRARY(${_targetName}_gchdep SHARED  ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_gchdep.cxx)
  ELSE(${_targetType} STREQUAL SHARED_LIBRARY)
    ADD_LIBRARY(${_targetName}_gchdep STATIC ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_gchdep.cxx)
  ENDIF(${_targetType} STREQUAL SHARED_LIBRARY)

and add ${_targetName}_gchdep as dependency to 
 ADD_CUSTOM_COMMAND(
   OUTPUT ${_output}
   COMMAND ${_command}
   DEPENDS ${_input} ${_outdir} ${CMAKE_CURRENT_BINARY_DIR}/${_name} ${_targetName}_gchdep
   )
PCHCheckDependencies.cxx.in contains just

#include "${PHC_MASTER_INCLUDE_FILE}"

int PHC_MASTER_INCLUDE_FILE_testfunction()
{
  return 0;
}

it does not take much time to compile ( for my project much less then the generation
of the precompiled headers) and as far as I can see it is the most simple way to automatically 
handle the dependencies.

4)
your test for pch support seems a bit sloppy - anything besides
GXX is  msvc ??

Anyway a big thank you for this macro

Cheers,

Axel


On Saturday 23 December 2006 11:26, Maik Beckmann wrote:
> Am Mittwoch, den 20.12.2006, 17:53 +0100 schrieb frederic heem:
> > Hi,
> > Is there a nice way to find out if a target is using -fPIC ?
> > Indeed, this information is needed for generating compiled header.
> > At the moment, a kludge is to use the following code:
> >
> >     #If the target is a shared library, add -fPIC to compile
> >     GET_TARGET_PROPERTY(_targetType ${_targetName} TYPE)
> >     IF(${_targetType} STREQUAL SHARED_LIBRARY)
> >       SET(_compile_FLAGS "${_compile_FLAGS} -fPIC")
> >     ENDIF(${_targetType} STREQUAL SHARED_LIBRARY)
> >
> > This works but is not a proper solution, one shall not know in which
> > case -fPIC is used or not.
> > Thanks,
> > Frederic Heem
>
> I ran into this problem and your solutions works like a charm.
>
> I also worked on msvc support(see attached file), but it only work if
> CMAKE_BUILD_TYPE equals "Release", since /Fd wants to add debugging
> informations and fails due to inconsitent pdb files. If someone know's
> more about this issue, please give me a hint.
>
> merry Christmas, Maik

-- 
Axel Roebel
IRCAM Analysis/Synthesis Team
Phone: ++33-1-4478 4845 | Fax: ++33-1-4478 1540


More information about the CMake mailing list