Skip to content

Commit 2e063a1

Browse files
hacky solution for dependency issues
1 parent 448fe3d commit 2e063a1

File tree

6 files changed

+67
-28
lines changed

6 files changed

+67
-28
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ SET (SAC2C_EXEC CACHE STRING "A path to sac2c compiler")
1111
OPTION (BUILDGENERIC "Do not use architecture specific optimisations (useful for package builds)" OFF)
1212

1313
# Check whether sac2c is operational
14+
LIST (APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake-common")
1415
INCLUDE ("cmake-common/check-sac2c.cmake")
1516
INCLUDE ("cmake-common/check-sac2c-feature-support.cmake")
1617
INCLUDE ("cmake-common/misc-macros.cmake")

src/CMakeLists.txt

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
INCLUDE ("${CMAKE_SOURCE_DIR}/cmake-common/sac2c-variables.cmake")
22
INCLUDE ("${CMAKE_SOURCE_DIR}/cmake-common/generate-sac2c-dependency-targets.cmake")
33

4+
ADD_CUSTOM_TARGET (${TARGET}-all-modules ALL)
5+
46
# C files
57
SET (C_DEPS_SRC
68
src/JSON/json_builder.c
@@ -18,14 +20,12 @@ SET (SAC_SRC
1820
YAMLEmit.sac
1921
YAMLEmitter.sac
2022
)
21-
2223
# For every C source, compile an object file maintaining the right
2324
# location in the binary directory so that SaC can pick it up
2425
FOREACH (name ${C_DEPS_SRC})
2526
SET (src "${CMAKE_CURRENT_SOURCE_DIR}/${name}")
2627

2728
GET_FILENAME_COMPONENT (dir ${name} DIRECTORY)
28-
2929
GET_FILENAME_COMPONENT (dst ${name} NAME_WE)
3030
SET (dst "${CMAKE_CURRENT_BINARY_DIR}/${dir}/${dst}${OBJEXT}")
3131

@@ -36,14 +36,31 @@ FOREACH (name ${C_DEPS_SRC})
3636
OUTPUT "${dst}"
3737
MAIN_DEPENDENCY "${src}"
3838
IMPLICIT_DEPENDS C "${src}"
39-
COMMAND ${SAC2C} -v0 -noprelude -cc ccmod -o "${dst}" "${src}"
39+
COMMAND
40+
${SAC2C} -Xp -I${CMAKE_CURRENT_SOURCE_DIR}/${dir}
41+
-Xp -I${CMAKE_CURRENT_BINARY_DIR}/${dir}
42+
${SAC2C_CC_FLAGS}
43+
-v0 -noprelude -cc ccrmod -o "${dst}" "${src}"
4044
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${dir}"
41-
COMMENT "Generating ${dst} from ${src}")
45+
COMMENT "Generating ${dst} from ${src} for target ${TARGET}")
4246
ENDFOREACH ()
4347

4448
# Make a directory for sac2c output
4549
FILE (MAKE_DIRECTORY "${DLL_BUILD_DIR}/${TARGET_ENV}/${SBI}")
4650

51+
# This functions tries to match a module name with its stored path information
52+
# in a list. It returns on the first result, or returns empty.
53+
FUNCTION (MATCH_NAME_IN_LIST list name ret)
54+
MESSAGE (DEBUG "Searching for ${name} in list")
55+
FOREACH (item ${list})
56+
IF ("${item}" MATCHES "${name}\.(sac|xsac)")
57+
MESSAGE (DEBUG "Found a match: ${item}")
58+
SET (${ret} ${item} PARENT_SCOPE)
59+
BREAK ()
60+
ENDIF ()
61+
ENDFOREACH ()
62+
ENDFUNCTION ()
63+
4764
# For every SaC file, compile Tree and Mod files.
4865
FOREACH (name ${SAC_SRC})
4966
SET (src "${CMAKE_CURRENT_SOURCE_DIR}/${name}")
@@ -54,21 +71,42 @@ FOREACH (name ${SAC_SRC})
5471
SET (mod "${DLL_BUILD_DIR}/${TARGET_ENV}/${SBI}/lib${dst}Mod${VARIANT}${MODEXT}")
5572
SET (tree "${DLL_BUILD_DIR}/tree/${TARGET_ENV}/${SBI}/lib${dst}Tree${VARIANT}${TREE_DLLEXT}")
5673

57-
RESOLVE_SAC_DEPS_AS_TARGETS ("${name}" "<TARGET>-module-<NAME>" target_list object_list source_list)
58-
LIST (APPEND deps_list ${target_list} ${object_list} ${source_list})
59-
MESSAGE (STATUS "Dependencies of ${name} are: ${deps_list}")
74+
RESOLVE_SAC_DEPS_AS_TARGETS ("${name}" "<TARGET>-module-<NAME>" target_list obj_list src_list)
75+
MESSAGE (DEBUG "Targets ${name}: ${target_list}")
76+
MESSAGE (DEBUG "Objects ${name}: ${obj_list}")
77+
MESSAGE (DEBUG "Sources ${name}: ${src_list}")
78+
MESSAGE (STATUS "Computing dependencies of ${name}")
79+
80+
SET (src_deps)
81+
FOREACH (src_name ${src_list})
82+
MESSAGE (DEBUG "Searching for ${src_name} in source path list")
83+
MATCH_NAME_IN_LIST ("${SAC_SRC}" "${src_name}" src_path)
84+
IF (src_path)
85+
LIST (APPEND src_deps "${CMAKE_CURRENT_SOURCE_DIR}/${src_path}")
86+
ELSE ()
87+
MESSAGE (STATUS "Unable to find path to ${src_name} in sources")
88+
ENDIF ()
89+
ENDFOREACH ()
90+
LIST (APPEND deps_list ${src_deps} ${obj_list} ${target_list})
91+
UNSET (src_deps)
92+
UNSET (src_list)
93+
UNSET (obj_list)
6094
UNSET (target_list)
61-
UNSET (object_list)
62-
UNSET (source_list)
95+
MESSAGE (STATUS "Dependencies of ${name} are: ${deps_list}")
96+
# The current system cannot find Stdlib files. This is a really ugly solution:
97+
# we manually remove known Stdlib dependencies, and assume they exist.
98+
# I don't know how to fix this...
99+
LIST(FILTER deps_list EXCLUDE REGEX ".*(String|TermFile|Terminal|World)")
63100

64101
# Make sure that we have the directory we are changing to.
65102
FILE (MAKE_DIRECTORY "${dir}")
66103

67104
ADD_CUSTOM_TARGET (${TARGET}-module-${dst} DEPENDS "${mod}" "${tree}")
105+
ADD_DEPENDENCIES (${TARGET}-all-modules ${TARGET}-module-${dst})
68106

69107
ADD_CUSTOM_COMMAND (
70108
OUTPUT ${mod} ${tree}
71-
COMMAND ${SAC2C} -v0 -o ${DLL_BUILD_DIR} "${src}"
109+
COMMAND ${SAC2C} -v0 ${SAC2C_CC_FLAGS} -o ${DLL_BUILD_DIR} "${src}"
72110
WORKING_DIRECTORY "${dir}"
73111
MAIN_DEPENDENCY "${src}"
74112
DEPENDS ${deps_list}

src/YAMLEmit.sac

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ external objdef YAMLEmit YAMLEmitObj;
1414
external YAMLEmitter createYAMLEmitter( TermFile &stream);
1515
#pragma effect YAMLEmitObj, TheTerminal
1616
#pragma linkname "yaml_create_emitter"
17-
#pragma linkobj "src/YAMLEmit/yaml_emit.o"
17+
#pragma linkobj "src/YAML/yaml_emit.o"
1818
#pragma linksign [0,1]
1919

2020
/*
@@ -24,49 +24,49 @@ external YAMLEmitter createYAMLEmitter( TermFile &stream);
2424
external void openYAMLStream( YAMLEmitter& emitter);
2525
#pragma effect YAMLEmitObj, TheTerminal
2626
#pragma linkname "yaml_stream_begin"
27-
#pragma linkobj "src/YAMLEmit/yaml_emit.o"
27+
#pragma linkobj "src/YAML/yaml_emit.o"
2828
#pragma linksign [1]
2929

3030
external void closeYAMLStream( YAMLEmitter& emitter);
3131
#pragma effect YAMLEmitObj, TheTerminal
3232
#pragma linkname "yaml_stream_end"
33-
#pragma linkobj "src/YAMLEmit/yaml_emit.o"
33+
#pragma linkobj "src/YAML/yaml_emit.o"
3434
#pragma linksign [1]
3535

3636
external void openYAMLDoc( YAMLEmitter& emitter);
3737
#pragma effect YAMLEmitObj, TheTerminal
3838
#pragma linkname "yaml_doc_begin"
39-
#pragma linkobj "src/YAMLEmit/yaml_emit.o"
39+
#pragma linkobj "src/YAML/yaml_emit.o"
4040
#pragma linksign [1]
4141

4242
external void closeYAMLDoc( YAMLEmitter& emitter);
4343
#pragma effect YAMLEmitObj, TheTerminal
4444
#pragma linkname "yaml_doc_end"
45-
#pragma linkobj "src/YAMLEmit/yaml_emit.o"
45+
#pragma linkobj "src/YAML/yaml_emit.o"
4646
#pragma linksign [1]
4747

4848
external void openYAMLMap( YAMLEmitter& emitter);
4949
#pragma effect YAMLEmitObj, TheTerminal
5050
#pragma linkname "yaml_map_begin"
51-
#pragma linkobj "src/YAMLEmit/yaml_emit.o"
51+
#pragma linkobj "src/YAML/yaml_emit.o"
5252
#pragma linksign [1]
5353

5454
external void closeYAMLMap( YAMLEmitter& emitter);
5555
#pragma effect YAMLEmitObj, TheTerminal
5656
#pragma linkname "yaml_map_end"
57-
#pragma linkobj "src/YAMLEmit/yaml_emit.o"
57+
#pragma linkobj "src/YAML/yaml_emit.o"
5858
#pragma linksign [1]
5959

6060
external void openYAMLSeq( YAMLEmitter& emitter);
6161
#pragma effect YAMLEmitObj, TheTerminal
6262
#pragma linkname "yaml_seq_begin"
63-
#pragma linkobj "src/YAMLEmit/yaml_emit.o"
63+
#pragma linkobj "src/YAML/yaml_emit.o"
6464
#pragma linksign [1]
6565

6666
external void closeYAMLSeq( YAMLEmitter& emitter);
6767
#pragma effect YAMLEmitObj, TheTerminal
6868
#pragma linkname "yaml_seq_end"
69-
#pragma linkobj "src/YAMLEmit/yaml_emit.o"
69+
#pragma linkobj "src/YAML/yaml_emit.o"
7070
#pragma linksign [1]
7171

7272
/*
@@ -76,23 +76,23 @@ external void closeYAMLSeq( YAMLEmitter& emitter);
7676
external void YAMLEmit( YAMLEmitter& emitter, string value);
7777
#pragma effect YAMLEmitObj, TheTerminal
7878
#pragma linkname "yaml_value_str"
79-
#pragma linkobj "src/YAMLEmit/yaml_emit.o"
79+
#pragma linkobj "src/YAML/yaml_emit.o"
8080
#pragma linksign [1,2]
8181

8282
external void YAMLEmit( YAMLEmitter& emitter, int value);
8383
#pragma effect YAMLEmitObj, TheTerminal
8484
#pragma linkname "yaml_value_int"
85-
#pragma linkobj "src/YAMLEmit/yaml_emit.o"
85+
#pragma linkobj "src/YAML/yaml_emit.o"
8686
#pragma linksign [1,2]
8787

8888
external void YAMLEmit( YAMLEmitter& emitter, float value);
8989
#pragma effect YAMLEmitObj, TheTerminal
9090
#pragma linkname "yaml_value_float"
91-
#pragma linkobj "src/YAMLEmit/yaml_emit.o"
91+
#pragma linkobj "src/YAML/yaml_emit.o"
9292
#pragma linksign [1,2]
9393

9494
external void YAMLEmitFormat( YAMLEmitter& emitter, string format, ...);
9595
#pragma effect YAMLEmitObj, TheTerminal
9696
#pragma linkname "yaml_valuef_str"
97-
#pragma linkobj "src/YAMLEmit/yaml_emit.o"
97+
#pragma linkobj "src/YAML/yaml_emit.o"
9898
#pragma linksign [1,2]

src/YAMLEmitter.sac

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
class YAMLEmitter;
22

3-
export all;
4-
53
external classtype;
64
#pragma freefun "free_emitter"
7-
#pragma linkobj "src/YAMLEmitter/yaml_emitter.o"
5+
#pragma linkobj "src/YAML/yaml_emitter.o"
6+
7+
export all;

src/src/JSON/json_builder.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include <stdio.h>
44
#include <string.h>
55
#include "sac.h"
6-
#include "../include/sac_cjson.h"
6+
#include "sac_cjson.h"
77

88
// Creation
99
static SAC_cJSON * make_sac_cjson_object( cJSON * object)

src/src/JSON/json_object.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include <cJSON.h>
22
#include "sac.h"
3-
#include "../include/sac_cjson.h"
3+
#include "sac_cjson.h"
44

55
void delete_json_object( SAC_cJSON * object)
66
{

0 commit comments

Comments
 (0)