Fix build order for generated headers and sources

This changes make_lexer() so that it no longer generates a custom target
but instead attaches the generated files to an existing one (so the first
argument now is the name of an existing library or executable, and it needs
to come after the add_library/add_executable call).

The generated source is no longer listed in the project sources, as it is
added by the function. The files are generated in the build tree rather
than the source tree, and the directory is added to the include path for
the respective project as well as exported to projects linking against it.

Generated files in subdirectories are somewhat supported, but need to be
referenced with the same name as they were generated (i.e. including the
subdirectory name).

Fixes: lp:1831643
* https://bugs.launchpad.net/kicad/+bug/1831643

Fixes: lp:1832357
* https://bugs.launchpad.net/kicad/+bug/1832357

Fixes: lp:1833851
* https://bugs.launchpad.net/kicad/+bug/1833851
This commit is contained in:
Simon Richter 2019-07-03 11:08:55 +02:00 committed by Wayne Stambaugh
parent c715a22e1c
commit c8c3e1f96a
12 changed files with 89 additions and 151 deletions

View File

@ -33,35 +33,24 @@
function( make_lexer outputTarget inputFile outHeaderFile outCppFile enum )
add_custom_command(
OUTPUT ${outHeaderFile}
${outCppFile}
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${outHeaderFile}
${CMAKE_CURRENT_BINARY_DIR}/${outCppFile}
COMMAND ${CMAKE_COMMAND}
-Denum=${enum}
-DinputFile=${inputFile}
-DoutHeaderFile=${outHeaderFile}
-DoutCppFile=${outCppFile}
-DinputFile=${CMAKE_CURRENT_SOURCE_DIR}/${inputFile}
-DoutHeaderFile=${CMAKE_CURRENT_BINARY_DIR}/${outHeaderFile}
-DoutCppFile=${CMAKE_CURRENT_BINARY_DIR}/${outCppFile}
-P ${CMAKE_MODULE_PATH}/TokenList2DsnLexer.cmake
COMMENT "TokenList2DsnLexer.cmake creating:
${outHeaderFile} and
${outCppFile} from
${inputFile}"
DEPENDS ${inputFile}
)
add_custom_target( ${outputTarget}
DEPENDS ${outHeaderFile} ${outCppFile}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${inputFile}
${CMAKE_MODULE_PATH}/TokenList2DsnLexer.cmake
)
set_property( GLOBAL PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${outHeaderFile} ${outCppFile} )
# extra_args, if any, are treated as source files (typically headers) which
# are known to depend on the generated outHeader.
foreach( extra_arg ${ARGN} )
set_source_files_properties( ${extra_arg}
PROPERTIES OBJECT_DEPENDS ${outHeaderFile}
)
endforeach()
target_sources( ${outputTarget} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/${outCppFile} )
target_include_directories( ${outputTarget} PUBLIC ${CMAKE_CURRENT_BINARY_DIR} )
endfunction()

View File

@ -150,7 +150,7 @@ set( sourceFileHeader
* your DSN lexer.
*/
#include <${result}_lexer.h>
#include <${outHeaderFile}>
using namespace ${enum};

View File

@ -220,7 +220,6 @@ set( COMMON_PAGE_LAYOUT_SRCS
page_layout/ws_draw_item.cpp
page_layout/ws_proxy_undo_item.cpp
page_layout/ws_proxy_view_item.cpp
page_layout/page_layout_reader_keywords.cpp
page_layout/page_layout_reader.cpp
)
@ -312,14 +311,12 @@ set( COMMON_SRCS
languages_menu.cpp
lib_id.cpp
lib_table_base.cpp
lib_table_keywords.cpp
lib_tree_model.cpp
lib_tree_model_adapter.cpp
lockfile.cpp
marker_base.cpp
md5_hash.cpp
msgpanel.cpp
netlist_keywords.cpp
observable.cpp
prependpath.cpp
printout.cpp
@ -427,8 +424,6 @@ set( PCB_COMMON_SRCS
lset.cpp
origin_viewitem.cpp
page_info.cpp
pcb_keywords.cpp
pcb_plot_params_keywords.cpp
../pcbnew/pcb_base_frame.cpp
../pcbnew/board_commit.cpp
../pcbnew/board_connected_item.cpp
@ -502,78 +497,50 @@ target_link_libraries( pcbcommon PUBLIC
# auto-generate netlist_lexer.h and netlist_keywords.cpp
make_lexer(
netlist_lexer_source_files
${CMAKE_CURRENT_SOURCE_DIR}/netlist.keywords
${PROJECT_SOURCE_DIR}/include/netlist_lexer.h
${CMAKE_CURRENT_SOURCE_DIR}/netlist_keywords.cpp
common
netlist.keywords
netlist_lexer.h
netlist_keywords.cpp
NL_T
# Pass header file with dependency on *_lexer.h as extra_arg
${CMAKE_PROJECT_SOURCE_DIR}/pcbnew/netlist_reader.h
)
add_dependencies( common netlist_lexer_source_files )
add_dependencies( pcbcommon netlist_lexer_source_files )
# auto-generate pcb_plot_params_lexer.h and pcb_plot_params_keywords.cpp
make_lexer(
pcb_plot_lexer_source_files
${CMAKE_CURRENT_SOURCE_DIR}/pcb_plot_params.keywords
${PROJECT_SOURCE_DIR}/include/pcb_plot_params_lexer.h
${CMAKE_CURRENT_SOURCE_DIR}/pcb_plot_params_keywords.cpp
pcbcommon
pcb_plot_params.keywords
pcb_plot_params_lexer.h
pcb_plot_params_keywords.cpp
PCBPLOTPARAMS_T
# Pass header file with dependencies on *_lexer.h as extra_arg
${PROJECT_SOURCE_DIR}/pcbnew/pcb_plot_params.h
)
add_dependencies( pcbcommon pcb_plot_lexer_source_files )
# auto-generate pcbnew_sexpr.h and pcbnew_sexpr.cpp
make_lexer(
pcb_lexer_source_files
${CMAKE_CURRENT_SOURCE_DIR}/pcb.keywords
${PROJECT_SOURCE_DIR}/include/pcb_lexer.h
${CMAKE_CURRENT_SOURCE_DIR}/pcb_keywords.cpp
pcbcommon
pcb.keywords
pcb_lexer.h
pcb_keywords.cpp
PCB_KEYS_T
# Pass header file with dependency on *_lexer.h as extra_arg
${PROJECT_SOURCE_DIR}/pcbnew/pcb_parser.h
)
add_dependencies( pcbcommon pcb_lexer_source_files )
# auto-generate s-expression library table code.
make_lexer(
lib_table_lexer_source_files
${CMAKE_CURRENT_SOURCE_DIR}/lib_table.keywords
${PROJECT_SOURCE_DIR}/include/lib_table_lexer.h
${CMAKE_CURRENT_SOURCE_DIR}/lib_table_keywords.cpp
common
lib_table.keywords
lib_table_lexer.h
lib_table_keywords.cpp
LIB_TABLE_T
# These files consume *_lexer.h
${CMAKE_CURRENT_SOURCE_DIR}/fp_lib_table.cpp
${CMAKE_CURRENT_SOURCE_DIR}/lib_table_base.cpp
${PROJECT_SOURCE_DIR}/pcbnew/dialogs/panel_fp_lib_table.cpp
${PROJECT_SOURCE_DIR}/eeschema/symbol_lib_table.cpp
${PROJECT_SOURCE_DIR}/eeschema/dialogs/panel_sym_lib_table.cpp
)
add_dependencies( common lib_table_lexer_source_files )
add_dependencies( pcbcommon lib_table_lexer_source_files )
# auto-generate page layout reader s-expression page_layout_reader_lexer.h
# and title_block_reader_keywords.cpp.
make_lexer(
page_layout_lexer_source_files
${CMAKE_CURRENT_SOURCE_DIR}/page_layout/page_layout_reader.keywords
${PROJECT_SOURCE_DIR}/include/page_layout_reader_lexer.h
${CMAKE_CURRENT_SOURCE_DIR}/page_layout/page_layout_reader_keywords.cpp
common
page_layout/page_layout_reader.keywords
page_layout/page_layout_reader_lexer.h
page_layout/page_layout_reader_keywords.cpp
TB_READER_T
)
add_dependencies( common page_layout_lexer_source_files )
# This one gets made only when testing.
# to build it, first enable #define STAND_ALONE at top of dsnlexer.cpp
add_executable( dsntest EXCLUDE_FROM_ALL dsnlexer.cpp )

View File

@ -34,7 +34,7 @@
#include <ws_painter.h>
#include <ws_draw_item.h>
#include <ws_data_model.h>
#include <page_layout_reader_lexer.h>
#include <page_layout/page_layout_reader_lexer.h>
#include <wx/file.h>
#include <wx/mstream.h>

View File

@ -36,7 +36,7 @@
#include <ws_draw_item.h>
#include <ws_data_model.h>
#include <math/vector2d.h>
#include <page_layout_reader_lexer.h>
#include <page_layout/page_layout_reader_lexer.h>
#include <macros.h>
#include <convert_to_biu.h>

View File

@ -36,7 +36,6 @@ set( EESCHEMA_DLGS
dialogs/dialog_annotate_base.cpp
dialogs/dialog_bom.cpp
dialogs/dialog_bom_base.cpp
dialogs/dialog_bom_cfg_keywords.cpp
dialogs/dialog_bus_manager.cpp
dialogs/dialog_fields_editor_global.cpp
dialogs/dialog_fields_editor_global_base.cpp
@ -136,7 +135,6 @@ set( EESCHEMA_SRCS
bus-wire-junction.cpp
class_libentry.cpp
class_library.cpp
cmp_library_keywords.cpp
cmp_library_lexer.cpp
component_references_lister.cpp
connection_graph.cpp
@ -206,7 +204,6 @@ set( EESCHEMA_SRCS
symbol_tree_model_adapter.cpp
symbol_tree_synchronizing_adapter.cpp
template_fieldnames.cpp
template_fieldnames_keywords.cpp
toolbars_sch_editor.cpp
toolbars_viewlib.cpp
transform.cpp
@ -335,15 +332,24 @@ add_library( eeschema_kiface_objects OBJECT
# CMake <3.9 can't link anything to object libraries,
# but we only need include directories, as we will link the kiface MODULE
target_include_directories( eeschema_kiface_objects PRIVATE
$<TARGET_PROPERTY:common,INCLUDE_DIRECTORIES>
target_include_directories( eeschema_kiface_objects PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
$<TARGET_PROPERTY:common,INTERFACE_INCLUDE_DIRECTORIES>
)
# Since we're not using target_link_libraries, we need to explicitly
# declare the dependency
add_dependencies( eeschema_kiface_objects common )
add_library( eeschema_kiface MODULE
eeschema.cpp
$<TARGET_OBJECTS:eeschema_kiface_objects>
)
target_include_directories( eeschema_kiface PUBLIC
$<TARGET_PROPERTY:eeschema_kiface_objects,INTERFACE_INCLUDE_DIRECTORIES>
)
target_link_libraries( eeschema_kiface
common
${wxWidgets_LIBRARIES}
@ -442,39 +448,27 @@ endif()
# auto-generate cmp_library_lexer.h and cmp_library_keywords.cpp for the component
# library format.
make_lexer(
cmp_library_lexer_source_files
${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.keywords
${CMAKE_CURRENT_SOURCE_DIR}/cmp_library_lexer.h
${CMAKE_CURRENT_SOURCE_DIR}/cmp_library_keywords.cpp
eeschema_kiface_objects
cmp_library.keywords
cmp_library_lexer.h
cmp_library_keywords.cpp
TLIB_T
)
add_dependencies( eeschema_kiface cmp_library_lexer_source_files )
make_lexer(
field_template_lexer_source_files
${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames.keywords
${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames_lexer.h
${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames_keywords.cpp
eeschema_kiface_objects
template_fieldnames.keywords
template_fieldnames_lexer.h
template_fieldnames_keywords.cpp
TFIELD_T
# Pass header file with dependency on *_lexer.h as extra_arg
template_fieldnames.h
)
add_dependencies( eeschema_kiface field_template_lexer_source_files )
make_lexer(
dialog_bom_cfg_lexer_source_files
${CMAKE_CURRENT_SOURCE_DIR}/dialogs/dialog_bom_cfg.keywords
${CMAKE_CURRENT_SOURCE_DIR}/dialogs/dialog_bom_cfg_lexer.h
${CMAKE_CURRENT_SOURCE_DIR}/dialogs/dialog_bom_cfg_keywords.cpp
eeschema_kiface_objects
dialogs/dialog_bom_cfg.keywords
dialogs/dialog_bom_cfg_lexer.h
dialogs/dialog_bom_cfg_keywords.cpp
T_BOMCFG_T
# Pass header file with dependency on *_lexer.h as extra_arg
dialogs/dialog_bom_cfg.h
)
add_dependencies( eeschema_kiface dialog_bom_cfg_lexer_source_files )
add_subdirectory( plugins )

View File

@ -44,7 +44,7 @@
#include <bom_plugins.h>
#include <make_unique.h>
#include <dialog_bom_cfg_lexer.h>
#include <dialogs/dialog_bom_cfg_lexer.h>
static constexpr wxChar BOM_TRACE[] = wxT( "BOM_GENERATORS" );

View File

@ -110,7 +110,19 @@ endif( false )
#=====</on standby for possible C++ unit testing>===============================
add_library( sweet SHARED
sch_lib_table.cpp
sch_lib.cpp
sch_lpid.cpp
sch_dir_lib_source.cpp
sch_part.cpp
sch_sweet_parser.cpp
${PROJECT_SOURCE_DIR}/common/richio.cpp
${PROJECT_SOURCE_DIR}/common/dsnlexer.cpp
)
make_lexer(
sweet
${CMAKE_CURRENT_SOURCE_DIR}/sch_lib_table.keywords
${CMAKE_CURRENT_SOURCE_DIR}/sch_lib_table_lexer.h
${CMAKE_CURRENT_SOURCE_DIR}/sch_lib_table_keywords.cpp
@ -118,25 +130,13 @@ make_lexer(
)
make_lexer(
sweet
${CMAKE_CURRENT_SOURCE_DIR}/sweet.keywords
${CMAKE_CURRENT_SOURCE_DIR}/sweet_lexer.h
${CMAKE_CURRENT_SOURCE_DIR}/sweet_keywords.cpp
PR
)
add_library( sweet SHARED
sch_lib_table.cpp
sch_lib_table_keywords.cpp
sch_lib.cpp
sch_lpid.cpp
sch_dir_lib_source.cpp
sch_part.cpp
sch_sweet_parser.cpp
sweet_keywords.cpp
${PROJECT_SOURCE_DIR}/common/richio.cpp
${PROJECT_SOURCE_DIR}/common/dsnlexer.cpp
)
target_link_libraries( sweet ${wxWidgets_LIBRARIES} )
# talk to import_export.h

View File

@ -23,7 +23,6 @@ set( PCB_CALCULATOR_SRCS
via.cpp
transline_ident.cpp
UnitSelector.cpp
pcb_calculator_datafile_keywords.cpp
transline/transline.cpp
transline/c_microstrip.cpp
transline/microstrip.cpp
@ -151,14 +150,11 @@ endif()
# auto-generate pcb_calculator_datafile.h and pcb_calculator_datafile_keywords.cpp
# for the storage data file format.
make_lexer(
pcb_calculator_lexer_source_files
${CMAKE_CURRENT_SOURCE_DIR}/pcb_calculator_datafile.keywords
${CMAKE_CURRENT_SOURCE_DIR}/pcb_calculator_datafile_lexer.h
${CMAKE_CURRENT_SOURCE_DIR}/pcb_calculator_datafile_keywords.cpp
pcb_calculator_kiface
pcb_calculator_datafile.keywords
pcb_calculator_datafile_lexer.h
pcb_calculator_datafile_keywords.cpp
PCBCALC_DATA_T
# Pass header file with dependency on *_lexer.h as extra_arg
datafile_read_write.h
)
#
@ -191,5 +187,3 @@ set( DOCS_LIST
set_source_files_properties( attenuators/attenuator_classes.cpp
PROPERTIES OBJECT_DEPENDS "${DOCS_LIST}"
)
add_dependencies( pcb_calculator_kiface pcb_calculator_lexer_source_files )

View File

@ -283,7 +283,6 @@ set( PCBNEW_CLASS_SRCS
specctra_import_export/specctra.cpp
specctra_import_export/specctra_export.cpp
specctra_import_export/specctra_import.cpp
specctra_import_export/specctra_keywords.cpp
text_mod_grid_table.cpp
toolbars_footprint_editor.cpp
toolbars_footprint_viewer.cpp
@ -349,19 +348,6 @@ set( PCBNEW_SCRIPTING_PYTHON_HELPERS
swig/python_scripting.cpp
)
# auto-generate specctra_lexer.h and specctra_keywords.cpp
make_lexer(
specctra_lexer_source_files
${CMAKE_CURRENT_SOURCE_DIR}/specctra_import_export/specctra.keywords
${CMAKE_CURRENT_SOURCE_DIR}/specctra_import_export/specctra_lexer.h
${CMAKE_CURRENT_SOURCE_DIR}/specctra_import_export/specctra_keywords.cpp
DSN
# Pass header file with dependency on *_lexer.h as extra_arg
specctra_import_export/specctra.h
)
if( COMPILER_SUPPORTS_WSHADOW )
# .cpp files are compiled with extra ${WSHADOW_FLAGS}, but not .cxx files
set_source_files_properties(
@ -608,12 +594,25 @@ add_library( pcbnew_kiface_objects OBJECT
${PCBNEW_SCRIPTING_SRCS}
)
# auto-generate specctra_lexer.h and specctra_keywords.cpp
make_lexer(
pcbnew_kiface_objects
specctra_import_export/specctra.keywords
specctra_import_export/specctra_lexer.h
specctra_import_export/specctra_keywords.cpp
DSN
)
# CMake <3.9 can't link anything to object libraries,
# but we only need include directories, as we will link the kiface MODULE
target_include_directories( pcbnew_kiface_objects PRIVATE
$<TARGET_PROPERTY:common,INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:common,INTERFACE_INCLUDE_DIRECTORIES>
)
# Since we're not using target_link_libraries, we need to explicitly
# declare the dependency
add_dependencies( pcbnew_kiface_objects common )
add_library( pcbnew_kiface MODULE $<TARGET_OBJECTS:pcbnew_kiface_objects> )
set_target_properties( pcbnew_kiface PROPERTIES
@ -674,10 +673,6 @@ endif()
# if building pcbnew, then also build pcbnew_kiface if out of date.
add_dependencies( pcbnew pcbnew_kiface )
# add dependency to specctra_lexer_source_files, to force
# generation of autogenerated file
add_dependencies( pcbnew_kiface_objects specctra_lexer_source_files )
# these 2 binaries are a matched set, keep them together:
if( APPLE )
include( ${CMAKE_MODULE_PATH}/KiCadVersion.cmake )

View File

@ -33,7 +33,7 @@
#include <boost/ptr_container/ptr_set.hpp>
#include <fctsys.h>
#include "specctra_lexer.h"
#include <specctra_import_export/specctra_lexer.h>
#include <pcbnew.h>
#include <memory>

View File

@ -68,8 +68,7 @@ target_link_libraries( qa_eeschema
target_include_directories( qa_eeschema PUBLIC
# Paths for eeschema lib usage (should really be in eeschema/common
# target_include_directories and made PUBLIC)
${CMAKE_SOURCE_DIR}/eeschema
${INC_AFTER}
$<TARGET_PROPERTY:eeschema_kiface_objects,INCLUDE_DIRECTORIES>
)
# Eeschema tests, so pretend to be eeschema (for units, etc)
@ -82,4 +81,4 @@ set_source_files_properties( eeschema_test_utils.cpp PROPERTIES
COMPILE_DEFINITIONS "QA_EESCHEMA_DATA_LOCATION=(\"${CMAKE_CURRENT_SOURCE_DIR}/data\")"
)
kicad_add_boost_test( qa_eeschema eeschema )
kicad_add_boost_test( qa_eeschema eeschema )